翻譯:Spring-Framework-Reference Document:15.2-DispatcherServlet

寫在前面的話:
  最近被項目的代碼折騰的死去活來的,其實框架也沒有那麼難理解,只是自己的Web基礎太差,被Request和Response這一對神鵰俠侶坑到淚流滿面!今天搗騰了一下Spring Web MVC,本來想用JSTL的自定義標籤開發或者Strust2的框架,但發現框架堆的太多太亂不利於開發效率,所以決定還是先採用Spring Web MVC的設計模式來試一試。然後,在網上搜了很多資料之後,我發現,大家基本上都是轉發+貼代碼,可以學習的東西實在是少之又少,在調試了一天別人的代碼 之後,我決定直接去看Spring-Framework的官方文檔:spring-framework-reference。由於這份文檔目前還沒有找到 中文版的,所以我把一些重要的內容按章節翻譯下來,一方面留給自己當作參考資料,另一方面也是希望能幫助到想要學習Spring framework的人。

PS:英語水平不是很高,部分內容翻譯不流暢,希望見諒,如有錯誤,麻煩留言指正,不勝感激。

15.2:DispatcherServlet

和許多其他Web MVC框架一樣,Spring Web MVC是由request驅動,以servlet爲中心設計的,而這個中心servlet能夠將request分發到不同的控制器 (controllers),然後提供其他的能夠用來開發Webapplication的功能模塊。然而,Spring的DispatcherServlet能夠做的更多,它能夠完全和Spring IoC容器結合,並且能夠允許開發人員使用Spring容器中所有的要素;

   Request處理Spring Web MVC工作流的時候,DispatcherServlet所發揮的作用在下面的圖中一覽無餘:

                                                                                     

一些精通模式的讀者會馬上意識到,DispatcherServlet就是“前端控制器”(這是一種Spring Web MVC與其他先進的Web框架所共有的模式)設計模式的一種表達。

DispatcherServlet 本質上就是一個Servlet(繼承了HttpServlet基類),在你的Web應用中使用它的時候,要在Web.xml中聲明。同樣的,你需要在 Web.xml中利用URL映射的方式,將那些你想要交給DispatcherServlet處理的requests進行映射。下面是一個標準的J2EE Servlet配置:

                                                                     

    在一些處理例子中,所有的以.form結束的requests將會被交給上述所聲明DispatcherServlet處理。這僅僅是搭建Spring Web MVC的第一步。你現在需要配置那些在Spring Web MVC框架中所使用到的各種beans(也包括DispatcherServlet自己)。

   在3.13部分,詳細講述了關於添加可用的ApplicationContext的內容,在Web MVC 框架中,每一個DispatcherServlet都有自己的WebApplication-Context,從已經被定義的根應用上下文中繼承所有的 beans,這些被繼承的beans能夠在特定的Servlet範圍內被覆蓋,開發者也可以給一個給定的Servlet實例定義新的特定範圍的 beans。

   在初始化DispatcherServlet的基礎上,Spring Web MVC框架開始在你的Web應用WEB-INF的路徑下尋找一個叫做[servlet-name]-servlet.xml的文件,然後以重新定義那些已 經以相同的名稱在全局範圍內定義的任何一個beans的方式創建這些已經在這個xml中被定義的beans。

    思考下面的DispatcherServlet聲明配置:

                                                                     

    在擁有上述的Servlet配置文件之後,你需要在你的應用裏創建一個/WEB-INF/golfing-servlet.xml的文件,這個文件將會包 含你的所有Spring Web MVC組件(beans),你能夠通過一個servlet初始化參數去更改這個beans的配置文件的絕對路徑。

   

    這個WebApplicationContext是從一個擁有一些Web application的額外必備要素的基本應用上下文ApplicationContext拓展來的。這個Web應用上下文和普通的 ApplicationContext在解決方案的可用性上有些不同。並且能夠知道這個Web 應用上下文歸屬於哪一個Servle。這些WebApplicationContext封裝在ServletContext中的,通過使用RequestContextUtils類中的靜態方法,你就能夠在你需要使用它的時候立馬找到這個WebApplicationContext。

    Spring中的DispatcherServlet用特殊的beans處理request,並且用合適的視圖表現。這些beans是Spring框架中的一部分。你能夠在WebApplicationContext中配置它們,就如同你配置其他的bean一樣。然而,對於大多數beans來說,敏感的默認行爲能夠爲你提供,因此並不需要你去配置它們。

    關於這些beans的描述如下表:

    

(簡單介紹一下:

    Handler mappings:操作執行一系列的預處理、後續處理,當得到匹配的參數之後,就執行控制器;

    View resolvers:將視圖名稱解析給視圖;

    Locale resolver:是一種爲了提供國際化視圖而對客戶端使用的環境場所解析;

    Theme resolver:能夠解析你的Web 應用使用的主題,舉個例子:提供個性化的佈局;

    Multipart file resolver:包括了能夠處理HTML表單上的下載文檔;

    Handler exception resolvers:映射視圖的異常或者實現其他更多更復雜的異常處理代碼;

 

在你建立DispatcherServlet之後,一個請求進入了一個特定的DispatcherServlet,這個DispatcherServlet開始如下面的的過程一樣處理這個請求:

1、 WebApplicationContext搜索並且將這個request封裝成一個屬性,這樣控制器和這個過程中的其他元素就能夠使用了。這樣的封裝默 認是由Key—DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE執行的。

2、Locale resolve通過封裝請求是爲了讓解析場所所使用的元素變爲可用。這是過程中的可選項。

3、(很簡單自己看,翻累了)The theme resolver is bound to the request to let elements such as views determine which theme to use. If you do not use themes, you can ignore it.

4、尋找一個合適的Handler,如果這個Handler被找到了,和這個Handler所關聯的處理鏈開始執行,並準備返回一個model或者View。

5、如果返回的是Model,視圖就表現出來。如果返回的不是model(也許是因爲預處理器或者後續處理攔截了這個請求,也許是因爲安全原因),沒有視圖表現出來,因爲request已經被完成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章