javascript
【SSM框架系列】Spring-MVC的组件解析
SpringMVC完整執行流程
用戶發送請求至前端控制器DispatcherServlet。
DispatcherServlet收到請求調用HandlerMapping處理器映射器。
處理器映射器找到具體的處理器(可以根據xml配置、注解等方式查找),生成HandlerExecutionChain(包含Handler及Handler攔截器)返回給DispatcherServlet。
DispatcherServlet調用HandlerAdapter處理器適配器。
HandlerAdapter經過適配調用具體的處理器(Controller,也叫后端控制器)。
Controller執行完成返回ModelAndView。
HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
ViewReslover解析后返回具體View。
DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
DispatcherServlet響應用戶。
以上步驟中,DispatchServlet、HandlerMapping、HandlerAdapter和ViewResolver等對象協同工作,共同完成了SpringMVC請求–>響應的整個工作流程。但是這些對象和流程對于開發者來說都是不可見的,開發者并不需要關系這些對象時如何工作的,只需要在Handler(也就是Controller)中完成對請求的業務處理。
Spring-MVC組件解析
前端控制器:DispatcherServlet
- 用戶請求到達DispatcherServlet,將由其進行分發,只分發不處理,它負責統一調度各個組件之間的調用,是整個請求響應的控制中心。DispatcherServlet降低了各個組件之間的耦合度
處理器映射器:HandlerMapping
-
HandlerMapping負責生成Handler。
-
DispatcherServlet解析請求的URL得到URI(請求資源標識符),然后根據URI調用處理器映射器(HandlerMapping)獲得具體的Handler,以執行鏈(HandlerExecutionChain)的形式,將處理器對象(Handler)和處理器攔截器(HandlerInterceptor)返回給DispatcherServlet。
-
SpringMVC 提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,注解方式等。
處理器適配器:HandlerAdapter
-
DispatcherServlet根據獲取的Handler,選擇一個合適的HandlerAdapter。
-
HandlerAdapter是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
處理器:Handler
-
Handler就是要編寫的具體業務控制器Controller。
-
提取Request中的模型數據,填充Handler入參,開始執行Handler;在填充Handler入參的過程中,根據配置Spring將做一些額外的工作:
- HttpMessageConveter:將請求消息(如Json、XML等數據)轉換成一個對象,將對象轉換為指定的響應消息;
- 數據轉換:將請求消息進行數據轉換。例如:String轉換成Integer、Double等;
- 數據格式化:對請求消息進行數據格式化。例如:將字符串轉換成格式化數字或格式化日期等;
- 數據驗證:驗證數據的有效性(長度、格式等),驗證結果存儲到BingdingResult或Error中;
視圖解析器:ViewResolver
-
ViewResolver 負責將處理結果生成 View 視圖。
-
Handler執行完成后,HandlerAdaptor向DispatcherServlet返回一個ModelAndView對象,其中view是視圖名稱,并不是真正的視圖對象;根據ModelAndView選擇一個合適的ViewResolver對象,ViewResolver對象把DispatcherServlet提供的ModelAndView解析成視圖View對象(JSP)。
視圖:View
-
最常見的視圖View是Jsp
-
DispatcherServlet對視圖View進行渲染(將模型數據填充到視圖中),響應給用戶。
-
SpringMVC 框架提供了很多的 View 視圖類型的支持,包括:jsp、jstlView、freemarkerView、pdfView等。
Spring-MVC注解
@RequestMapping
作用:用于建立請求 URL 和處理請求方法之間的對應關系
書寫位置:
類上,請求URL 的第一級訪問目錄。此處不寫的話,就相當于應用的根目錄方法上,請求 URL 的第二級訪問目錄,與類上的使用@ReqquestMapping標注的一級目錄一起組成訪問虛擬路徑屬性:
value:用于指定請求的URL。它和path屬性的作用是一樣的method:用于指定請求的方式,值為枚舉類型params:用于指定限制請求參數的條件。它支持簡單的表達式。要求請求參數的key和value必須和配置的一模一樣例如:
params = {"accountName"},表示請求參數必須有accountNameparams = {"moeny!100"},表示請求參數中money不能是100@PostMapping
相當于@RequestMapping(method={RequestMethod.POST})@GetMapping
相當于@RequestMapping(method={RequestMethod.GET})@params 限定請求參數
// 有時候要求請求必須攜帶某個參數,比方說token,可以使用下屬寫法:@RequestMapping(value = "test2_4",params = "token"){//拿到token進行處理 }// 這個時候如果請求參數里面沒有token,請求將不會成功@RequestHeader 限制請求頭
做接口開發時,因為移動端可能是IOS,也有可能是Android,需要對不同設備做不同處理, 這個時候可以添加一個device_type(名字任意,見名知意即可)的請求頭,寫法如下:public String test2_5(@RequestHeader String device_type,){//獲取設備類型進行判斷處理}而且隨著版本的更新,高版本可能會支持一些新特性,但是低版本支持不了, 這個時候也可以通過添加請求頭的方式處理,寫法如下://對于軟件版本的請求頭,老版本的app可能不支持,只需要在@RequestHeader內添加required = false即可,默認值為true。public String test2_5(@RequestHeader String device_type,@RequestHeader(required = false) String app_version){//獲取設備類型、軟件版本進行判斷處理}代碼演示
<!-- 組件掃描。 --> <context:component-scan base-package=“com.itheima.controller"/> @Controller @RequestMapping("/user") public class QuickController {//value的值用于表示訪問地址值//method的值用于限定請求的方式,常用的是get和post,分別用RequestMethod.GET和RequestMethod.post表示//params可以對傳遞參數進行限制,params={"username"}用于要去請求參數必須含有username@RequestMapping(value="/quick",method= RequestMethod.GET,params={"username"})public String quickMethod(){System.out.println("quickMethod running.....");return "/success.jsp";} }SpringMVC的XML配置解析
視圖解析的請求轉發和重定向
直接在Controller類中的方法中返回一個字符串,SpringMVC會幫助我們找到對應的視圖資源,默認使用請求轉發方式。
return "/index.jsp";//上述代碼相當于 return "forward:/index.jsp";可以在字符串前添加redirect改為請求重定向。
return "redirect:/index.jsp";內置資源視圖解析器的前綴和后綴
可以在SpringMVC的配置文件中通過配置優化Controller返回的視圖(視圖名)
<bean class="org.srpingframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/pages/"/><property name="suffix" value=".jsp"/></bean>上述配置其實就是配置了一個Bean,用配置的方式修改了這個Bean里面的兩個屬性值。
這樣配置之后,Controller內方法最終返回的視圖名稱就是
//前綴prefix值+方法返回值+后綴suffix值 即:/pages/index.jspreturn "index";重定向和內置資源視圖解析器配合使用
如果想要同時使用重定向和內置資源視圖解析器的前后綴,不能直接寫成:
//SpringMVC沒有這么智能,可以幫你截串之后再拼接成redirect:/pages/index.jspreturn "redirect:index";如果想要讓redirect生效,只能手動把路徑寫全,如下:
//手動添加了redirect或者forward后,內置資源視圖解析器內置資源視圖解析器不會再幫你補全路徑,需要手動寫全return "redirect:/pages/index.jsp";SpringMVC有默認組件配置,默認組件都是DispatcherServlet.properties配置文件中配置的,該配置文件地址org/springframework/web/servlet/DispatcherServlet.properties,該文件中配置了默認的視圖解析器,如下:
org.springframework.web.servlet.ViewResolver = org.springframework.web.servlet.view.InternalResourceViewResolver翻看該解析器源碼,可以看到該解析器的默認設置,如下:
REDIRECT_URL_PREFIX = "redirect:" --重定向前綴FORWARD_URL_PREFIX = "forward:" --轉發前綴(默認值)prefix = ""; --視圖名稱前綴suffix = ""; --視圖名稱后綴 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【SSM框架系列】Spring-MVC的组件解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【工具类】加密工具---MD5使用
- 下一篇: 【SSM框架系列】SpringMVC的请