隨筆-295  評(píng)論-26  文章-1  trackbacks-0

          Spring-mvc 的處理流程

          關(guān)鍵字: Spring ? mvc ioc ????

          請(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é)
          靈活的Interceptor,通過(guò)Interceptor我們可以在一個(gè)請(qǐng)求處理前和請(qǐng)求處理完成之后做相應(yīng)的操作,通過(guò)Interceptor機(jī)制,我們可以做authentication, logging, and filtering等。
          良好的表單支持,在SpringMVC的Controller繼承體系結(jié)構(gòu)中,其具體的子類對(duì)表單(Form)提供了良好的支持。能夠很好的支持單個(gè)表單的顯示、修改、提交操作。同時(shí)也提供了表單的分步提交。
          可定制的數(shù)據(jù)綁定(Data Binding)。
          多視圖技術(shù)的支持,SpringMVC同時(shí)支持Jstl, Velocity 等多中視圖技術(shù),但是這同時(shí)也會(huì)引出一個(gè)問(wèn)題,因?yàn)楦鞣N視圖技術(shù)都有自己的一套方法來(lái)處理國(guó)際化,例如Jstl和Velocity處理國(guó)際化的方式就很不相同。因此在多個(gè)視圖技術(shù)并存的應(yīng)用中,國(guó)際化也是一個(gè)需要注意的問(wèn)題。
          其Handler(控制器)作為Bean定義在Spring容器中,因此能享受容器帶來(lái)的服務(wù)。
          Handler(控制器)具有良好的可測(cè)試性。



          大盤(pán)預(yù)測(cè) 國(guó)富論
          posted on 2007-08-29 10:23 華夢(mèng)行 閱讀(2954) 評(píng)論(0)  編輯  收藏 所屬分類: Spring
          主站蜘蛛池模板: 手游| 怀宁县| 慈溪市| 渭源县| 泾川县| 错那县| 平果县| 额济纳旗| 阿克陶县| 阳西县| 河间市| 光泽县| 太原市| 隆昌县| 肃宁县| 岱山县| 海阳市| 苗栗县| 杭锦后旗| 响水县| 东海县| 宁城县| 齐齐哈尔市| 雅安市| 罗甸县| 石阡县| 郴州市| 山阴县| 咸丰县| 巩留县| 昭通市| 始兴县| 平和县| 扎兰屯市| 阿坝| 驻马店市| 潞城市| 乡城县| 高安市| 永德县| 长春市|