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