新的一年,開(kāi)啟新的篇章,歐氣滿滿,迎接未來(lái).
前幾天回顧了spring相關(guān)的知識(shí)點(diǎn),現(xiàn)在再來(lái)回顧下springmvc相關(guān)的知識(shí)點(diǎn)做一下總結(jié).
問(wèn)題總結(jié)
之前面試問(wèn)題總結(jié)的那篇文章中,與springmvc相關(guān)的有哪些問(wèn)題:
springmvc的工作流程?
springmvc dispatcherservlet與handleradapter如何關(guān)聯(lián)?
有了springmvc的IOC容器,還需要spring的IOC容器嗎?為什么?如何處理兼容問(wèn)題?
tomcat容器如何與springmvc的dispatcherservlet通信的?
問(wèn)題梳理
springmvc的工作流程
我根據(jù)springmvc的流程將流程圖畫(huà)了出來(lái):

請(qǐng)求過(guò)來(lái)之后,dispatcherServlet的url-pattern攔截請(qǐng)求;
判斷在springmvc中是否存在對(duì)應(yīng)映射;
若不存在,判斷是否配置
如果配置,就會(huì)找到目標(biāo)資源,沒(méi)有則顯示404頁(yè)面;
如果映射存在,則由handlerMapping獲handlerExecutionChain對(duì)象;(注意兩點(diǎn):
① handlerMapping定義了請(qǐng)求到處理器之間的映射,如果發(fā)送的請(qǐng)求是沒(méi)有映射的,那么得到的handlerExecutionChain也不為空,而是默認(rèn)的defaultServletHTTPRequestHandler,用來(lái)處理靜態(tài)資源等(配置了default-servlet-handler,否則報(bào)為404);
② handlerExecutionChain實(shí)際上包含了攔截器和目標(biāo)方法.)
獲取HandlerAdapter對(duì)象;(包含表單類型的校驗(yàn),數(shù)據(jù)類型的轉(zhuǎn)換,格式換等功能)
調(diào)用 interceptor攔截器的preHandle方法;
調(diào)用目標(biāo)方法;
調(diào)用攔截器的postHandle方法;
處理視圖時(shí)候,觀察是否存在異常,存在異常,則由HandlerExceptionResolver來(lái)處理異常,并得到新的ModelAndView對(duì)象;不存在異常,則由ViewResolver視圖解析器來(lái)解析視圖;
調(diào)用攔截器的afterComplettion方法;
springmvc DispatcherServlet與handlerAdapter如何關(guān)聯(lián)?
DispatcherServlet攔截到請(qǐng)求之后,根據(jù)handlerMapping獲取到handlerExecutionChain對(duì)象,然后,在handlerExecutionChain對(duì)象不為null的情況下,根據(jù)handlerExecutionChain中的handler對(duì)象獲取HandlerAdapter對(duì)象;
有了springmvc的IOC容器,還需要spring的IOC容器嗎?為什么?如何處理兼容問(wèn)題?
這個(gè)問(wèn)題再進(jìn)一步,換個(gè)方式提問(wèn)即是否還需要在web.xml方法里面配置啟動(dòng)springIOC容器的ContextLoaderListener?
可以從正反兩方面來(lái)回答,首先是需要,通常情況下,類似于數(shù)據(jù)源,事務(wù),整合其他框架等都是放在spring的配置文件中,而不是springmvc的配置文件中, 一般情況下,開(kāi)發(fā)過(guò)程中的Service,Dao也都是放在spring的IOC容器當(dāng)中;其次可以是不需要的,也可以都放在springmvc的配置文件當(dāng)中,當(dāng)然需要分多個(gè)spring的配置文件,然后通過(guò)import節(jié)點(diǎn)導(dǎo)入到springmvc的配置文件當(dāng)中.
幾點(diǎn)要注意的地方:
1. springIOC容器和springmvc的IOC容器 掃描的部分有重合的地方,就會(huì)導(dǎo)致bean被創(chuàng)建2次,解決方案:使用 exclude-filter和include-filter配合來(lái)區(qū)分哪些bean交給springIOC容器,哪些bean交給springmvcIOC容器;
2. springmvc IOC容器里面的bean可以引用springIOC容器的bean,反之則不行,多個(gè)springIOC 容器之間可以設(shè)置為父子關(guān)系,以實(shí)現(xiàn)良好的解耦.舉個(gè)栗子,springIOC容器好比是全局作用域,springmvcIOC容器好比是局部作用域,局部的可以引用全局的,而全局的卻不能引用局部的.
tomcat容器如何與springmvc的dispatcherservlet通信的?
Apache Tomcat軟件是JavaServlet,JavaServerPages,Java ExpressionLanguage和JavaWebSocket技術(shù)的開(kāi)源實(shí)現(xiàn),SpringMVC則是spring推出的基于servlet標(biāo)準(zhǔn)的MVC框架實(shí)現(xiàn),由此可知,SpringMvc和Tomcat 的結(jié)合點(diǎn)就是Servlet.SpringMVC的DispatcherServlet繼承了HttpServlet,那么對(duì)于tomcat來(lái)說(shuō),springmvc實(shí)際就是一個(gè)Servlet.
一個(gè)http請(qǐng)求的具體處理流程:
1. 用戶向tomcat容器發(fā)送一個(gè)請(qǐng)求;
2. tomcat容器接收到請(qǐng)求之后,分析客戶的請(qǐng)求信息;
3. tomcat創(chuàng)建一個(gè)Httprequest對(duì)象,將用戶的請(qǐng)求信息封裝到該對(duì)象中;
4. tomcat創(chuàng)建一個(gè)HttpResponse對(duì)象;
5. tomcat調(diào)用HttpServlet的Service方法,將Httprequest,HTTPResponse傳遞給Httpservlet對(duì)象;
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流圈:830478757 ?幫助突破瓶頸 提升思維能力
6. HttpServlet調(diào)用HttpRequest對(duì)象的有關(guān)方法,獲取Http請(qǐng)求信息,HttpServlet調(diào)用HttpResponse對(duì)象的有關(guān)方法,生成響應(yīng)數(shù)據(jù);
7. tomcat把HttpServlet的響應(yīng)結(jié)果傳給Web客戶.
要注意的幾點(diǎn)東西:
①:web.xml配置文件的作用其實(shí)就是配置http請(qǐng)求和servlet之間的映射關(guān)系,通過(guò)這個(gè)配置文件,Tomcat可以把請(qǐng)求轉(zhuǎn)發(fā)給不同的servlet實(shí)例;
②:springmvc也是servlet標(biāo)準(zhǔn)的一個(gè)實(shí)現(xiàn),所有的http請(qǐng)求都映射到DispatcherServlet上去,這個(gè)時(shí)候,請(qǐng)求就已經(jīng)由Tomcat轉(zhuǎn)發(fā)到springmvc框架中去了,接著再由DispatcherServlet將請(qǐng)求轉(zhuǎn)發(fā)到各個(gè)Controller當(dāng)中去.
小結(jié)
這篇文章主要回顧了springmvc框架的如何處理http請(qǐng)求的過(guò)程,以及其和Tomcat容器之間的請(qǐng)發(fā)轉(zhuǎn)發(fā)是如何實(shí)現(xiàn)的,如果能夠熟練掌握,面試碰到相關(guān)的問(wèn)題,也能夠侃侃而談了,同時(shí)也是在平時(shí)CURD之余,對(duì)框架有一個(gè)更深層次的理解,不但要會(huì)用,還要懂得其原理.