整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          SpringMVC知識 day02 常用注解&amp

          SpringMVC知識 day02 常用注解&響應(yīng)數(shù)據(jù)&文件上傳

          、常用注解

          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功能:

          • 一鍵生成url和參數(shù)
          • 發(fā)送請求調(diào)試API(支持修改生成的參數(shù))
          • 域名定制及切換
          • 自定義參數(shù)解析
          • 字符串生成策略化
          • 保存API
          • 管理API(搜索過濾、修改API名稱)
          • 一鍵定位歷史保存的API到方法
          • API轉(zhuǎn)curl

          安裝:

          在IDEA插件Plugins中直接搜索Restful Fast Request

          使用示例:

          • 調(diào)試API發(fā)送請求

          • 針對響應(yīng)是文件的API

          點(diǎn)擊Send and download

          • API列表

          API列表name取值:

          1.如果方法使用了swagger的@io.swagger.annotations.ApiOperation,則取該注解的value值

          2.如果沒有swagger直接修飾,則取方法的javaDoc描述

          3.如果意思都沒有則返回New Request

          API的name值支持修改

          • 保存請求

          保存的請求默認(rèn)會放入Default Group中,支持拉拽放入別的組

          • 重新生成請求

          如果你已經(jīng)保存一個請求,但是想徹底重新修改其中的參數(shù),那么你可以選擇該操作

          • CURL 拷貝

          必須是先生成方法url及參數(shù)后,點(diǎn)擊工具欄

          • 快速添加header

          如果你的請求需要一個token而token可以通過一個登陸接口得到,那么你可以不用每次手動添加,只需要訪問一下登錄接口再通過以下操作來處理

          更多內(nèi)容大家可自行前往閱讀。

          開源地址:fast-request: IntelliJ plugin Restful Fast Request一個基于springmvc的幫助你快速生成url和參數(shù)的IDEA 插件。IDEA 版postman工具

          — 完 —

          . SpringMVC執(zhí)行流程

          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é)果渲染給客戶。

          2. 創(chuàng)建SpringMVC的三大組件

          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">

          總結(jié):

          SpirngMVC的執(zhí)行流程,其實(shí)非常簡單。 核心三大處理器處理器映射器(HandlerMapping) 處理URL找到對應(yīng)處理器(Handler),并將其返回給前端控制器。

          如果你還沒有掌握這些技術(shù),可以點(diǎn)贊+轉(zhuǎn)發(fā)私信回復(fù)【Java】來獲取完整的體系資料。


          主站蜘蛛池模板: 久久精品日韩一区国产二区 | 日韩一区二区三区在线观看| 国产福利无码一区在线| 国产成人一区二区动漫精品| 久久精品免费一区二区| 国内精品无码一区二区三区| 视频一区二区三区在线观看| 日韩一区二区a片免费观看| 亚洲一区二区三区免费在线观看| 精品视频在线观看你懂的一区| 国产主播一区二区三区| 在线播放精品一区二区啪视频| 99久久精品午夜一区二区| 精品人伦一区二区三区潘金莲| 国产一区二区三区乱码| 果冻传媒董小宛一区二区| 国产一区二区不卡在线播放| 国产激情一区二区三区 | 亚洲国产精品一区二区第四页 | 91午夜精品亚洲一区二区三区| 亚洲日本一区二区一本一道 | 日韩人妻无码一区二区三区99| 国产一区二区三区乱码| 久久精品一区二区国产| 一区二区免费视频| 无码国产精品一区二区免费式影视| 人妻少妇久久中文字幕一区二区| 日韩精品无码中文字幕一区二区| 亚洲AV无码一区东京热| 亚洲欧洲一区二区| 亚洲一区二区三区国产精华液| 成人精品视频一区二区| 波多野结衣一区二区三区高清在线 | 久久久无码一区二区三区| 精品一区二区三区四区在线播放| 激情亚洲一区国产精品| 日韩视频在线一区| 国产福利电影一区二区三区久久老子无码午夜伦不 | 国产乱码精品一区二区三区 | 国产在线精品一区二区夜色| 九九久久99综合一区二区|