柚子快報(bào)激活碼778899分享:SpringMVC詳解
文章目錄
1 什么是MVC1.1 MVC設(shè)計(jì)思想1.2 Spring MVC
2 SpringMVC快速入門(mén)3 SpringMVC處理請(qǐng)求3.1 請(qǐng)求分類及處理方式3.1.1 靜態(tài)請(qǐng)求3.1.2 動(dòng)態(tài)請(qǐng)求
3.2 處理靜態(tài)請(qǐng)求3.2.1 處理html文件請(qǐng)求3.2.2 處理圖片等請(qǐng)求
3.3 處理動(dòng)態(tài)請(qǐng)求3.3.1 注解說(shuō)明3.3.2 示例
3.4 常見(jiàn)問(wèn)題
4 HTTP4.1 HTTP協(xié)議4.2 訪問(wèn)網(wǎng)頁(yè)流程4.3 請(qǐng)求和響應(yīng)4.3.1 HTTP請(qǐng)求 Request4.3.2 HTTP響應(yīng) Response
4.4 URL4.4.1 定義4.4.2 URL組成4.4.3 注意事項(xiàng)
4.5 請(qǐng)求方法4.5.1 GET請(qǐng)求4.5.2 POST請(qǐng)求
4.6 傳遞數(shù)據(jù)方式4.6.1 GET請(qǐng)求4.6.2 POST請(qǐng)求
5 服務(wù)端接收參數(shù)5.1 HttpServletRequest接收5.2 聲明參數(shù)接收5.3 聲明POJO類接收
6 HttpClient測(cè)試6.1 HttpClient說(shuō)明
7 POJO7.1 定義7.2 entity實(shí)體類|DTO|VO
1 什么是MVC
1.1 MVC設(shè)計(jì)思想
MVC是一種軟件架構(gòu)的思想,將軟件按照模型、視圖、控制器來(lái)劃分。
M Model,模型層,負(fù)責(zé)業(yè)務(wù)邏輯判斷,數(shù)據(jù)庫(kù)存取 V View,視圖層,負(fù)責(zé)界面展示,向用戶呈現(xiàn)數(shù)據(jù)的方式(html頁(yè)面、圖片、文本等) C Controller,控制器,負(fù)責(zé)接收用戶請(qǐng)求,并根據(jù)請(qǐng)求調(diào)用相應(yīng)的模型來(lái)處理業(yè)務(wù)邏輯
1.2 Spring MVC
SpringMVC是一種基于MVC(模型-視圖-控制器)模式的Web框架,它是基于Spring框架的一個(gè)子項(xiàng)目。
它通過(guò)將請(qǐng)求分派給相應(yīng)的控制器來(lái)處理Web請(qǐng)求,然后將處理結(jié)果發(fā)送回客戶端。
處理流程如圖:
客戶端發(fā)送請(qǐng)求至前端控制器DispatcherServlet;DispatcherServlet收到請(qǐng)求后,調(diào)用處理器映射器HandlerMapping;HandlerMapping根據(jù)請(qǐng)求URL找到具體的Controller;通過(guò)處理器適配器HandlerAdapter找到具體執(zhí)行該方法的實(shí)現(xiàn)類;Controller處理請(qǐng)求,并返回ModelAndView;DispatcherServlet通過(guò)ViewReslover(視圖解析器)確定負(fù)責(zé)顯示數(shù)據(jù)的具體View;DispatcherServlet對(duì)View進(jìn)行渲染視圖(即將Model填充至視圖組件中),并將完整的視圖響應(yīng)到客戶端。
2 SpringMVC快速入門(mén)
第1步:創(chuàng)建工程 _051MVC-BOOT01 第2步:選擇 2.7.17 版本,并勾選 Spring Web 依賴項(xiàng)
第3步:?jiǎn)?dòng)工程 第4步:在resources/static目錄下創(chuàng)建index.html
工程首頁(yè)
第5步:Rebuild static
3 SpringMVC處理請(qǐng)求
3.1 請(qǐng)求分類及處理方式
3.1.1 靜態(tài)請(qǐng)求
定義 指請(qǐng)求的頁(yè)面由服務(wù)器上預(yù)先準(zhǔn)備好的靜態(tài)web資源組成,如HTML、CSS、JS、IMG等,返回給客戶端的信息內(nèi)容是不變的。 處理方式 由服務(wù)器直接將請(qǐng)求的資源返回給客戶端,服務(wù)器不處理任何邏輯,只是將預(yù)先準(zhǔn)備好的資源返回給客戶端。
3.1.2 動(dòng)態(tài)請(qǐng)求
定義 服務(wù)器會(huì)根據(jù)用戶的請(qǐng)求動(dòng)態(tài)生成內(nèi)容,將數(shù)據(jù)返回到客戶端顯示頁(yè)面內(nèi)容。 處理方式 由服務(wù)器從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),并進(jìn)行相應(yīng)的邏輯處理后將處理結(jié)果返回客戶端。
3.2 處理靜態(tài)請(qǐng)求
3.2.1 處理html文件請(qǐng)求
第1步:創(chuàng)建index.html(已經(jīng)創(chuàng)建)瀏覽器輸入地址測(cè)試 http://localhost:8080/index.html 第2步:瀏覽器顯示工程首頁(yè)
3.2.2 處理圖片等請(qǐng)求
第1步:復(fù)制任意一張圖片到static下 第2步:右鍵static目錄,Rebuild static 第3步:瀏覽器測(cè)試 http://localhost:8080/liying.jpg
3.3 處理動(dòng)態(tài)請(qǐng)求
通過(guò)在 controller 中定義對(duì)應(yīng)的類及方法實(shí)現(xiàn)動(dòng)態(tài)請(qǐng)求的業(yè)務(wù)邏輯處理。
3.3.1 注解說(shuō)明
@Controller 添加在類上; 表示該類是一個(gè)控制器,負(fù)責(zé)處理用戶的請(qǐng)求,并將處理結(jié)果生成響應(yīng)返回給客戶端。 @RequestMapping 請(qǐng)求注解; 添加在控制器類或控制器方法上; 將HTTP請(qǐng)求映射到控制器中的方法,指定處理請(qǐng)求的路徑
控制器類上:為整個(gè)控制器指定一個(gè)基礎(chǔ)路徑控制器方法上:指定相對(duì)于基礎(chǔ)路徑的具體路徑 @ResponseBody 響應(yīng)注解; 添加在控制器方法上; 可以使控制器方法通過(guò)返回值的方式將響應(yīng)返回給客戶端。
3.3.2 示例
處理用戶查詢訂單的請(qǐng)求
請(qǐng)求地址:http://localhost:8080/selectOrder返回響應(yīng):String “查詢訂單成功~~”
實(shí)現(xiàn)
第1步: 工程目錄下新建 controller.OrderController // @Controller:用于將一個(gè)類標(biāo)識(shí)為SpringMVC中的控制器,負(fù)責(zé)處理用戶的請(qǐng)求并將響應(yīng)返回給客戶端
@Controller
public class OrderController {
// 1.請(qǐng)求注解
@RequestMapping("/selectOrder")
// 2.響應(yīng)體注解,添加此注解后,可以通過(guò)返回值的方式響應(yīng)給客戶端數(shù)據(jù)
@ResponseBody
public String selectOrder(){
return "查詢訂單成功~~";
}
}
第2步:重啟工程 后瀏覽器測(cè)試 http://localhost:8080/selectOrder
3.4 常見(jiàn)問(wèn)題
工程已修改,但是瀏覽器刷新未出現(xiàn)效果
工程static目錄下文件修改后必須 Rebuild static瀏覽器有之前頁(yè)面的緩存,Shift + F5 刷新頁(yè)面 404錯(cuò)誤碼代表找不到資源
找不到靜態(tài)資源
檢查請(qǐng)求的路徑是否正確檢查靜態(tài)資源文件的存儲(chǔ)位置是否在static里面選中static文件夾 ReBuild 重新編譯再測(cè)試 找不到動(dòng)態(tài)資源
檢查請(qǐng)求的路徑是否正確檢查@Controller注解是否添加檢查@RequestMapping注解里面的處理路徑是否正確
4 HTTP
4.1 HTTP協(xié)議
超文本傳輸協(xié)議
HTTP協(xié)議是瀏覽器與服務(wù)器通訊的應(yīng)用層協(xié)議,規(guī)定了瀏覽器與服務(wù)器之間的交互規(guī)則以及交互數(shù)據(jù)的格式信息等。
用途 : 網(wǎng)頁(yè)獲取,數(shù)據(jù)的傳輸特點(diǎn)
應(yīng)用層協(xié)議,使用tcp進(jìn)行數(shù)據(jù)傳輸;有豐富的請(qǐng)求類型;可以傳輸?shù)臄?shù)據(jù)類型眾多.
4.2 訪問(wèn)網(wǎng)頁(yè)流程
客戶端(瀏覽器)通過(guò)tcp傳輸,發(fā)送http請(qǐng)求給服務(wù)端;服務(wù)端接收到http請(qǐng)求后進(jìn)行解析;服務(wù)端處理請(qǐng)求內(nèi)容,組織響應(yīng)內(nèi)容;服務(wù)端將響應(yīng)內(nèi)容以http響應(yīng)格式發(fā)送給瀏覽器;瀏覽器接收到響應(yīng)內(nèi)容,解析展示.
4.3 請(qǐng)求和響應(yīng)
4.3.1 HTTP請(qǐng)求 Request
瀏覽器給服務(wù)端發(fā)送的內(nèi)容稱為請(qǐng)求Request,一個(gè)請(qǐng)求包含三部分:請(qǐng)求行,請(qǐng)求頭,請(qǐng)求體
請(qǐng)求行 : 具體的請(qǐng)求類別和請(qǐng)求內(nèi)容 GET / HTTP/1.1
請(qǐng)求類別 抽象路徑 協(xié)議版本
/**關(guān)于請(qǐng)求類別*/
請(qǐng)求類別:每個(gè)請(qǐng)求類別表示向服務(wù)器端發(fā)請(qǐng)求做不同的操作
GET : 獲取服務(wù)器資源
POST :新增服務(wù)器資源
PUT : 更新服務(wù)器資源
DELETE : 刪除服務(wù)器資源
/**關(guān)于抽象路徑*/
請(qǐng)求URL地址為:http://localhost:8080/
請(qǐng)求行為: GET / HTTP/1.1
請(qǐng)求URL地址為:http://localhost:8080/v1/users/login
請(qǐng)求行為: GET /v1/users/login HTTP/1.1
請(qǐng)求URL地址為:http://localhost:8080/v1/users/reg
GET /v1/users/reg HTTP/1.1
請(qǐng)求頭:對(duì)請(qǐng)求的進(jìn)一步解釋和描述 請(qǐng)求頭是瀏覽器可以給服務(wù)端發(fā)送的一些附加信息,有的用來(lái)說(shuō)明瀏覽器自身內(nèi)容,有的用來(lái)告知服務(wù)端交互細(xì)節(jié),有的告知服務(wù)端消息正文詳情等。 Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
請(qǐng)求體: 請(qǐng)求參數(shù)或者提交內(nèi)容 請(qǐng)求體通常是用戶上傳的信息,比如:在頁(yè)面輸入的注冊(cè)信息,上傳的附件等內(nèi)容。
4.3.2 HTTP響應(yīng) Response
服務(wù)端給瀏覽器發(fā)送的內(nèi)容稱為響應(yīng)Response,一個(gè)響應(yīng)包含三部分:響應(yīng)行,響應(yīng)頭,響應(yīng)體。
響應(yīng)行 HTTP/1.1 200 OK
版本信息 響應(yīng)碼 附加信息
響應(yīng)碼 :
1xx:保留
2xx:成功,表示處理成功,并正常響應(yīng)
3xx:重定向,表示處理成功,但是需要瀏覽器進(jìn)一步請(qǐng)求
4xx:客戶端錯(cuò)誤,表示客戶端請(qǐng)求錯(cuò)誤導(dǎo)致服務(wù)端無(wú)法處理
5xx:服務(wù)端錯(cuò)誤,表示服務(wù)端處理請(qǐng)求過(guò)程出現(xiàn)了錯(cuò)誤
響應(yīng)頭 響應(yīng)頭與請(qǐng)求中的消息頭格式一致,表示的是服務(wù)端發(fā)送給客戶端的附加信息。 HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 3546
//Content-Length是用來(lái)告知瀏覽器響應(yīng)正文的長(zhǎng)度,單位是字節(jié)。
Content-Type 是用來(lái)告知瀏覽器響應(yīng)正文中的內(nèi)容是什么類型的數(shù)據(jù)(圖片,頁(yè)面等等)不同的類型對(duì)應(yīng)的值是不同,瀏覽器接收正文前會(huì)根據(jù)上述兩個(gè)響應(yīng)頭來(lái)得知長(zhǎng)度和類型從而讀取出來(lái)做對(duì)應(yīng)的處理以渲染給用戶看。
文件類型Content-Type對(duì)應(yīng)的值htmltext/htmlcsstext/cssjsapplication/javascriptpngimage/pnggifimage/gifjpgimage/jpeg 響應(yīng)體 響應(yīng)的主體內(nèi)容信息
4.4 URL
4.4.1 定義
? URL(Uniform Resource Locator)是互聯(lián)網(wǎng)上 統(tǒng)一資源定位符 的簡(jiǎn)稱,用于標(biāo)識(shí)和定位互聯(lián)網(wǎng)上資源的地址。在Web瀏覽器中,URL是用于訪問(wèn)網(wǎng)頁(yè)的地址。
4.4.2 URL組成
http://localhost:8080/v1/users/login?username=xxx&password=yyy
協(xié)議(Protocol):指定訪問(wèn)資源的協(xié)議類型,常見(jiàn)的協(xié)議包括HTTP、HTTPS等。 主機(jī)名(Hostname):指定要訪問(wèn)的服務(wù)器的主機(jī)名或域名。 端口號(hào)(Port):指定服務(wù)器的端口號(hào),不同的協(xié)議和應(yīng)用程序使用不同的端口號(hào)。 路徑(Path):指定要訪問(wèn)的資源的路徑,即文件或文件夾的路徑。 查詢參數(shù)(Query Parameters):用于傳遞一些額外的信息給服務(wù)器,例如參數(shù)化的查詢條件。 查詢參數(shù)和路徑Path之間使用 ?分隔,多個(gè)查詢參數(shù)之間使用 & 分隔。
4.4.3 注意事項(xiàng)
URL地址是區(qū)分大小寫(xiě)的,因此在輸入時(shí)要注意大小寫(xiě)的一致性。 URL地址中不能包含非法字符,例如空格、特殊符號(hào)等。如果需要傳遞參數(shù)或附加信息,可以使用查詢參數(shù)或POST請(qǐng)求等方式。
4.5 請(qǐng)求方法
4.5.1 GET請(qǐng)求
? GET請(qǐng)求是HTTP協(xié)議中最常見(jiàn)的請(qǐng)求方式之一,它用于從服務(wù)器獲取數(shù)據(jù)。
? GET請(qǐng)求將查詢參數(shù)附加在URL之后,通過(guò)“?”符號(hào)進(jìn)行分隔。
查詢參數(shù) GET請(qǐng)求的參數(shù)通常以鍵值對(duì)的形式附加在URL之后。例如,以下URL中,“?name=John&age=25”是兩個(gè)查詢參數(shù),分別表示名字和年齡 http://example.com/users?name=John&age=25
注意事項(xiàng)
GET請(qǐng)求的參數(shù)是可見(jiàn)的,因此在URL中傳遞敏感信息時(shí)需謹(jǐn)慎。GET請(qǐng)求的長(zhǎng)度有限制,因?yàn)閁RL的長(zhǎng)度有限制,因此當(dāng)傳遞大量數(shù)據(jù)時(shí),應(yīng)考慮使用POST或其他方式。 發(fā)送GET請(qǐng)求 在瀏覽器中輸入U(xiǎn)RL地址確認(rèn)即可向服務(wù)端發(fā)送GET請(qǐng)求。 http://localhost:8080/v1/users/login?username=xxx&password=xxx
4.5.2 POST請(qǐng)求
? POST請(qǐng)求是另一種常見(jiàn)的HTTP請(qǐng)求方式,它用于向服務(wù)器提交數(shù)據(jù)。與GET請(qǐng)求不同,POST請(qǐng)求將數(shù)據(jù)放在請(qǐng)求體(Request Body)中,而不是URL中。
請(qǐng)求體
? POST請(qǐng)求的請(qǐng)求體中包含要提交的數(shù)據(jù)。這些數(shù)據(jù)可以是JSON、XML或其他格式。請(qǐng)求體中的數(shù)據(jù)通過(guò)Content-Type頭部指定。
請(qǐng)求示例 POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
Request Body: {"username": "john", "password": "secret"}
使用POST請(qǐng)求的注意事項(xiàng)
POST請(qǐng)求的數(shù)據(jù)是私密的,不會(huì)顯示在URL中,因此更適合傳遞敏感信息。 POST請(qǐng)求的長(zhǎng)度沒(méi)有限制,可以提交大量的數(shù)據(jù)。 發(fā)送POST請(qǐng)求 經(jīng)常在 form 表單中發(fā)送。
4.6 傳遞數(shù)據(jù)方式
客戶端向服務(wù)端傳遞數(shù)據(jù)的方式分為GET請(qǐng)求和POST請(qǐng)求兩種方式。
4.6.1 GET請(qǐng)求
在查詢參數(shù)中傳遞,比如:
http://localhost:8080/v1/users/login?username=xxx&password=xxx
4.6.2 POST請(qǐng)求
在請(qǐng)求體中傳遞,比如:
5 服務(wù)端接收參數(shù)
5.1 HttpServletRequest接收
HttpServletRequest是Java Servlet規(guī)范中定義的一個(gè)接口,它提供了與HTTP請(qǐng)求相關(guān)的方法和屬性。 在Java Web應(yīng)用程序中,當(dāng)客戶端發(fā)送HTTP請(qǐng)求時(shí),容器(例如Tomcat)會(huì)創(chuàng)建一個(gè)HttpServletRequest對(duì)象,該對(duì)象包含了客戶端請(qǐng)求的所有信息,如請(qǐng)求的URL、請(qǐng)求方法、請(qǐng)求頭、請(qǐng)求參數(shù)等。 在請(qǐng)求處理過(guò)程中,開(kāi)發(fā)人員可以使用HttpServletRequest對(duì)象來(lái)獲取客戶端發(fā)送過(guò)來(lái)的請(qǐng)求參數(shù)。通過(guò)調(diào)用HttpServletRequest的方法,可以獲取請(qǐng)求的參數(shù)名稱、參數(shù)值以及參數(shù)的數(shù)量等信息。
以上述案例為準(zhǔn),客戶端把用戶名和密碼信息傳遞給服務(wù)端,服務(wù)端接收傳遞過(guò)來(lái)的用戶名和密碼信息。
第1步:controller.UserController 處理請(qǐng)求 /**方式1:使用HttpServletRequest接收數(shù)據(jù)*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
return username + ":" + password;
}
第2步:重啟工程測(cè)試
5.2 聲明參數(shù)接收
可以在處理請(qǐng)求的方法中通過(guò) 聲明參數(shù)的方式 來(lái)接收客戶端傳遞過(guò)來(lái)的數(shù)據(jù)。
應(yīng)用分析
第1步:controller.UserController處理登錄請(qǐng)求 /**方式2:通過(guò)聲明參數(shù)的方式接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
// 好處:代碼簡(jiǎn)潔,并且可以自動(dòng)根據(jù)聲明的類型進(jìn)行轉(zhuǎn)換
public String login(String username, String password){
return "username = " + username + ", password = " + password;
}
第2步:重啟工程,執(zhí)行測(cè)試腳本測(cè)試
5.3 聲明POJO類接收
如果客戶端傳遞數(shù)據(jù)過(guò)多,通過(guò) HttpServletRequest 方式接收復(fù)用性較差,通過(guò) 聲明參數(shù)接收 又很繁瑣;所以可以將數(shù)據(jù)封裝到 POJO類 中來(lái)接收。
操作步驟
第1步:controller.UserController處理登錄請(qǐng)求 /**方式3:通過(guò)聲明Pojo類接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(User user){
return user.toString();
}
第2步:自定義pojo類,工程目錄下創(chuàng)建entity.User public class User {
// 客戶端傳遞幾個(gè)參數(shù),此處就有幾個(gè)屬性
private String username;
private String password;
// 省略 setter() getter() 和 toString() 方法
}
第3步:重啟工程后測(cè)試
6 HttpClient測(cè)試
6.1 HttpClient說(shuō)明
使用SpringMVC中提供的 .http 后綴的文件來(lái)測(cè)試 Controller 層接口。
使用三個(gè) # 號(hào) 作為不同測(cè)試方法的分隔符,也可以作為注釋說(shuō)明。
應(yīng)用分析
第1步:在test目錄下創(chuàng)建 Directory :http 第2步:創(chuàng)建 .http 后綴的文件進(jìn)行測(cè)試:testUserController.http ### GET請(qǐng)求測(cè)試
GET http://localhost:8080/v1/users/login?username=liying&password=123456
Accept: application/json
### POST請(qǐng)求測(cè)試
POST http://localhost:8080/v1/users/login
Content-Type: application/x-www-form-urlencoded
username=liying&password=123456
第3步:執(zhí)行對(duì)應(yīng)的請(qǐng)求方法測(cè)試
7 POJO
7.1 定義
Plain Ordinary Java Object:簡(jiǎn)單的Java對(duì)象;
是沒(méi)有繼承任何類或?qū)崿F(xiàn)任何接口的簡(jiǎn)單 Java 對(duì)象,也不依賴于其他復(fù)雜的框架或技術(shù);
POJO 對(duì)象通常包含了純粹的數(shù)據(jù)和簡(jiǎn)單的業(yè)務(wù)邏輯,是一種用于簡(jiǎn)化 Java 應(yīng)用程序開(kāi)發(fā)的編程模型;
是entity實(shí)體類、VO(Value Object或View Object)視圖對(duì)象、DTO(Data Transfer Object)數(shù)據(jù)傳輸對(duì)象 這3個(gè)對(duì)象的總稱。
7.2 entity實(shí)體類|DTO|VO
entity實(shí)體類作用 用來(lái)和數(shù)據(jù)庫(kù)中的表字段一一對(duì)應(yīng)的,比如UserEntity(id,username,password,nickname); DTO作用 用來(lái)接收客戶端傳遞給服務(wù)器的數(shù)據(jù)的,比如:UserLoginDTO(username,password) 實(shí)現(xiàn)登錄功能,客戶端向服務(wù)器端傳遞數(shù)據(jù); VO作用 用來(lái)處理服務(wù)器響應(yīng)給客戶端的數(shù)據(jù)的,比如:UserListVO(id,username,nickname) 登錄成功后的列表頁(yè)顯示當(dāng)前用戶信息。
柚子快報(bào)激活碼778899分享:SpringMVC詳解
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。