摘要:是提供的類,為了在容器中建立容器而服務的。主要處理的請求分發,對進行管理。接收到請求由進行匹配,匹配成功后交由進行業務邏輯的處理,業務邏輯處理完成后交由進行數據的解析同時找到對應的,最終由將的結果到瀏覽器進行解析。
spring給我們帶來了什么?
spring IoC、AOP、Transaction這些都是很重要的特性,但是這篇這些都不是主角,主要來談談springMVC是如何對請求參數進行解析封裝的,以及簡單的介紹spring是怎么進行http請求路由的。
0x01 springMVC工程的建立本篇就不過多介紹springMVC的工程的新建過程,此次調試springMVC源碼新建的工程目錄如下,通過maven管理的工程:
在進行springMVC的開發過程中我們都會在web.xml文件中進行下面一些配置,但是這些配置都是用來干嘛的呢?
contextConfigLocation classpath:config/applicationContext.xml org.springframework.web.context.ContextLoaderListener logbackConfigLocation classpath:logconfig/logback.xml ch.qos.logback.ext.spring.web.LogbackConfigListener springMvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:config/applicationMvcContext.xml springMvc /
這里著重介紹ContextLoaderListener和DispatcherServlet。
ContextLoaderListener是spring提供的類,為了在web容器中建立IoC容器而服務的。它實現了ServletContextListener這個接口,通過這個接口的方法實現servlet生命周期的回調,在這個過程中會通過XmlWebApplicationContext去加載bean的配置創建IoC容器。
DispatcherServlet作為一個前端控制器,他會去加載另一個bean的配置形成一個IoC容器,這個IoC會將ContextLoaderListener加載的IoC容器作為父容器,這樣的好處是從DispatcherServlet容器中getBean也能取到父容器中的bean,他會先去父容器中看有沒有,如果找到直接返回了。DispatcherServlet 主要處理HTTP的請求分發(HandlerMapping),對controller、viewresolver、view進行管理。DispatcherServlet接收到請求由HandlerMapping進行匹配,匹配成功后交由controller進行業務邏輯的處理,業務邏輯處理完成后交由viewresolver進行數據的解析同時找到對應的view,最終由DispatcherServlet將view的結果render到瀏覽器進行解析。
0x03 controller的參數是如何被解析的
在開發過程中遇到下面這樣的controller方法怎么也得到不到us值,
public String printWelcome(ModelMap model,ArrayList
如果改成下面這樣就可以正常得到us的值
public String printWelcome(ModelMap model,String us){}
這是為什么?怎么解決?
搜索后發現這樣可以解決問題,但是sowhat?
public String printWelcome(ModelMap model,@RequestParam("us[]") List
所以需要來剖析下springMVC的源代碼了,發現spring是通過下面這個方法進行controller參數解析的。
org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHandlerArguments
解析參數值的代碼(里面好多if else啊):
從這個圖片可以看到通過if去判斷paramName對應controller方法中的@RequestParam,pathVarName對應@PathVariable,沒有加任何修飾會進入到attrName這個分支里面去解析參數。在解析的過程中會通過函數的參數類型去組裝對象傳遞到RequestMapping類的方法中。
如果是下面這樣的方法參數又會怎樣
public String printWelcome(ModelMap model,@RequestParam("us[]") List
User是自定義的參數,spring會對這種參數進行一個特殊的處理處理方法如下:
org.springframework.beans.TypeConverterDelegate#convertIfNecessary
在這個方法中有一段處理的代碼,會根據List內部元素類型去判斷類型是不準確并賦值。
到這里應該和controller相關的注解可以隨便用了吧?
0x04 感想在學校期間一直用著C、C++進行開發,其實也沒怎么開發,只是作為裝逼的一種手段,如今踏入工作崗位開始離C、C++很遠了,又開始了0基礎JAVA開發。作為一個門外漢來觀望spring。
spring的東西太多了,也很權威大家基本上都用,所以后面還學要加強這方面的探索和學習,期待后面自己還能將spring的學習感想記錄下來。這篇是在進行開發的過程中遇到上面提到的一個問題所以想深入了解其背后的實現方式,未來繼續spring。
在學習spring的過程中可以參考計文柯著的spring技術內幕,里面結合代碼講解了spring的各個重要的技術,需要一定的基礎再去看比較好,值得推薦。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65948.html
摘要:請求旅程的第一站是的。的任務是將請求發送控制器控制器是一個用于處理請求的組件。處理映射器根據請求攜帶的信息來進行決策。這樣的結果就是,只能找到顯示聲明在配置類中的控制器。 構建Spring Web應用 說明 如果你有幸能看到。 1、本文參考了《Spring 實戰》重點內容,參考了GitHub上的代碼 2、本文只為記錄作為以后參考,要想真正領悟Spring的強大,請看原書。 3、在一次...
摘要:的框架用于解決上述提到的問題,基于模型,可以幫助開發人員構建靈活易擴展的應用。在這一章中,將專注于構建該應用的層,創建控制器和顯示,以及處理用戶注冊的表單。類有兩個靜態接口,代表兩種模擬服務的方式獨立測試和集成測試。 主要內容 將web請求映射到Spring控制器 綁定form參數 驗證表單提交的參數 寫在前面:關于Java Web,首先推薦一篇文章——寫給java web一年左右...
摘要:是目前最流行的一種互聯網軟件架構。協議,是一個無狀態協議,即所有的狀態都保存在服務器端。而這種轉化是建立在表現層之上的,所以就是表現層狀態轉化。具體說,就是協議里面,四個表示操作方式的動詞。 一、SpringMVC概述 Spring為展現層提供的基于MVC設計理念的優秀的Web框架,是目前最主流的MVC框架之一 Spring3.0之后全面超越Struts2,成為最優秀的MVC框架 S...
摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節因不同的實現而不相同。該參數是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:例如,將請求信息中的字符串格式參數轉換為對應方法中的類類型入參可通過的屬性注冊自定義轉換器。 1. 處理流程 請求提交給DispatchServlet 查找HandlerMapping 調用由HandlerAdapter封裝后的Handler 返回ModelAndView到DispatcherServlet 借由ViewResolver完成邏輯視圖到真實視圖的轉換 返回響應 2. ...
閱讀 2621·2021-11-25 09:43
閱讀 2725·2021-11-04 16:09
閱讀 1636·2021-10-12 10:13
閱讀 881·2021-09-29 09:35
閱讀 880·2021-08-03 14:03
閱讀 1777·2019-08-30 15:55
閱讀 2989·2019-08-28 18:14
閱讀 3489·2019-08-26 13:43