請(qǐng)求的分發(fā) 請(qǐng)求首先到達(dá)DispatcherServlet,應(yīng)用服務(wù)器會(huì)根據(jù)Web應(yīng)用中web.xml文件定義的url映射將相應(yīng)的請(qǐng)求分發(fā)到DispatcherServlet中 請(qǐng)求的處理 DispatcherServlet會(huì)查找相應(yīng)的HandlerMapping接口的實(shí)現(xiàn)類,調(diào)用其中的方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception,該方法會(huì)返回一個(gè)HandlerExecutionChain。返回的HandlerExecutionChain中包含了零個(gè)或者是多個(gè)Interceptor和一個(gè)處理請(qǐng)求的Handler。DispatcherServlet會(huì)調(diào)用Interceptor中的preHandle() 方法。然后處理Handler,這個(gè)Handler相當(dāng)于Struts中Action,在SpringMVC中默認(rèn)的實(shí)現(xiàn)是Controller接口,是具體處理請(qǐng)求的代碼所駐留的地方。事實(shí)上HandlerExecutionChain中的getHandler()返回的是一個(gè)Object類型。DispatcherServlet不會(huì)直接調(diào)用getHandler()返回對(duì)象中的方法,DispatcherServlet會(huì)查找相應(yīng)的HandlerAdapter,然后具體通過(guò)HandlerAdapter來(lái)調(diào)用getHandler()返回的handler對(duì)象中的方法。就是說(shuō)我們可以實(shí)現(xiàn)自己的HandlerAdapter然后通過(guò)IoC注入到DispatcherServlet中,從而可以實(shí)現(xiàn)一套自定義的控制器。隨后DispatcherServlet會(huì)調(diào)用Interceptor中的postHandle()方法。 視圖的處理 DispatcherServlet會(huì)期望Hander返回一個(gè)ModelAndView,DispatcherServlet會(huì)根據(jù)所返回的ModelAndView對(duì)象所包含的信息進(jìn)行視圖的渲染。起具體出來(lái)流程如下: 首先DispatcherServlet會(huì)根據(jù)LocaleResolver來(lái)識(shí)別請(qǐng)求中的Locale,開(kāi)發(fā)人員可以自己實(shí)現(xiàn)LocaleResolver接口,然后通過(guò)IoC注入到DispatcherServlet中,然后DispatcherServlet會(huì)判斷ModelAndView中是否已經(jīng)包含了接口View的具體實(shí)現(xiàn),如果包含了,則直接調(diào)用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含,則說(shuō)明該ModelAndView只是包含了View的名稱引用,DispatcherServlet會(huì)調(diào)用ViewResolver中的resolveViewName(String viewName, Locale locale)來(lái)解析其真正的視圖。該方法會(huì)返回一個(gè)View的具體實(shí)現(xiàn)。 視圖的渲染 Spring支持多種視圖技術(shù),其中比較常用的包括有Jstl視圖,Veloctiy視圖,F(xiàn)reeMarker視圖等。對(duì)Jstl視圖的渲染Spring是通過(guò)JstlView這個(gè)類具體實(shí)現(xiàn)的。事實(shí)上其最終的渲染是交給容器來(lái)做的,Spring只是通過(guò)RequestDispatcher實(shí)現(xiàn)了服務(wù)器內(nèi)部請(qǐng)求的Forward。而對(duì)于模板視圖,如Veloctiy和FreeMarker等,Spring會(huì)初始化其相應(yīng)的模板引擎,由模板引擎生成最終的Html頁(yè)面然后在合并到Response的輸出流中。 異常的處理 如果在Hander中處理請(qǐng)求是拋出異常,DispatcherServlet會(huì)查找HandlerExceptionResolver接口的具體實(shí)現(xiàn),該接口定義了一個(gè)方法: ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex),實(shí)現(xiàn)類需要實(shí)現(xiàn)該方法以便對(duì)異常進(jìn)行處理,最后該方法需要返回一個(gè)ModelAndView。 SpringMVC的一些總結(jié) |
大盤(pán)預(yù)測(cè) 國(guó)富論