Web全段重點整理
1. HTML+CSS
1.1. HTML+CssDay01
1.1.1. 常用普通標籤
- 常用標籤如下
div
span
a
p
ul+li
h1-h6
img
- 代碼示例:
<img src=」1.jpg」>
- 效果:
4. 注意:
ul+li的應用場景,如果界面上有一堆非常類似的標籤,這時候就會用ul+li來布局。
1.1.2. 常用表單標籤
- 常用表單標籤如下:
form
input:text
button:submit
- 代碼示例:
- 效果如下:
- 注意:
如果是get方式提交:
1. 點擊表單的submit按鈕之後,會對錶單進行提交,跳轉到action對應的url
如果url不確定,先寫#
2. 提交的url,後邊會拼接form中帶有name屬性的標籤的數據
規律:action的url?name的值=value的值&name2的值=value2的值
例子:action的url?username=123&age=18
如果是post提交方式:數據會拼接到請求體,請求體後續介紹
1.1.3. 常用表單項標籤
1. 常用表單項標籤:
input-type:text,type:password,type:number,type:radio,type:checkbox,type:file,type:hidden
button-type:submit,type:button,type:reset
select+option
2. 代碼示例:
3. 效果如下:
4. 注意:
l radio,checkbox,select的option都需要程序員添加上value屬性
l 其他的表單項標籤,用戶輸入的內容就是value
l hidden:隱藏域也需要程序員添加value
n 普通用戶看不到隱藏域
n 隱藏域是為了攜帶額外的數據到服務器
1.2. HTML+CssDay02
1.2.1. Css常用知識點
1. 基礎選擇器
l 元素選擇器:元素名{},例如:div{}
l 類選擇器:.類名{},例如:.div01{}
l id選擇器:#id值{},例如:#id01{}
2. 元素顯示與隱藏
l 隱藏元素:display:none
l 顯示元素:display:block
1.2.2. 表格標籤
1. 常用表格標籤
table
thead,tr,th
tbody,tr,td
2. 代碼示例:
3. 效果如下:
2. Web核心
2.1. Web核心Day01
2.1.1. Tomcat相關
2.1.1.1.
localhost
tomcat啟動之後,可以通過//localhost:8080/訪問tomcat默認歡迎界面
也可以通過//真實IP:8080訪問
localhost:意為「本地主機」,等同於127.0.0.1
2.1.1.2.
idea發佈項目須知
項目發佈之後,啟動tomcat,訪問如下:(項目的根路徑配置的是/)
訪問根路徑/,相當於訪問發佈之後的路徑:out\artifacts\web_demo_war_exploded。
而訪問某個目錄,會直接默認訪問此目錄下的index.jsp或index.html或index.htm,
所以將out\artifacts\web_demo_war_exploded目錄下的index.jsp打開了
2.1.2. Http協議相關
1. http協議:超文本傳輸協議,瀏覽器與服務器之間傳遞數據遵循的協議
2. http協議組成:請求和響應
瀏覽器給服務器傳遞數據,是通過請求
服務器給瀏覽器返回數據,是通過響應
3. 請求與響應
請求與響應要攜帶的數據比較多,所以進行了分類:
請求:請求行,請求頭,請求體
響應:響應行,響應頭,響應體
4. 具體圖示:(請求頭與響應頭不需要記)
5. 總結
瀏覽器中輸入地址,敲回車,這種請求方式為get
form根據method的值,來確定請求方式
get請求,會將form數據拼接到url後,沒有請求體
post請求,會將form數據放入請求體
2.1.3. 案例中的路徑問題
項目配置如下:
最終路徑分析如下:
解決:
1. 去掉welcome-file-list
2. 或者,去掉Application Context
注意:
其實正常情況下news.html中的圖片路徑,應該寫絕對路徑,例如:/test1/img/logo.png。
並且虛擬路徑/test1在後期我們可以通過api來動態獲取
絕對路徑:以/開頭的
相對路徑:不以/開頭的
2.2. Web核心Day02
2.2.1. ServletContext解釋
l context:上下文,理解為環境
l 百度解釋:
n 在語文中:上下文指的是這一篇文章的中心思想,概括。
l 知乎解釋:
n 在生活中:上下文指的是環境
n 林沖說這句話的環境如果是,碰見了猛虎,那麼「啊也」就是驚嚇的意思
n 林沖說這句話的環境如果是,中了大獎,那麼「啊也」就是驚喜的意思
l 總結:
n 上下文:環境,不同環境給我們帶來的信息是不一樣的。所以環境中有很多信息,數據,也就是環境是用於存儲數據的。
n 所以ServletContext就是一個用於存儲共享數據的對象,存儲的數據在整個應用中的Servlet都可以使用,又稱之為應用域
2.2.2. 請求對象封裝過程
l 分析圖如下:
l 說明:這裡大家需要明白Servlet內部的方法,都是由tomcat來調用的,所以方法的參數也是由Tomcat創建好傳遞進來的
l 上圖分析的是request對象,其實response對象也是由Tomcat創建好傳遞進來的,我們通過這個對象給瀏覽器返回數據
2.2.3. getRealPath方法分析
l getRealPath:將項目發佈之後的真實路徑與傳遞的路徑進行拼接
l 例子如下:
l 注意:如果傳遞的路徑不存在,也不會報錯,比如d.txt
l 應用場景:一般是在流操作文件時,需要通過getRealPath來獲取文件真實路徑,然後才能流操作
2.3. Web核心Day03
2.3.1. 轉發與重定向
2.3.1.1.
轉發
- 轉發:一次請求需要多個Servlet協作完成(一個請求)
- 示例代碼:ServletDemo09轉發ServletDemo10
3.應用場景:如果在Servlet中要跳轉本項目內的其他Servlet或界面,可以使用轉發或重定向
2.3.1.2.
重定向
1. 重定向:一次請求需要多個Servlet協作完成(兩個請求)
2. 示例代碼:ServletDemo06重定向到ServletDemo07
3. 應用場景:如果在Servlet中要跳轉其他項目的Servlet/界面,可以使用重定向
2.3.1.3.
區別(完全相反)
l 重定向:
n 兩次請求
n 地址欄發生變化
n 不可以使用request域共享數據 (既然是兩次請求,那肯定不能使用請求域中共享的數據)
n 可以重定向到其他服務器的url
l 轉發:
n 一次請求
n 地址欄不發生變化
n 可以使用request域共享數據
n 只能轉發到自己服務器內部的url
2.3.2. 路徑分析
2.3.2.1.
跳轉使用的url
2.3.2.1.1.
servlet中的轉發(特殊)
如:Day03的request_demo的ServletDemo09
這裡的url是以斜杠開頭的,但是其實他不是一個完整的絕對路徑。
轉發比較特殊,由ServletDemo09轉發到ServletDemo10,ServletDemo10的路徑必須是相對於ServletDemo09進行轉發的。
例如://localhost:8080/request/servletDemo09,轉發的url為「/servletDemo10」,那麼最終的url其實是//localhost:8080/request/servletDemo10
所以說,這個url可以寫成:「servletDemo10」不加斜杠,寫成相對路徑,這樣更加合理,更加好理解
2.3.2.1.2.
servlet中的重定向
如:Day03的response_demo的ServletDemo06
這裡的url是也斜杠開頭:「/response/servletDemo07」,項目虛擬路徑+servlet路徑,這是標準的絕對路徑寫法
2.3.2.1.3.
servlet中的定時跳轉
如:Day03的response_demo的ServletDemo05
這裡的url也是斜杠開頭:「/response/login.html」,項目虛擬路徑+文件路徑,這是標準的絕對路徑寫法
2.3.2.1.4.
html中的超鏈接
如:Day03的reqresp_test案例中的index.html
這裡的url:」/stu/addStudent.html」,項目虛擬路徑+文件路徑,這是標準的絕對url寫法
2.3.2.1.5.
html中的表單的action
如:Day03的reqresp_test案例中的addStudent.html
這裡的url:「/stu/addStudentServlet」,項目虛擬路徑+servlet路徑,這是標準的絕對url寫法
2.3.2.1.6.
總結
除了轉發,其餘的跳轉到某個資源的url,都是使用絕對路徑
2.3.2.2.
配置文件中的url
2.3.2.2.1.
welcome-file(特殊)
如:Day02中的servlet_test的web.xml
這裡welcome-file的路徑為:「/addStudent.html」,是以斜杠開頭,但是並不是完整的絕對路徑
welcome-file是配置默認的歡迎界面,那界面html文件,肯定是在web目錄下,所以他固定就是去web目錄下查找,所以這裡不需要添加項目虛擬路徑寫成:「/虛擬路徑/addStudent.html」
既然welcome-file固定是去web目錄下查找,所以我們可以認為他參照的目錄就是web,所以可以寫成相對路徑「addStudent.html」
大家可以試一下,也是可以的,其實這一點跟轉發有點類似,都有固定的參照目錄
2.3.2.2.2.
servlet路徑配置
這裡的路徑「/studentServlet」是給StudentServlet配置的他自己的url,所以肯定不需要帶項目虛擬路徑。
配置好之後,我們通過「項目虛擬路徑+servlet路徑」來訪問servlet
那麼註解方式給servlet添加的url,也是如此:@WebServlet(「/studentServlet」)
2.3.2.3.
流操作項目中的文件
如:Day03的response_demo中的ServletDemo03
這裡的getRealPath(「/img/hm.png」),最終拼接出來的路徑是:項目發佈之後的真實路徑+/img/hm.png
問題:
為啥這裡不能直接使用項目虛擬路徑+/img/hm.png,為啥非得用getRealPath來拼接發佈之後的路徑呢?
為啥之前的跳轉的url,都可以使用虛擬路徑+資源路徑,來進行訪問,而這裡的io流操作文件則非得使用getRealPath呢?
答:
因為跳轉的url,其實都是通過瀏覽器來向tomcat發起的請求,tomcat收到這些請求之後,會根據項目虛擬路徑,來找到項目真是發佈之後的路徑
而IO流操作文件,並沒有通過瀏覽器,而是直接自己去查找的本地文件,所以需要查找我們的項目最終發佈路徑中的文件
2.4. Web核心Day04
2.4.1. Cookie
1. Cookie介紹
(1) 客戶端(瀏覽器)會話管理技術
(2) 把要共享的數據保存到客戶端(瀏覽器)
(3) 每次請求時,瀏覽器會把會話信息帶到服務器端,從而實現多次請求的數據共享
2. Cookie作用:一般用於存儲用戶的登陸狀態,避免在一次會話的多次請求中多次登陸
3. Cookie操作
4. 案例分析:
2.4.2. Session
1. Session介紹
(1) 服務器端會話技術
(2) 共享數據保存在服務器端
(3) session依賴於cookie,需要cookie保存Jsessionid
2. Session作用:一般用於存儲用戶的登陸狀態,避免在一次會話的多次請求中多次登陸
3. Cookie與Session作用一樣,但是常用Session保存用戶登錄狀態,因為數據保存在服務器端更加安全
4. 示例代碼:Day04中的session_demo的ServletDemo01
5. Session原理分析
注意:
第二步,是tomcat自動處理的,一旦咱們在Servlet中有操作session的相關代碼,tomcat就會將此session對象對應的Jsessionid放入cookie中
第四步,從cookie中取出jsessionid,也是tomcat自動處理的,一旦咱們在Servlet中有getSession的代碼,tomcat就會先取出jsessionid,然後判斷有沒有此id對應的session對象,有就直接返回
2.5. Web核心Day05
2.5.1. EL表達式基本點
1. EL:Expression Language,表達式語言
2. 作用:在 JSP 頁面中獲取數據,讓我們的 JSP 脫離 java 代碼塊和 JSP 表達式
3. el表達式,會獲取四大域中的共享數據,語法: ${共享數據的key名字}
4. 如果共享數據是key,value形式,這時候想獲取這個共享數據內的value的值分兩種情況
1. 如果key不是索引:${共享數據的key名字.key }: ${stu.name}
2. 如果key是索引: ${共享數據key名字[key]} : ${arr[0]}
5. 補充:
1. 數組,集合,map,javabean,都是key,value形式
2. 只不過,數組和集合他的key是系統自動添加的 , 是一個索引
6. 示例代碼
2.5.2. EL三元表達式
1. el三元表達式,常用於單選,多選,與下拉列表的選中
2. 示例代碼:
2.5.3. EL隱式對象
總結:
1. 獲取四大域中的數據:${key}
2. 獲取項目虛擬路徑:${pageContext.request.contextPath}
EL表達式中有pageContext隱式對象,但是沒有request隱式對象
正好pageContext可以獲取其他的jsp的八大隱式對象
3. Mybatis
3.1. Mybatis-Day01
3.1.1. mybatis介紹
1. 介紹
2. orm
3.1.2. mybatis入門
1. 入門分析圖
l 問題:sqlSession.selectList(「StudentMapper.selectAll」),這裡的參數是映射文件的namespa.id組成的,但是為啥sqlSession可以找到這個映射文件呢?
n sqlSession是由sqlSessionFactory創建的,而sqlSessionFactory是SQLSessionFactoryBuilder創建的,然後我們是將讀取了MyBatisConfig.xml的流傳遞給了SQLSessionFactoryBuilder,所以呢sqlSession是知道MyBatisConfig.xml的存在的。而在MyBatisConfig.xml中引入了映射文件StudentMapper.xml。
3.1.3. mybatis核心類
1. 與jdbc對比
由上圖可知,sqlSession是綜合了jdbc的Connection與statement的功能。
l Statement的executeUpdate對應insert,update,delete
l Statement的executeQuery對應selectList,selectOne
l Connection的commit與rollback對應commit與rollback(一樣)
l Connection的setAutoCommit對應sqlSessionFactory的openSession方法中的參數autoCommit
n Connection的setAutoCommit默認是true,就是默認是自動提交事務
n sqlSessionFactory的openSession方法中的參數autoCommit默認是false,默認手動提交事務,需要自己commit提交事務
n
3.1.4. 關鍵點分析
3.1.4.1.
映射分析
1. 分析圖如下
(1) 數據庫中有student表,程序中就會有一個Student類
(2) 表中的字段/列名,必須與Student類的屬性名保持一致
① 數據庫的列名不區分大小寫
(3) 表中的一條數據,讀取到程序中,就代表一個Student對象
(4) selectList方法直接返回封裝好的數據,內部的邏輯類似於右下角的遍歷
3.1.4.2.
映射文件參數分析
1. 圖示如下
(1) selectById只需要一個參數,所以parameterType直接寫此參數的數據類型即可
(2) insert需要多個參數,而且參數類型不同,所以需要將參數封裝為一個javabean然後進行傳遞
3.2. Mybatis-Day02
3.2.1. 接口代理
1. 接口代碼分析如下:
3.2.2. 分頁查詢
1. 分頁查詢分析如下:
3.2.3. 多表查詢
3.2.3.1.
一對一
1. 一對一分析如下:
(1) 這次查詢的需求是:查詢所有身份證,並且順便查詢身份證所屬的人的信息。所以是在Card類中添加了Person對象。
(2) Javabean中誰包含誰,跟表關係沒有關係,跟需求有關係
(3) 多表映射配置規律:
① resultMap標籤中的type屬性指定的是主表類(包含對象的類:Card)
② association標籤中的javaType屬性指定的是次表類(被包含對象的類:Person)
③ 通過id和result標籤中的column屬性與property屬性就來建立對應列與屬性的關係
④ 映射文件主要就是解決數據庫表的列與Javabean的屬性之間的對應關係的
3.2.3.2.
一對多
1. 一對多分析如下:
(1) 此圖的需求是:查詢所有的班級,並且順便查詢班級下所有的學生
(2) 一對多在配置被包含對象時用的是collection標籤和ofType屬性
3.2.3.3.
多對多
1. 多對多分析如下
(1) 多對多其實是由兩個一對多組成的
(2) 從學生角度看,一個學生可以選擇多個課程
(3) 從課程角度看,一個課程可以被多個學生選擇
3.3. Mybatis-Day03
3.3.1. 註解一對一
1. 一對一分析
(1) 註解方式添加sql,與映射文件添加sql的區別
① 映射文件的多表查詢是用一個sql
② 註解方式的多表查詢是用兩個sql,先查詢主表,然後遍歷查詢次表,最終再拼接結果
3.3.2. 註解一對多
1. 一對多分析
(1) 註解一對多在配置被包含對象的時候,javaType是配置List.class,而不是List內的具體類型
(2) 映射文件一對多在配置被包含對象的時候,ofType配置的是List內的具體類型
3.3.3. 註解多對多
1. 多對多分析
2. 多對多sql語句分析
起初是查詢所有的student,但是發現沒有選擇課程的王五趙六也出來了,這不是我們的需要希望的
所以後來進行了關聯去重查詢
如果這裡用映射文件配置sql,其實一個sql就可以搞定:
4. JavaScript
4.1. Day01
4.1.1. 變量和常量
4.1.2. 基本數據類型
注意:
l null屬於基本數據類型的一種,但是通過typeof檢測之後發現是複雜數據類型object,這是矛盾的。(js的一個錯誤,後來想糾正,但是太麻煩,就不了了之了)
l undefined未定義是一種數據類型(變量定義了,但是值沒定義)
l not defined是一種錯誤(變量沒定義)
4.1.3. 運算符
4.1.4. 數組
l 數組arr拆包:…arr,結果為10,20,30
l 字符串又稱之為字符數組
4.1.5. 可變參數
l …在數組前是拆包
l …在函數的參數前是打包,將多個實參打包到形參,將形參變為一個數組
4.1.6. 屬性操作
屬性操作分為兩種方式:
1. 元素對象.xxxAttribute(“屬性名”):可以操作固有屬性,和自定義屬性
此種方式,操作屬性,與標籤內操作屬性一樣
2. 元素對象.屬性名 ,只能操作固有屬性
此中方式,有一些特殊的屬性:style(對象),class(className)
4.1.7. 事件
1. 通過標籤添加事件
<button id="up" onclick="up()">上一張</button>
2. 通過元素對象添加事件
let upBtn = document.getElementById("up"); upBtn.onclick = function () { let img = document.getElementById("img"); img.setAttribute("src", "img/01.png"); }
3. 超鏈接添加事件
<a href="JavaScript:void(0);" onclick="drop(this)">刪除</a>
超鏈接添加點擊事件,需要先給默認的跳轉行為給屏蔽掉:href=」javascript:void(0)」
4.2. Day02
4.2.1. json
1. JSON(JavaScript
Object Notation):是一種輕量級的數據交換格式
2. 分析圖
(1) 注意:程序中都是使用對象(因為使用對象比字符串方便),而在傳輸過程中都是json字符串,所以前後端都需要來回的轉換
3. 代碼
4.2.2. 表單提交事件
1. html代碼
2. js代碼
4.2.3. 定時器
1. 代碼
4.2.4. 頁面加載完成事件
1. 代碼
2. 如果將js獲取界面元素的代碼放到onload中,那麼這段js的代碼位置就可以放在body上邊
4.2.5. js跳轉界面
1. 代碼
location.href =
“路徑”;
5. Jquery
5.1. $函數使用總結
1. 當做函數使用
(1). 如果傳遞的是一個匿名函數,當做界面加載完成函數使用
(2). 如果傳遞的是一個DOM對象,當做類型轉換使用,將DOM對象轉換為jq對象
(3). 如果傳遞的是一個css選擇器(字符串),當做獲取元素使用
(4). 如果是html內容的字符串,當做創建元素對象使用
2. $ 是一個函數,也是一個對象,可以直接調用方法
(1). each函數
(2).
ajax/get/post函數
5.2. jq對象轉換為js對象
1. jq封裝了大部分的js的功能,但是有個別的功能並沒有封裝,所以有時候我們需要將jq對象轉換為js對象
2. 代碼
3. 為什麼jQuery是一個數組,為啥他將找到的js對象放入到一個數組中了呢?因為隱式迭代。
5.3. jquery的隱式迭代
1. 隱式迭代,悄悄的遍歷,內部自動做了遍歷循環的操作
2. jquery中大部分的方法都有隱式迭代的特性
(1) 添加事件的方法:click(),focus(),等等
(2) 操作屬性的方法:attr(),prop()
(3) 操作樣式的方法:css(),addClass(),removeClass(),toggleClass()
(4) 操作文本的方法:html()
3. 注意:以上方法的隱式迭代只在設置的時候生效,獲取只能獲取第一個js對象的數據
6. Ajax
6.1. Ajax通用方法
1. 代碼
l async:true可以省略,默認是異步
l data:是前端向後端傳遞的數據,可以是字符串(key=value),也可以是對象{key:value}
l dataType:是前端告知後端,前端希望後端返回的數據的類型
l success的function中的參數data,是後端響應回來的數據
6.2. Java中的json轉換
1. 對象轉json
2. Map轉json
3. Map包含user,轉json
4. list轉json
5. list包含user,轉json
6.3. 案例
6.3.1. 聯想搜索
1. 分析圖
2. 注意
(1) 此案例中的keydown事件,可以換為change事件更加合理
① change事件:文本內容改變就會觸發的事件
(2) ajax收到後端返回的json數據之後,直接將json轉換為對應的對象,然後傳遞給success的function的參數data
6.3.2. 分頁-瀑布流
1. 分析圖
(1) send標記,是一個開關,避免重複加載下一頁數據。當下一頁數據還沒有回來的時候,是不能再次觸發獲取下一頁數據的邏輯的
(2) 只有下一頁數據顯示到界面上之後,才會將send標記打開
(3) 後端分頁代碼是第二種寫法
這裡的page與list其實是一樣的,都代表當前頁數據集合
page其實是繼承了ArrayList,是一個集合
2. 界面滾動到底部的判斷公式分析
(1) 滾動條距離底部的距離其實可以不要
(2) 公式改為:滾動條滾動距離+窗口高度>=頁面文檔高度
7. Vue
7.1. Day01
7.1.1. Vue的作用
7.1.2. Vue的數據綁定
v-bind:value=」username」
7.1.3. element-ui的表單
7.1.3.1.
表單數據雙向綁定
在這裡進行雙向數據綁定的時候,我們是將要綁定的data屬性放到了ruleForm對象中,然後再進行的綁定,這樣做方便後續數據的提交,等到提交數據的時候,直接將ruleForm對象轉換為json提交到後台即可
7.1.3.2.
表單校驗規則
rules是一個對象,在對象中可以指定多個字段的校驗規則
name是其中一個校驗規則,而這個校驗規則是有必填和長度這兩個校驗規則組成的
每一個校驗規則都是一個對象,對象中有三項信息
1. 校驗規則:required必填,min-max長度
2. 校驗失敗時的提示信息:message
3. 何時觸發校驗:trigger(觸發器):blur(失去焦點),意味失去焦點觸發此校驗規則
7.1.3.3.
表單提交
l 失去焦點需要校驗表單,但是最後表單提交的時候,也需要再次校驗表單
n 因為程序員可以通過程序,讓表單數據自動填充,所以界面的失去焦點方法校驗表單並不完全可靠
n 其實最後表單提交的時候再次校驗,程序員也是可以跳過的,比如通過postman發起請求,不通過界面發起請求,所以前端所有的校驗都不靠譜,後端servlet收到數據之後,也還是會重新校驗的
l 注意:這裡的validate是el-form的方法,我們需要獲取el-form對象之後才能調用,如何獲取呢?因為Vue不再通過原始方式獲取DOM元素對象,所以採用ref引用名的方式:
- 只要標籤添加ref屬性,就會給當前標籤創建對象,並且將對象存儲到$refs中
- vue實例有一個屬性 $refs , 存儲當前界面中所有帶有ref屬性的標籤的對象
- 比如此界面中有倆標籤添加有ref:
(1) <el-form
ref=”ruleForm” > <el-form-item ref=”item1″>
- 那麼$refs對象就長這樣:
{“ruleForm”:el-form,”item1″:el-form-item} - 所以可以通過如下方式獲取:
(1) this.$refs.ruleForm
this.$refs.item1
(2) this.$refs[“ruleForm”]
this.$refs[“item1”](這個$refs比較特殊,可以通過中括號方式獲取屬性)
l validate方法的參數是一個回調函數,函數的參數是校驗結果
n 校驗通過,valid=true
n 校驗失敗,valid=false
l 最後需要注意,validate方法內部用到了el-form的model屬性,所以如果沒有寫如下屬性:
l 會報錯:
model是校驗工作必須的屬性
7.1.3.4.
表單數據重置
el-form還有一個方法resetFields,重置字段,會將用戶輸入的信息以及校驗信息都清空
7.1.4. 表格
7.2. Day02
7.2.1. axios
1. 發送請求代碼如下:
注意:這裡是通過resp.data來獲取後端返回的數據
2. api介紹
7.2.2. 封裝前端傳遞的數據
1. 代碼如下
如果前端傳遞的數據中有特殊類型的數據,比如日期字符串,這時候populate是搞不定的,而populate在進行轉換數據的時候,會根據註冊的轉換器來處理特殊類型的數據,所以我們只需要註冊日期轉換器即可
populate方法在對數據進行轉換的時候,會調用轉換器的convert方法,將字符串日期傳遞進去,按照固定格式轉換為Date類型的日期,然後返回
8. Maven基礎
8.1. maven的安裝與配置
1. 將「16-Maven基礎(雙元)\day01\資料\安裝程序\apache-maven-3.6.1-bin.zip」的壓縮包複製到D盤下,進行解壓縮
2. 接下來進行環境配置
3. 確定JAVA_HOME環境變量沒問題(注意:建議使用jdk1.8,高版本會出問題)
4. 檢查環境
(1) 打開cmd,執行:mvn -v
(2) 能看到如下結果即可
5. 確保idea是2018.2版本,目前發現有問題的版本有2018.3以及2020.x版本都會出現maven工程編譯問題
8.2. 創建maven工程
8.2.1. 創建Java-maven工程
創建maven項目的時候選擇使用原型骨架
輸入坐標信息
創建完成後發現通過這種方式缺少一些目錄,如下圖
我們需要手動去補全目錄,並且要對補全的目錄進行標記,切記
8.2.2. 創建JavaWeb-maven工程
1. 選擇web對應的原型骨架
2. 坐標
3. 和前面創建普通項目一樣,通過原型創建web項目得到的目錄結構是不全的,因此需要我們自行補全,同時要標記正確,最終需要得到如下結構
4. 清空web.xml
5. 清空pom.xml
6. 在pom.xml中project節點下添加tomcat插件的坐標:
<build> <plugins> <!--tomcat插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>
7. 右側就會出現tomcat7的命令
8. 雙擊tonmcat7:run運行,然後訪問
9. 新建運行方式
8.3. pom文件說明
9. 綜合案例
9.1. Day02
9.1.1. 文件上傳
1. 頁面提供文件上傳的表單元素
2. form表單enctype屬性的值為multipart/form-data
3. 表單的提交方式必須是POST,get方式無法提交大量的數據
4. 後台核心代碼(這裡用到的是commons-fileupload)
private void testUpload(HttpServletRequest request,HttpServletResponse response) throws Exception { //1.確認該操作是否支持文件上傳操作,enctype="multipart/form-data" if(ServletFileUpload.isMultipartContent(request)){ //2.創建磁盤工廠對象 DiskFileItemFactory factory = new DiskFileItemFactory(); //3.Servlet文件上傳核心對象 ServletFileUpload fileUpload = new ServletFileUpload(factory); //4.從request中讀取數據 List<FileItem> fileItems = fileUpload.parseRequest(request); for(FileItem item : fileItems){ //5.當前標籤是否是文件表單標籤 if(!item.isFormField()){ //6.從臨時存儲文件的地方將內容寫入到指定位置 item.write(new File(this.getServletContext().getRealPath("upload"),item.getName())); } } } }
5. 圖示分析
9.1.2. 添加題目時加入文件上傳
9.1.3. 更新題目時上傳圖片分析
另:添加題目的時候也需要添加flag標記,如果不添加,會出現不管有沒有上傳圖片,都設置picture字段,那麼如果沒有上傳還設置picture字段的話,在編輯界面里就會出現如下情況:
另:附上save的優化後的代碼
9.1.4. 題目選項刪除
1. 分析圖如下
2. 注意點:
(1) 如果從delete轉到list,用的是list方法調用:list(request,response)這種方式,是可以傳遞請求參數的數據的,轉發,重定向均不可以
(2) 而在這裡,我們在請求delete方法的時候,傳遞了請求參數questionId,現在需要delete方法將這個請求參數傳遞到list中,所以只能直接調用list方法
9.1.5. 題目選項新增-更新
1. 分析圖如下
9.2. Day03
9.2.1. 角色授權樹形數據
1. sql分析圖
2. sql
9.3. Day04
9.3.1. 菜單動態顯示
1. 分析圖如下
(1) 外層循環循環一級菜單
① 一級菜單需要滿足條件ctype=0
(2) 內層循環循環二級菜單
① 二級菜單需要滿足條件ctype=1
② 並且滿足是否是當前循環的一級菜單的下級菜單:item2.parentId=item.id