Day1,2
DDL(數據定義語言)語法 alter drop最底層的數據庫語言 直接聯系到數據庫的結構
DDL((Data Definition Language),用於定義/修改/刪除數據對象(如表)的數據結構,或者說,DDL語言操作的對象是數據庫中的對象而非對象所包含的數據。
DDL包含以下語句:
- CREATE : 在數據庫中創建新的數據對象
- ALTER : 修改數據庫中對象的數據結構
- DROP : 刪除數據庫中的對象
- DISABLE/ENABLE TRIGGER : 修改觸發器的狀態
- UPDATE STATISTIC : 更新表/視圖統計信息
- TRUNCATE TABLE : 清空表中數據
- COMMENT : 給數據對象添加注釋
- RENAME : 更改數據對象名稱
DML數據操作語言
Delete和Trancat
Trancat table 表示刪除表格中所有數據,表結構還存在,但不會計入數據庫日志。
屬於DDL (數據定義語言) 大刀闊斧的改的
DCL: 授權語句:grant 權限 to user 。 remove 權限 from
TCL(Transaction Control Language)用來對事務進行管理。
TCL包含以下語句:
- COMMIT : 保存已完成事務動作結果
- SAVEPOINT : 保存事務相關數據和狀態用以可能的回滾操作
- ROLLBACK : 恢復事務相關數據至上一次COMMIT操作之后
- SET TRANSACTION : 設置事務選項
CREATE TABLE 表名字
列名 INT(20) NOT NULL,PRIMARY KEY
建議脫離圖形化界面數據庫建模
進行修改
修改部門編號為50的部門所在地為北京
SQL中when case 的使用方法
Select xxxxx(
Case when 條件 then ‘起的名字1’
Case when 條件 then ‘起的名字2’
Case when 條件 then ‘起的名字3’
ELSE ‘異常’ END)
AS 給起的名字的所有給一個列名字
From XXXX
Group BY 的作用
Where語句和having語句有什么區別
where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
having 子句的作用是篩選滿足條件的組,即在分組之后過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標准進行分組。一般來說where在having前面
Select from where group by having.
Mysql多表聯查
內連接 select * from emp inner join dept on emp.deptno=dept.deptno
不符合條件的記錄不會出現在結果集里面
外連接:主表的記錄一定會出現在結果里 例如right join時 右邊的表為主表
外連接:當出現“不符合什么條件時,需要顯示出數據”這種語句,即用外連接
Join的用法
子查詢
使用in 和 exists
Exists返回的是一個ture和false的Boolean型的數據 但是依然要和exists內部的條件進行匹配
按照順序排列
查詢出 教學部 年齡大於20歲,並且工資小於40000的員工,按工資倒序排列.(要求:分別使用多表聯合查詢和內連接查詢)
SELECT * FROM person p1 INNER JOIN dept d2 ON p1.did= d2.did
and d2.dname='python'
and age>20
and salary <40000
ORDER BY salary DESC; //排序按照倒序排列 大到小
ORDER BY salary ASC; //排序按照升序排列 小到大
列出所有員工的姓名及其直接上級的姓名,將沒有上級的員工的上級處寫為boss
Select e.name//員工的字段,if null(m.ename//上級的字段,’BOSS’) from emp e//主表為員工 left join emp m on e.mgr=m.empno;
補充:IFNULL(expr1,’eeee’)
如果expr1不是NULL,返回expr1,否則它返回expr2。
IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>0且expr1<>NULL),那么IF()返回expr2,否則它返回expr3。
SQL中distinct的用法
在表中,可能會包含重復值。這並不成問題,不過,有時您也許希望僅僅列出不同(distinct)的值。關鍵詞 distinct用於返回唯一不同的值。
若想要查詢多列比如說 select distinct name,nickname,department from photos
是將三列完全相同的內容過濾掉,但凡是有一列有所不同,均會列出來,而且只是列出不同的。
但是不能把distinct放在后面,如select nickname,department,distinct name from photos;報錯,distinct必須放在開頭。將distinct放到where里,也是報錯。
Day3
在數據庫設計中 的概念設計階段中 這里的ER圖中沒有必要把root管理員和實體的聯系都全部寫出來
數據設計的詳細步驟:
1、需求分析:分析系統功能,畫出系統用例圖和模塊圖。
2、找到每個功能的實體、屬性及關系(要按照數據庫范式去划分實體屬性范圍,同時按照數據完整性要求使用各種約束條件)
3、繪制出E-R圖
4、根據E-R圖畫出關系表圖(遵循的規則:一個實體就是一個表格,關系的轉換:一對一關系,把其中任何一方主鍵放到另一方作為外鍵,一對多關系,把一方主鍵放到多方做外鍵,多對多關系:重新創建第三張表格,把兩方的主鍵放到多方作為外鍵)
5、根據關系表圖寫sql指令創建出表格 。
Oracle數據庫 沒有自增的選項
面試題:什么是第一二三范式
范式:英文名稱是 Normal Form,它是英國人 E.F.Codd(關系數據庫的老祖宗)在上個世紀70年代提出關系數據庫模型后總結出來的,范式是關系數據庫理論的基礎,也是我們在設計數據庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三個范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就簡單介紹下這三個范式。
◆ 第一范式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。
考慮這樣一個表:【聯系人】(姓名,性別,電話)
如果在實際場景中,一個聯系人有家庭電話和公司電話,那么這種表結構設計就沒有達到 1NF。要符合 1NF 我們只需把列(電話)拆分,即:【聯系人】(姓名,性別,家庭電話,公司電話)。1NF 很好辨別,但是 2NF 和 3NF 就容易搞混淆。
◆ 第二范式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。
考慮一個訂單明細表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因為我們知道在一個訂單中可以訂購多種產品,所以單單一個 OrderID 是不足以成為主鍵的,主鍵應該是(OrderID,ProductID)。顯而易見 Discount(折扣),Quantity(數量)完全依賴(取決)於主鍵(OderID,ProductID),而 UnitPrice,ProductName 只依賴於 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的設計容易產生冗余數據。
可以把【OrderDetail】表拆分為【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)來消除原訂單表中UnitPrice,ProductName多次重復的情況。
◆ 第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 A 依賴於非主鍵列 B,非主鍵列 B 依賴於主鍵的情況。
考慮一個訂單表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主鍵是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主鍵列都完全依賴於主鍵(OrderID),所以符合 2NF。不過問題是 CustomerName,CustomerAddr,CustomerCity 直接依賴的是 CustomerID(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3NF。
通過拆分【Order】為【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)從而達到 3NF。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,區分它們的關鍵點在於,2NF:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3NF:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。
保證數據的完整性
數據的完整性有四種分類
實體完整性
域完整性
參照完整性(引用完整性)
自定義完整性
約束的類型 格式的約束
在sql語句中進行check 約束 在sql的5.7版本無效
外鍵約束 兩個表由外鍵統一管理非滿足外鍵要求的是無法添加的
Mysql中日期操作
MySQL 為日期增加一個時間間隔:date_add():select date_add(@dt, interval 1 day);
MySQL 為日期減去一個時間間隔:date_sub():select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
MySQL 日期、時間相減函數:datediff(date1,date2), timediff(time1,time2):MySQL datediff(date1,date2):兩個日期相減 date1 - date2,返回天數。
select datediff('2008-08-08', '2008-08-01');
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00');
Day4
服務器tomcat可以隨時接受來自於外部的請求HttpServletRequest 所有的外部的請求都要這樣做
BS架構:瀏覽器與服務器架構 瀏覽器發出請求向服務器在服務器中找到servlet(在本次的項目中不涉及使用框架)進行處理數據
CS架構:客戶端與服務器架構
傳遞method為post 能傳輸大量數據且不在地址欄里顯示出
傳遞method為get 傳遞的數據會在地址欄顯示出
css中的選擇器通過id進行選擇
#id的名字{
更改的樣式
}
Css中的就近原則,哪個css選擇器離被修改的主體越近就哪個管用
Id選擇器>標簽選擇器(比如*)>
偽類選擇器: a:active{
Color:red;
}
jQuery的選擇器$(“#myimg”).click(function(){})
這一段的注解的意思是選擇到id為myimg的div,觸發click事件,並且在事件內部調用函數(內部功能沒有寫)
DOM模型
一、文檔對象模型
DOM( Document Object Model)文檔對象模型,它提供了訪問、動態修改文檔的借口,W3C指定了DOM規范,主流瀏覽器都支持。DOM由3部分組成,分別是CoreDom、XML DOM和HTML DOM。
1、Core DOM:也稱核心DOM變成,定義了一套標准的針對任何結構化文檔的對象,包括HTML、XHTML和XML。
2、XML DOM:定義了一套標准的針對XML文檔的對象。
3、HTML DOM:定義了一套標准的針對HTML文檔的對象。
二、認識DOM節點樹。
三、訪問DOM結點
1.使用getElement系列方法訪問指定節點。
(1)getElementById():返回對擁有指定id的對一個對象的引用。
(2).getElementsByName():返回帶有指定名稱的對象的集合。
(3)getElementsByTagName():返回帶有指定標簽名的對象的集合
- 使用層次關系訪問結點
(1)訪問根節點:
有兩種特殊的文檔屬性可用來訪問根節點:
document.documentElement:第一個屬性可返回存在於 XML 以及 HTML 文檔中的文檔根節點。
document.body:第二個屬性是對 HTML 頁面的特殊擴展,提供了對 <body> 標簽的直接訪問。
(2)訪問父節點
parentNode:返回節點的父節點。
(3)訪問兄弟節點
firstChild:返回節點的首個子節點。如果元素沒有子節點則返回null。文本和屬性節點沒有子節點。如果是firefox瀏覽器會將空標簽算在內。IE瀏覽器不計算空標簽。
lastChild:返回節點的最后一個字節點,同 firstChild。 如果是firefox瀏覽器會將空標簽算在內。IE瀏覽器不計算空標簽。
通過dom模型使用js代碼控制html頁面
添加子節點是
Document.body.appendChild
p.appendChild();
appendChild是添加子節點的意思,前面的相當於路徑
Day5
Js代碼中的執行順序是自上而下的 沒有邏輯規則
jQuery中
$(‘’) 這個的意思是選擇符和ajax是一樣的
#btn5 找id為btn5的
.mini 找類class為mini的
Body>div 找body里的直接子元素div
.one+class 找class為one的下一個div元素
.one~class 找class為one的所有div兄弟元素
jQuery的還是寫在script中 在head內部
一個js的表單驗證(加粗部分)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head> <title>表單提交</title> </head>
<body>
<p align="center"><b>表單提交</b><br></p>
<center>
<div align="left">
<table height="60" border="0" align="left">
<tr>
<td> <form name="channelform" action="addChannel.jsp" onsubmit="return validate_channel_info(this);" method="post"> 名字:
<input type="text" name="channelname" /> <br /> ID: <input type="text" name="channelid" /> <br /> <input type="submit" value="提交"> </form> </td> </tr> </table>
<script type="text/javascript"> function validate_channel_info(channelform) { if(channelform.channelname.value=="") { alert("請輸入正確的名字"); return false; } else if(!isNumber(channelform.channelid.value)) { alert("請輸入合法ID"); return false; } return true; } function isNumber(str) // 判斷是否為非負整數 { var rx = /^[0-9]+$/; return rx.test(str); } </script> </div> </center> </body> </html>
Servlet的入門
Servlet是一個在服務器上運行的小程序,是一個java的類,通過“請求-響應”的編程模式來訪問服務器上的servlet
Servlet的運行步驟:第一步servlet的init初始化;第二步加載servlet的service;第三步加載別的方法例如doget dopost 但是init只有一次,沒有第二次;第四步直接destory摧毀這個servlet
編寫 servlet
A.繼承 HTTPServlet,在創建時,直接指定父類
B.重寫 doGet() 或者 doPost() 方法,右擊 ->source->override
C.在 web.xml 中注冊 Servlet
注意: 在使用 myeclipse2017 時,新建的 web 項目沒有 web.xml 文件,
解決:在新建項目之后,填寫完項目名,不要點 finish 要點 next,然后選中創建 web.xml 文件
使用 myeclipse 編寫 servlet
1.src->new->servlet
2.重寫 doGet()doPost()
3.部署運行
這個里面得web.xml需要重新在里面添加代碼,因為servlet啟動時候會自動加載某些servlet
代碼如下:<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
Dopost和doget是一樣的 都是相同的注解文檔
Day6(week2)
項目名字一般為小寫
bootstrap移動端優先
Bootstrap通過柵格系統進行提供了一套流式柵格系統
Bootstrap 提供了一套響應式、移動設備優先的流式柵格系統,隨着屏幕或視口(viewport)尺寸的增加,系統會自動分為最多12列。它包含了易於使用的預定義類,還有強大的mixin 用於生成更具語義的布局。
柵格的參數信息
Bootstrap主要運用在跨平台上,響應式布局,隨着設備的變化而變化
每次在使用前都需要將bootstrap的核心文件進行下載
可使用以下代碼下載核心css文件:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
要在<body>最后使用上jQuery的功能,那就要加上:
<script
src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加載 Bootstrap 的所有 JavaScript 插件。你也可以根據需要只加載單個插件。 -->
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
Bootstrap的head中要加成——> <head lang=”en”>
對於這個bootstrap不明白的 就在這個網去找,bootstrap的全局CSS樣式
https://v3.bootcss.com/css/#grid-example-fluid
出現404的原因有哪些
HTTP Status 404(The requested resource is not available)異常主要是路徑錯誤或拼寫錯誤造成的,可按以下步驟逐一排查:
1.未部署Web應用
2.URL輸入錯誤 a.查看URL的IP地址和端口號是否書寫正確。 b.查看上下文路徑是否正確 Project--------Properties------MyElipse-----Web----- Web Context-root檢查這個路徑名稱是否書寫正確。 c.檢查一下文件名稱是否書寫正確。
3.目錄不能被引用 在 Eclipse的“包資源管理器(Package Explorer)”檢查文件存放的位置。由於META-INF WEB-INF文件夾下的內容無法對外發布,所以,如果你引用了帶這兩個目錄的文件,肯定是不允許。 例如: http://localhost:8080/guestbook/WEB-INF/index.html就是錯誤的,文件位置存放錯誤
4. Tomcat服務器中web.xml中的問題 如果你的web應用程序有多個jsp頁面的話,當你點擊你web應用程序的虛擬根目錄時可能會出現404錯 誤,只是你只需要修改Tomcat服務器中web.xml listings false(將其該為true)
舉例:
Xml中默認的是
修改后的為
5.WEB-INF下面必須要有幾個固定的文件夾和文件 web.xml 該web app的配置文件 lib 該web app用到的庫文件 classes存放編譯好的servlet 請注意他們的名字,我曾經就由於把classes寫成class,查錯查了半宿還沒解決,所以寫這些的時候千萬要仔細,否則浪費更多的精力去查錯。
6. 如果要運行的不是.jsp文件,而是servlet(.class)文件,要配置web.xml(當然是WEB-INF下面的),加上以下字段: HelloWorldServlet HelloWorldServlet HelloWorldServlet /HelloWorldServlet 其中的“HelloWorldServlet”改為你要運行的文件名
7.其他解決思路 以上方法無果,介於"HTTP Status 404(The requested resource is not available"異常發生情況的多樣性,采用替換大法: 步驟: a.找一份正常的相同環境(找同學同事相同開發環境機子或者網上下載的正常demo等) b.依次替換問題項目文件,進行排除,定位.直到解決.
外置傳入的Jar包放置在webcontent的WEB-INF的lib中
然而,xml的配置文件直接放在WEB-INF中
編寫一個驗證碼小程序的思路大致
生成N位純文字,將所有文字包含入數組內部,從而形成一個隨機碼,循環6次得到一個隨機文字,保存在session內部,把字符串按照圖片的形式顯示出
請求轉發://請求轉發
/*if(result) {
request.getRequestDispatcher("index.jsp").forward(request, response);
}*/
重定向:response.sendRedirect("/dcp2019/index.jsp");
請求轉發和重定向區別總結
l 請求轉發是一次請求一次響應,而重定向是兩次請求兩次響應。
l 請求轉發地址欄不會變化的,重定向地址欄發生變化。
l 請求轉發路徑不帶工程名,重定向需要帶工程名路徑。
l 請求轉發只能在本網站內部,重定向可以定向到任何網站。
使用kapkaptcha 介紹
kaptcha 是一個非常實用的驗證碼生成工具。有了它,你可以生成各種樣式的驗證碼,因它是可配置的。kaptcha工作的原理是調用 com.google.code.kaptcha.servlet.KaptchaServlet,生成一個圖片。同時將生成的驗證碼字符串放到 HttpSession中。
使用kaptcha可以方便的配置:驗證碼的字體、驗證碼字體的大小、驗證碼字體的字體顏色、驗證碼內容的范圍(數字,字母,中文漢字!)、驗證碼圖片的大小,邊框,邊框粗細,邊框顏色、驗證碼的干擾線(可以自己繼承com.google.code.kaptcha.NoiseProducer寫一個自定義的干擾線)、驗證碼的樣式(魚眼樣式、3D、普通模糊……當然也可以繼承com.google.code.kaptcha.GimpyEngine自定義樣式)、……
servlet使用方式
1建立一個web項目,導入 kaptcha-2.3.2.jar到環境變量中;
2.配置web.xml增加servlet
<servlet> <servlet-name>Kaptcha</servlet-name> <servlet-class> com.google.code.kaptcha.servlet.KaptchaServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>Kaptcha</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping> |
3在jsp頁面中
<form action="submit.action" method="post"> <img src="kaptcha.jpg" id="kaptchaImage" /> <input type="text" name="kaptcha" value="" /> <input type="submit" name="submit" value="submit" /> </form> |
其中src="kaptcha.jpg"會被定位到servlet上
4、KaptchaServlet會把驗證碼設置到session中,可以如下方式獲取
String kaptchaExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); |
5、如果想設置點擊圖片更換驗證碼,可以加上如下js,需要jquery
<script type="text/javascript"> $(function(){ $('#kaptchaImage').click(function () { $(this).attr('src', '/kaptcha.jpg?' + Math.floor(Math.random()*100) ); }) }); </script> |
其他
如果想更改驗證碼的其他特性,具體使用方式請自行查找資料。這里不做過多介紹。
Spring MVC 整合 Kaptcha:https://www.jianshu.com/p/a3525990cd82
Day7
Servlet中不要在類中定義全局變量
session的整個過程
在session中存貯數據
在session中提取數據(session屬性的類型為string類型不需要雙引號)
創建session對話
HttpSession session = request.getSession(ture);//ture的含義是如果session創建了就拿來用,沒有創建的話,就創建一手
session的銷毀
Session超時失效
Jsp的簡介
<%int a=2; %>這里的a是局部變量
<%! int a=2; %>這里的a是全局變量
Jsp開發的效率並不比servlet的開發效率低
JSTL:是一些標簽,實質性是java代碼的標簽,盡可能的減少java語句和html語句的嵌套,可以使用類似於html的標簽去代替一定的代碼
比如這個<aa>可代表
JSTL使用步驟:1.使用taglib指令指定標記庫的URI和前綴
out.jsp 和system.out.println 相同的效果
Value=”${useName}”的$符號直接獲得username的值
If的jstl的語法
Choose when的語法規范
Foreach的語法規范,一般來說遍歷數組用來
JSP的九個內置對象:
這九個內置對象
- request:請求(封裝客戶端請求信息,頁面刷新一次就是一次新的請求)
Request.getParameter()//獲取客戶端參數
Request.setAttribute() //設置request的范圍屬性,數據傳遞,設置值
Request.getCookies() //設置自動登錄使用,需要用到cookies
Request.getSession() //獲取session的對象
- Session:會話(每個用戶有自己的session)
session.setAttribute(“name”,value)//session賦值
Session.getAttribute()//取值
與Request.setAttribute()的區別
Request請求的開始與結束,一次請求
setMaxInactiveIntereval() //設置session的最大生命時間
默認的session生命周期為30min,30min內無反應,則關閉
- Application
服務器級別的,而且全局有且僅有一個,
生命周期與tomcat的相同,類似於集合,多應用。使用情形:統計在線人數(上線+1,下線-1)
- Response
服務器對客戶端的響應
Response.sendRedirect(“url”) //重定向
Response.addcookies() //添加cookies
- Config
config 對象的主要作用是取得服務器的配置信息。通過 pageConext對象的 getServletConfig() 方法可以獲取一個config對象。當一個Servlet 初始化時,容器把某些信息通過 config對象傳遞給這個 Servlet。 開發者可以在web.xml 文件中為應用程序環境中的Servlet程序和JSP頁面提供初始化參數。
- Exception
在Java程序中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 對象,並把 exception 對象傳送到在page指令中設定的錯誤頁面中,然后在錯誤頁面中處理相應的 exception 對象。
要先設定好錯誤頁的引用<%@page errorPage=”xxxx.jsp”%>
在錯誤頁中要設定好這個<%@ page isErrorPage=”ture”%>之后exception才起作用
- Out
out對象對象,對象類型是JspWriter類,相當於帶緩存的PrintWriter(不帶緩存)
PrintWriter:write(“內容”) 直接向瀏覽器輸出內容
JspWriter:writer(“內容”) 向jsp緩沖區寫出內容
- Page
page 對象代表JSP本身,只有在JSP頁面內才是合法的。 page隱含對象本質上包含當前 Servlet接口引用的變量,類似於Java編程中的 this 指針。
- Pagecontext
可以獲取其他內置對象
pageContext的對象類型是PageContext,叫jsp的上下文對象.
pageContext作用:可以獲取其他八個內置對象
pageContext.getOut();
pageContext.getServletConfig()
Day8
今天使用到了MVC開發模式,總結下MVC開發模式
簡單介紹這個項目是一個登錄校驗的一個項目
首先來說
整個src內的Java文件的擺放的位置
Controller層內部放置的是servlet,屬於頂層的,是最早接收到來自於客戶端的數據,並且控制層只負責接收數據,起到一個調度的作用,並不處理數據
Service層內部接收到數據后,處理該數據,將數據處理直至能與數據庫里的數據為同一類型之后,即可跳轉dao層
Dao層接收到由service層來的數據后,在內部發送並執行sql指令,得到處理結果集。Dao層是唯一一個和數據庫打交道的層。
Po層里有着按照數據庫里的類型進行封裝的類,比如將customer封裝
Util層里有着所需要用到多次的方法,顧將這些方法封裝到類里,比如MD5加密,所以能夠方便的多次去引用,按照類名.方法的形式。
整體邏輯:1.首先點擊提交按鈕——>把賬號和密碼,驗證碼都提交上到servlet中
- servlet驗證驗證碼是否屬實,屬實就進行下一步
- 將數據組合成對象,交由給service層處理數據
- 將處理好的數據交付給dao層進行數據比對,若不為null就將獲取的值全部返回,若為null,則就返回一個null
在dao層和service層內部都有着一個實現接口的類和一個接口
將整個功能全部封裝在Java類中,接口調用這個類,但客戶只能看到接口,而無法看到底層所實現的類,起到了隱私保護的作用
整個完整過程四個步驟
在最頂層的service層中不允許拋異常,所以在里面只能用try{}catch(){}語句
Day9,10
這兩天一共實現了一個項目的一個添加司機信息的一個功能
下面是整個的業務邏輯:
在調試程序時候遇到的問題:
- 一直都顯示不出來driver的信息表在main.jsp的位置:問題在於driver_form.jsp的這個的請求格式是method=”post”,但是之前的所有調用requestdispatcherServlet的方法都寫在了get中
- 連接好之后,數據庫里的數據調取不出來,sql語句中存在問題
- 連接好之后遇到的問題是亂碼格式問題:亂碼解決問題是在數據庫和頁面之間的格式轉換有問題,解決方法在jdbc中加入設置utf8的屬性
使得數據庫和頁面的數據可以完美匹配,智能進行轉換,但不會影響之前的數據格式
String dburl = "jdbc:mysql://localhost:3306/dc?characterEncoding=utf-8";
Day11,12
- 過濾器的調用Fliter
面向切面編程的編程AOP 在annotation中定義其路徑,與servlet相同,一樣可以從web.xml中定義,如果定義的是/*則其含義是過濾所有web資源,他的優先級比同層次的servlet都高,放行的代碼是chaindoFilter(req,resp);
定義filter中的encoding全局是req.setCharacterEncoding(UTF-8)
res.setCharacterEncoding(UTF-8)
注解時是按照誰先初始化誰就先執行,過濾器可多個存在
Webxml誰先配置,誰先執行
EL表達式中不能有任何一個空格要緊挨着
- 這兩天實現了司機的編輯功能,還有更改亂碼的一個過濾器,還有一個刪除的功能:
Day13-15
- 在dao層中執行完sql語句有一個setStationName(getString(“station_name”));標藍色區域要和數據庫里的字段相同
- 在拋出異常之后有一個問題報錯Exception class NotfoundException is not compatible with throws in XXXXDaoInterface.方法名 其解決方案是檢查接口和實現層是否都有拋異常
- If語句的嵌套
if(語句1){
//語句塊1
if(條件2){
//語句塊2
}else{
//語句塊3
}
}else{
//語句塊4
}
- 解決if語句的嵌套
把所需要判斷的部分加持在if的括號內部,用||和&&解決這個問題
&&且門 要滿足兩邊都為真才能為真 ||與門有一邊是為真那就為真
- Int和integer的區別
Integer是int的包裝類 integer要實例化才能使用 而int不用
Integer i = new Integer();
- Js中有herf的出現的時候,在實現的過程中要使用post方式請求頁面
- 編輯站點信息時出現的問題:在dolist中沒有問題,在doadd中一開始使用了cs中的checkname方法,而且有多個checkname方法,在代碼使用時就很容易引起誤會。下次在寫后端代碼的時候,要首先先到zy.js中找自己要實現的功能 ;在.list中是顯示在頁面的,.form是是負責提交的,和一些檢驗的;一定要看清楚servlet中的注解到url里是否名字匹配;onlick時間是否跳轉成功,到底是post還是get方法;而且在dao層里有一個是setsStationName(rs.getString(“Station_Name”));雙引號中間的必然要和數據庫里的字段重合
- 在地址欄中,若想要提價多項數據,以&為中間間隔號,比如id=1&name=sdfas&...
- 成員方法不能被類名.方法名訪問,在方法前面加上static可用類名.方法名訪問
- 修改js中的一系列東西很可能需要使用清理緩存
Day15~20
JDBC的事務
- con.setAutoCommit(false);默認為true,自動提交事務為false即手動提交
- 提交事務con.commit();
- 回滾事務con.rollback();取消在當前事務中進行的所有修改
Java的多線程的實現
- 繼承Thread類創建線程
Thread類本質上是實現了Runnable接口的一個實例,代表一個線程的實例。啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,並執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,並復寫run()方法,就可以啟動新線程並執行自己定義的run()方法。
- 實現Runnable接口創建線程
- 實現Callable接口通過FutureTask包裝器來創建Thread線程
- 使用ExecutorService、Callable、Future實現有返回結果的線程
- 3和4的實現在https://www.cnblogs.com/felixzh/p/6036074.html
共享鎖和排它鎖
共享鎖(S鎖):共享 (S) 用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句。
如果事務T對數據A加上共享鎖后,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀數據,不能修改數據。
排他鎖(X鎖):用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。
如果事務T對數據A加上排他鎖后,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。
我們在操作數據庫的時候,可能會由於並發問題而引起的數據的不一致性(數據沖突)
產生共享鎖產生共享鎖的SQL:select * from ad_plan lock in share mode;
產生排他鎖的SQL:select * from table for update --增刪改自動加了排他鎖
Next()和nextline()的區別
Next()遇到空格就停下來了 就輸出了
Nextline()是遇到換行才會停下來 空格是可以讀出來的
For循環中的for(x:y)的含義是x屬於y的,並且會遍歷y中所有元素
信鴿推送的實現
1.
設置推送消息,推送消息請求,設置title和內容
2.
XingeApp XingeApp = new XingeApp(2200257637L, "78d2a1972ebdb77bcd0f69504d2a326b");
括號里的第一個是ACCESSID 第二個是SERECTKEY
類似於一個信鴿的登錄
3
以json字符串的形式返回,進行推送
Postman的使用方法:
進入主頁面之后,我們會發現有我們剛剛建的Test1文件夾,我們點擊進入。
然后我們找點get這個按鈕,這里面有一些協議的選擇,我們選項post請求。
選擇之后我們在authotization這個選項選擇No Auth這個選項。
然后Headers里面添加我們的以寫token等信息。
頁面的Body體我們填寫我們的post請求接口參數即可。
最后我們需要我們訪問的地址,然后點擊send這個按鈕,就可以正常發送post請求了。
實訓的考試題中的陌生的
- 年齡BETWEEN 20 AND 30 表示包括20歲但不包括30歲
- 公司中有多個部門和多名職員,每個職員只能屬於一個部門,一個部門可以有多名職員,從職員到部門的聯系類型是
- sql的模糊查詢
1、%:表示任意0個或多個字符。可匹配任意類型和長度的字符,有些情況下若是中文,請使用兩個百分號(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘%三%’
將會把u_name為“張三”,“張貓三”、“三腳貓”,“唐三藏”等等有“三”的記錄全找出來。
2、_: 表示任意單個字符。匹配單個任意字符,它常用來限制表達式的字符長度語句:
比如 SELECT * FROM [user] WHERE u_name LIKE ‘三’
只找出“唐三藏”這樣u_name為三個字且中間一個字是“三”的;
3、[ ]:表示括號內所列字符中的一個(類似正則表達式)。指定一個字符、字符串或范圍,要求所匹配對象為它們中的任一個。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘[張李王]三’
將找出“張三”、“李三”、“王三”(而不是“張李王三”);
4、[^ ] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象為指定字符以外的任一個字符。
比如 SELECT * FROM [user] WHERE u_name LIKE ‘[^張李王]三’
將找出不姓“張”、“李”、“王”的“趙三”、“孫三”等;
Substring
request_uri.substring(ctx_path.length()).equals("/kaptcha.jpg")
前面的減去后面的的長度是否和/kaptcha相同;
截取字符串,在java語言中的用法
1、 public String substring(int beginIndex)
返回一個新字符串,它是此字符串的一個子字符串。該子字符串始於指定索引處的字符,一直到此字符串末尾。
參數:beginIndex - 開始處的索引(包括),
返回:指定的子字符串,
異常:如果 beginIndex 為負或大於此 String 對象的長度,則拋出IndexOutOfBoundsException
例 :"unhappy".substring(2) returns"happy"
"mybaby".substring(3) returns"aby"
2、public String substring(int beginIndex, int endIndex)
返回一個新字符串,它是此字符串的一個子字符串。該子字符串從指定的 beginIndex 處開始, endIndex:到指定的 endIndex-1處結束。
參數:beginIndex - 開始處的索引(包括)
endindex 結尾處索引(不包括)。
返回:指定的子字符串。
拋出:如果 beginIndex 為負,或length大於字符串長度,則拋出IndexOutOfBoundsException
例:"hamburger".substring(3,8) returns "burge"
"smiles".substring(0,5) returns "smile"
數據庫里的next()是什么意思
While(rs.next()){
Rs.getInt(1)//獲取到查詢結果集中的第一列的值
}
信鴿的管理平台
流程
[Push_Token] Push_Token是由信鴿生成的,對一個設備的標識(下文簡稱Token),用於對設備進行推送,是推送的最小單位。類似於uuid
答辯出現了一個問題
首先是ajax的異步請求的問題,為什么先出現的是js頁面中的頭名字,再出現的是數據庫里的東西 是因為ajax的異步請求模式,ajax不設置async就是默認的true 即async:true;
在司機的dolist的地方,dolist中的時間沒有顯示出來,首先去dao層發現自己沒有寫createTime里的setTimestamp,但是還是在頁面中顯示的19700101,在driver_list中的createtime(在jsp中的翻頁信息中去找這個值)必須和dao層中的driverSetCreateTime一樣(標紅的地方一樣),但是還是出不來
項目總結
今天是最后一天答辯結束,老師問的問題其實很簡單,一個是ajax異步調取數據,另一個是我出現的一個bug,現場調試,剛好這個問題涉及到了我可能是在這個項目中掌握的最不好的頁面信息。 想想最開始的時候,剛剛開始寫項目涉及到的關於dao層 service層 controller層的編寫,當時很迷惑的一點是這些數據是從哪里傳來的,是誰在做一個定向,每一次在web的annotation中寫注釋的時候也寫的數據格式很混亂;到最后的時候還是在這個地方出錯,每一處的數據都有着規范jsp中有着數據的名字規范(分頁中的),數據庫中的名字的規范,都要和這三個層相匹配;
除此之外,講一講整個的項目,一開始頁面的編寫和bootstrap的使用都是第一次用到,接着開始了MVC的開發模式,了解到了controller層是做調度的,接收請求、分發任務、響應信息;dao層是做和數據庫打交道的;service層是做一系列的邏輯判斷的;封裝了jdbc連接(DBUtil類)數據庫使得整個代碼的復用率降低,做了幾套關於司機和客服還有車站的增刪改查,也發現了servlet寫項目的弊端,需要大量的重復代碼,很容易出現差錯。在后期為了將項目的代碼重復率降低使用了過濾器和一些自己定義的公共的類,並且使用的騰訊的信鴿系統來做信息的推送,學習了Redis高速緩存的使用方法,為了能讓后期的手機端或者是微信小程序端進行調用,我們還編寫了一些借口,在這里使用到了postman這個借口管理工具,但是代碼的重復率依然很高。