、常用注解
1.1 RequestParam
1.1.1 使用說明
作用: 把請求中指定名稱的參數(shù)給控制器中的形參賦值。
屬性:
value:請求參數(shù)中的名稱。
required:請求參數(shù)中是否必須提供此參數(shù)。默認(rèn)值:true。表示必須提供,如果不提供將報錯。
1.1.2 使用示例
1.2 RequestBody
1.2.1 使用說明
作用:
用于獲取請求體內(nèi)容。直接使用得到是 key=value&key=value...結(jié)構(gòu)的數(shù)據(jù)。 get 請求方式不適用。
屬性:
required:是否必須有請求體。默認(rèn)值是true。當(dāng)取值為 true 時,get 請求方式會報錯。如果取值為false,get 請求得到是 null。
1.2.2 使用示例
1.3 PathVaribale
1.3.1 使用說明
作用:
用于綁定 url 中的占位符。例如:請求url中/delete/{id},這個{id}就是url占位符。是springmvc 支持 rest 風(fēng)格 URL 的一個重要標(biāo)志。
屬性:
value:用于指定 url 中占位符名稱。
required:是否必須提供占位符。
1.3.2 使用示例
1.3.3 REST 風(fēng)格 URL
什么是 rest:
REST(英文:Representational State Transfer,簡稱 REST)描述了一個架構(gòu)樣式的網(wǎng)絡(luò)系統(tǒng), 比如 web 應(yīng)用程序。它首次出現(xiàn)在 2000 年 Roy Fielding 的博士論文中,他是 HTTP 規(guī)范的主要編寫者之 一。在目前主流的三種 Web 服務(wù)交互方案中,REST 相比于 SOAP(Simple Object Access protocol,簡單對象訪問協(xié)議)以及 XML-RPC 更加簡單明了,無論是對 URL 的處理還是對 Payload 的編碼,REST 都傾向于用更加簡單輕量的方法設(shè)計和實(shí)現(xiàn)。值得注意的是 REST 并沒有一個明確的標(biāo)準(zhǔn),而更像是一種設(shè)計的風(fēng)格。
它本身并沒有什么實(shí)用性,其核心價值在于如何設(shè)計出符合 REST 風(fēng)格的網(wǎng)絡(luò)接口。
restful 的優(yōu)點(diǎn):它結(jié)構(gòu)清晰、符合標(biāo)準(zhǔn)、易于理解、擴(kuò)展方便,所以正得到越來越多網(wǎng)站的采用。
restful 的特性:
資源(Resources):網(wǎng)絡(luò)上的一個實(shí)體,或者說是網(wǎng)絡(luò)上的一個具體信息。 它可以是一段文本、一張圖片、一首歌曲、一種服務(wù),總之就是一個具體的存在。可以用一個 URI(統(tǒng)一資源定位符)指向它,每種資源對應(yīng)一個特定的 URI 。要獲取這個資源,訪問它的 URI 就可以,因此 URI 即為每一個資源的獨(dú)一無二的識別符。
表現(xiàn)層(Representation):把資源具體呈現(xiàn)出來的形式,叫做它的表現(xiàn)層 (Representation)。 比如,文本可以用 txt 格式表現(xiàn),也可以用 HTML 格式、XML 格式、JSON 格式表現(xiàn),甚至可以采用二 進(jìn)制格式。
狀態(tài)轉(zhuǎn)化(State Transfer):每發(fā)出一個請求,就代表了客戶端和服務(wù)器的一次交互過程。 HTTP 協(xié)議,是一個無狀態(tài)協(xié)議,即所有的狀態(tài)都保存在服務(wù)器端。因此,如果客戶端想要操作服務(wù)器, 必須通過某種手段,讓服務(wù)器端發(fā)生“狀態(tài)轉(zhuǎn)化”(State Transfer)。而這種轉(zhuǎn)化是建立在表現(xiàn)層之上的,所以就是 “表現(xiàn)層狀態(tài)轉(zhuǎn)化”。具體說,就是 HTTP 協(xié)議里面,四個表示操作方式的動詞:GET 、POST 、PUT、 DELETE。它們分別對應(yīng)四種基本操作:GET 用來獲取資源,POST 用來新建資源,PUT 用來更新資源,DELETE 用來刪除資源。
1.3.4 基于 HiddentHttpMethodFilter 的示例
作用: 由于瀏覽器 form 表單只支持 GET 與 POST 請求,而 DELETE、PUT 等 method 并不支持,Spring3.0 添 加了一個過濾器,可以將瀏覽器請求改為指定的請求方式,發(fā)送給我們的控制器方法,使得支持 GET、POST、PUT 與 DELETE 請求。
使用方法:
第一步:在 web.xml 中配置該過濾器。
第二步:請求方式必須使用 post 請求。
第三步:按照要求提供_method 請求參數(shù),該參數(shù)的取值就是我們需要的請求方式。
1.4 RequestHeader
1.4.1 使用說明
作用: 用于獲取請求消息頭。
屬性: value:提供消息頭名稱
required:是否必須有此消息頭
注: 在實(shí)際開發(fā)中一般不怎么用。
1.5 CookieValue
1.5.1 使用說明
作用: 用于把指定 cookie 名稱的值傳入控制器方法參數(shù)。
屬性: value:指定 cookie 的名稱。
required:是否必須有此 cookie。
1.5.2 使用舉例:
1.6 ModelAttribute
1.6.1 使用說明
作用:
該注解是 SpringMVC4.3 版本以后新加入的。它可以用于修飾方法和參數(shù)。 出現(xiàn)在方法上,表示當(dāng)前方法會在控制器的方法執(zhí)行之前,先執(zhí)行。它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。
出現(xiàn)在參數(shù)上,獲取指定的數(shù)據(jù)給參數(shù)賦值。
屬性:
value:用于獲取數(shù)據(jù)的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結(jié)構(gòu)的 key。
應(yīng)用場景:
當(dāng)表單提交數(shù)據(jù)不是完整的實(shí)體類數(shù)據(jù)時,保證沒有提交數(shù)據(jù)的字段使用數(shù)據(jù)庫對象原來的數(shù)據(jù)。
例如: 我們在編輯一個用戶時,用戶有一個創(chuàng)建信息字段,該字段的值是不允許被修改的。在提交表單數(shù)據(jù)是肯定沒有此字段的內(nèi)容,一旦更新會把該字段內(nèi)容置為 null,此時就可以使用此注解解決問題。
1.7 SessionAttribute
1.7.1 使用說明
作用: 用于多次執(zhí)行控制器方法間的參數(shù)共享。
屬性: value:用于指定存入的屬性名稱
type:用于指定存入的數(shù)據(jù)類型。
二、響應(yīng)數(shù)據(jù)和結(jié)果視圖
2.1 返回值分類
2.1.1 字符串
2.1.2 void
Servlet 原始 API 可以作為控制器中方法的參數(shù): @RequestMapping("/testReturnVoid")
public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception { }
在 controller 方法形參上可以定義 request 和 response,使用 request 或 response 指定響應(yīng)結(jié)果:
1、使用 request 轉(zhuǎn)向頁面,如下:
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
2、也可以通過 response 頁面重定向: response.sendRedirect("testRetrunString")
3、也可以通過 response 指定響應(yīng)結(jié)果,例如響應(yīng) json 數(shù)據(jù): response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json 串");
2.1.3 ModelAndView
ModelAndView 是 SpringMVC 為我們提供的一個對象,該對象也可以用作控制器方法的返回值。
示例代碼:
@RequestMapping("/testReturnModelAndView")
public ModelAndView testReturnModelAndView() {
ModelAndView mv=new ModelAndView();
mv.addObject("username", "張三");
mv.setViewName("success");
return mv;
}
2.2 轉(zhuǎn)發(fā)和重定向
2.2.1 forward 轉(zhuǎn)發(fā)
controller 方法在提供了 String 類型的返回值之后,默認(rèn)就是請求轉(zhuǎn)發(fā)。我們也可以寫成:
@RequestMapping("/testForward")
public String testForward() {
System.out.println("AccountController 的 testForward 方法執(zhí)行了");
return "forward:/WEB-INF/pages/success.jsp";
}
注意:如果用了formward:則路徑必須寫成實(shí)際視圖url,不能寫邏輯視圖。
它相當(dāng)于“request.getRequestDispatcher("url").forward(request,response)”使用請求 轉(zhuǎn)發(fā),既可以轉(zhuǎn)發(fā)到 jsp,也可以轉(zhuǎn)發(fā)到其他的控制器方法。
2.2.2 Redirect 重定向
2.3 ResponseBody 響應(yīng) json 數(shù)據(jù)
2.3.1 使用說明
作用: 該注解用于將 Controller 的方法返回的對象,通過 HttpMessageConverter 接口轉(zhuǎn)換為指定格式的數(shù)據(jù),如:json,xml 等,通過Response響應(yīng)給客戶端
2.3.2 使用示例
需求: 使用@ResponseBody 注解實(shí)現(xiàn)將 controller 方法返回對象轉(zhuǎn)換為 json 響應(yīng)給客戶端。
前置知識點(diǎn): Springmvc 默認(rèn)用 MappingJacksonHttpMessageConverter 對 json 數(shù)據(jù)進(jìn)行轉(zhuǎn)換,需要加入 jackson 的包。
jsp 中的代碼:
控制器中的代碼:
三、SpringMVC 實(shí)現(xiàn)文件上傳
3.1 文件上傳的回顧
3.1.1 文件上傳的必要前提
3.1.2 文件上傳的原理分析
3.1.3 借助第三方組件實(shí)現(xiàn)文件上傳
3.2 springmvc 傳統(tǒng)方式的文件上傳
3.2.1 說明
傳統(tǒng)方式的文件上傳,指的是我們上傳的文件和訪問的應(yīng)用存在于同一臺服務(wù)器上。 并且上傳完成之后,瀏覽器可能跳轉(zhuǎn)。
3.2.2 實(shí)現(xiàn)步驟
3.2.2.1 第一步:拷貝文件上傳的 jar 包到工程的 lib 目錄
3.2.2.2 第二步:編寫 jsp 頁面
3.2.2.3 第三步:編寫控制器
3.2.2.4 第四步:配置文件解析器
3.3 springmvc 跨服務(wù)器方式的文件上傳
3.3.1 分服務(wù)器的目的
在實(shí)際開發(fā)中,我們會有很多處理不同功能的服務(wù)器。例如:
應(yīng)用服務(wù)器:負(fù)責(zé)部署我們的應(yīng)用
數(shù)據(jù)庫服務(wù)器:運(yùn)行我們的數(shù)據(jù)庫
緩存和消息服務(wù)器:負(fù)責(zé)處理大并發(fā)訪問的緩存和消息
文件服務(wù)器:負(fù)責(zé)存儲用戶上傳文件的服務(wù)器。
分服務(wù)器處理的目的是讓服務(wù)器各司其職,從而提高我們項(xiàng)目的運(yùn)行效率。
3.3.2 準(zhǔn)備兩個 tomcat 服務(wù)器,并創(chuàng)建一個用于存放圖片的 web 工程
3.3.3 拷貝 jar 包
3.3.4 編寫控制器實(shí)現(xiàn)上傳圖片
3.3.5 編寫 jsp 頁面
3.3.6 配置解析器
開源精選》是我們分享Github、Gitee等開源社區(qū)中優(yōu)質(zhì)項(xiàng)目的欄目,包括技術(shù)、學(xué)習(xí)、實(shí)用與各種有趣的內(nèi)容。本期推薦的是一個基于springmvc的快速生成url和參數(shù) 的IDEA 插件——Restful Fast Request。
Restful Fast Request是一個基于springmvc的幫助你快速生成url和參數(shù) 的IDEA 插件。同時也是一個http client工具,只需按一下方法左側(cè)的火箭小圖標(biāo),插件會自動生成方法的url和參數(shù)顯示在工具窗口,再點(diǎn)擊發(fā)送請求即可在IDEA內(nèi)完成API調(diào)試,并且可以保存歷史請求,方便多次使用調(diào)試。
Restful Fast Request功能:
安裝:
在IDEA插件Plugins中直接搜索Restful Fast Request
使用示例:
點(diǎn)擊Send and download
API列表name取值:
1.如果方法使用了swagger的@io.swagger.annotations.ApiOperation,則取該注解的value值
2.如果沒有swagger直接修飾,則取方法的javaDoc描述
3.如果意思都沒有則返回New Request
API的name值支持修改
保存的請求默認(rèn)會放入Default Group中,支持拉拽放入別的組
如果你已經(jīng)保存一個請求,但是想徹底重新修改其中的參數(shù),那么你可以選擇該操作
必須是先生成方法url及參數(shù)后,點(diǎn)擊工具欄
如果你的請求需要一個token而token可以通過一個登陸接口得到,那么你可以不用每次手動添加,只需要訪問一下登錄接口再通過以下操作來處理
更多內(nèi)容大家可自行前往閱讀。
開源地址:fast-request: IntelliJ plugin Restful Fast Request一個基于springmvc的幫助你快速生成url和參數(shù)的IDEA 插件。IDEA 版postman工具
— 完 —
1.1 SpringMVC三大核心組件
1.HandlerMapping處理器映射器:建立地址與方法的映射。
HandlerMapping負(fù)責(zé)根據(jù)用戶請求url找到Handler即處理器,springmvc提供了不同的映射器實(shí)現(xiàn)不同的映射方式,例如:配置文件方式,實(shí)現(xiàn)接口方式,注解方式等。
2.HandlerAdapter處理器適配器:根據(jù)地址調(diào)用方法。
Handler 是繼DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進(jìn)行處理。
3.ViewResolver 視圖解析器:處理ModelAndView數(shù)據(jù)和視圖。
ViewResolver通過HandlerAdapter對處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過擴(kuò)展適配器可以對更多類型的處理器進(jìn)行執(zhí)行。
1.2 SpringMVC執(zhí)行流程圖
流程圖
1.3 Spring執(zhí)行流程具體步驟(參考圖)
1.用戶發(fā)送請求至前端控制器DispatcherServlet。
2.DispatcherServlet收到請求調(diào)用HandlerMapping處理器映射器。
3.處理器映射器根據(jù)請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一并返回給DispatcherServlet。
4.DispatcherServlet通過HandlerAdapter處理器適配器調(diào)用處理器。
5.執(zhí)行處理器(Controller層,也叫后端控制器)。
6.Controller執(zhí)行完成返回數(shù)據(jù)和視圖(ModelAndView)。
7.HandlerAdapter將controller執(zhí)行結(jié)果ModelAndView返回給DispatcherServlet。
8.DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
9.ViewReslover解析后返回具體的View視圖(JSP / HTML)。
10.DispatcherServlet對View進(jìn)行渲染視圖(即將模型數(shù)據(jù)填充至視圖中)。
11.DispatcherServlet響應(yīng)用戶,用戶看到界面和數(shù)據(jù)。
1.4 總結(jié)流程
Spring MVC所有的請求都經(jīng)過DispatcherServlet來統(tǒng)一分發(fā)。DispatcherServlet將請求分發(fā)給Controller之前,需要借助于Spring MVC提供的HandlerMapping定位到具體的Controller。
HandlerMapping接口負(fù)責(zé)完成客戶請求到Controller映射。
Controller接口將處理用戶請求,這和Java Servlet扮演的角色是一致的。一旦Controller處理完用戶請求,則返回ModelAndView(數(shù)據(jù)和視圖)對象給DispatcherServlet前端控制器。從宏觀角度考慮,DispatcherServlet是整個Web應(yīng)用的控制器;從微觀考慮,Controller是單個Http請求處理過程中的控制器,而ModelAndView是Http請求過程中返回的模型(Model)和視圖(View)。
返回的視圖需要通過ViewResolver接口(視圖解析器)在Web應(yīng)用中負(fù)責(zé)查找View對象,從而將相應(yīng)結(jié)果渲染給客戶。
SpringMVC中默認(rèn)提供的三大組件有可能過時,我們可以手動設(shè)置這三大組件,一般只需要設(shè)置ViewResolver 視圖解析器,設(shè)置它的前綴prefix和后綴suffix
2.1 手動一個個的設(shè)置處理器映射器(不推薦)
<!--方式1:手動一個個設(shè)置 -->
<!-- 處理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!--處理器適配器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
2.2 模型驅(qū)動配置處理器映射器和處理器適配器,配置視圖解析器【***】
<!--方式2:配置處理器映射器和處理器適配器 -->
<!-- 在選擇mvc標(biāo)簽時,一定要選擇最后的路徑是/mvc的選項(xiàng) -->
<!-- 這行配置可以替換掉上邊的兩行配置(一步步設(shè)置) -->
<mvc:annotation-driven/>
<!-- 配置視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前綴和后綴 相當(dāng)于 //WEB-INF/jsp/Xxx.jsp-->
<!--定義頁面路徑的前綴-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--定義頁面路徑的后綴-->
<property name="suffix" value=".jsp"/>
</bean>
2.3【注意】如果mvc標(biāo)簽無效,頭文件模板。
<mvc:annotation-driven/>無效,可能是頭文件不對,下面是一個參考。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
SpirngMVC的執(zhí)行流程,其實(shí)非常簡單。 核心三大處理器處理器映射器(HandlerMapping) 處理URL找到對應(yīng)處理器(Handler),并將其返回給前端控制器。
如果你還沒有掌握這些技術(shù),可以點(diǎn)贊+轉(zhuǎn)發(fā)后私信回復(fù)【Java】來獲取完整的體系資料。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。