請求的分發
請求首先到達DispatcherServlet,應用服務器會根據Web應用中web.xml文件定義的url映射將相應的請求分發到DispatcherServlet中
請求的處理
DispatcherServlet會查找相應的HandlerMapping接口的實現類,調用其中的方法:HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception,該方法會返回一個HandlerExecutionChain。返回的HandlerExecutionChain中包含了零個或者是多個Interceptor和一個處理請求的Handler。DispatcherServlet會調用Interceptor中的preHandle() 方法。然後處理Handler,這個Handler相當於Struts中Action,在SpringMVC中默認的實現是Controller接口,是具體處理請求的代碼所駐留的地方。事實上HandlerExecutionChain中的getHandler()返回的是一個Object類型。DispatcherServlet不會直接調用getHandler()返回對象中的方法,DispatcherServlet會查找相應的HandlerAdapter,然後具體通過HandlerAdapter來調用getHandler()返回的handler對象中的方法。就是說我們可以實現自己的HandlerAdapter然後通過IoC注入到DispatcherServlet中,從而可以實現一套自定義的控制器。隨後DispatcherServlet會調用Interceptor中的postHandle()方法。
視圖的處理
DispatcherServlet會期望Hander返回一個ModelAndView,DispatcherServlet會根據所返回的ModelAndView對象所包含的信息進行視圖的渲染。起具體出來流程如下:
首先DispatcherServlet會根據LocaleResolver來識別請求中的Locale,開發人員可以自己實現LocaleResolver接口,然後通過IoC注入到DispatcherServlet中,然後DispatcherServlet會判斷ModelAndView中是否已經包含了接口View的具體實現,如果包含了,則直接調用View中的方法render(Map model, HttpServletRequest request, HttpServletResponse response)。如果不包含,則說明該ModelAndView只是包含了View的名稱引用,DispatcherServlet會調用ViewResolver中的resolveViewName(String viewName, Locale locale)來解析其真正的視圖。該方法會返回一個View的具體實現。
視圖的渲染
Spring支持多種視圖技術,其中比較常用的包括有Jstl視圖,Veloctiy視圖,FreeMarker視圖等。對Jstl視圖的渲染Spring是通過JstlView這個類具體實現的。事實上其最終的渲染是交給容器來做的,Spring只是通過RequestDispatcher實現了服務器內部請求的Forward。而對於模板視圖,如Veloctiy和FreeMarker等,Spring會初始化其相應的模板引擎,由模板引擎生成最終的Html頁面然後在合併到Response的輸出流中。
異常的處理
如果在Hander中處理請求是拋出異常,DispatcherServlet會查找HandlerExceptionResolver接口的具體實現,該接口定義了一個方法:
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex),實現類需要實現該方法以便對異常進行處理,最後該方法需要返回一個ModelAndView。
SpringMVC的一些總結
靈活的Interceptor,通過Interceptor我們可以在一個請求處理前和請求處理完成之後做相應的操作,通過Interceptor機制,我們可以做authentication, logging, and filtering等。
良好的表單支持,在SpringMVC的Controller繼承體系結構中,其具體的子類對錶單(Form)提供了良好的支持。能夠很好的支持單個表單的顯示、修改、提交操作。同時也提供了表單的分步提交。
可定製的數據綁定(Data Binding)。
多視圖技術的支持,SpringMVC同時支持Jstl, Velocity 等多中視圖技術,但是這同時也會引出一個問題,因爲各種視圖技術都有自己的一套方法來處理國際化,例如Jstl和Velocity處理國際化的方式就很不相同。因此在多個視圖技術並存的應用中,國際化也是一個需要注意的問題。
其Handler(控制器)作爲Bean定義在Spring容器中,因此能享受容器帶來的服務。
Handler(控制器)具有良好的可測試性。
Spring 工作流程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
Java Collection和Collections的區別?,Collections 實現sort排序
面試題, 一、 Collection 1.Collection 是一個 頂級集合是接口(如圖) 2.提供所以集合的共性方法 * 一、共性方法: * 1.add(): 添加對象到集合 * 2.rem
半亩方糖里
2020-07-06 19:53:06
Java集合 HashMap解析(源碼分析)
半亩方糖里
2020-06-03 05:51:19
Java Collection和Collections的區別?
半亩方糖里
2020-06-03 05:51:19
Java 泛型 泛型規範 extends 和 super 的區別?
半亩方糖里
2020-06-03 05:51:19
Java 反射詳解。(入門篇)
半亩方糖里
2020-05-17 05:44:11
Java 註解 註解入門 內置註解 元註解 自定義註解
半亩方糖里
2020-05-14 06:24:53
Java IO 總結。 字節流,字符流,Buffer緩衝,Properties集合IO 解決字符編碼的問題的類 序列化和反序列化 等,
半亩方糖里
2020-05-09 10:16:34
Java IO 解決字符編碼亂碼的問題的類InputStreamReader ,OutputStreamWriter 使用教程.
半亩方糖里
2020-05-09 10:16:34
Java IO 打印流PrintStream 可寫入任意格式數據,可改變輸出到控制檯的數據到文件裏 教程
半亩方糖里
2020-05-09 10:16:34
Java IO教程 OutputStream InputStream 讀寫字節流
半亩方糖里
2020-05-09 10:16:34
Java IO Reader,Writer類 讀寫字符 用法詳解教程。
半亩方糖里
2020-05-09 10:16:34
Java IO 讀取類對象的流 ObjectInputStream,ObjectOutputStream 使用教程.
半亩方糖里
2020-05-09 10:16:34
Java IO Properties類 可以IO的集合 的總結 使用教程
半亩方糖里
2020-05-09 10:16:34
Java IO 4個Buffed的緩衝頂級類(比如bufferedInputStream)的 總結教程
半亩方糖里
2020-05-09 10:16:34
Java 常用類 StringTokenizer使用教程
半亩方糖里
2020-05-08 02:08:49