spring學習筆記之handler mapping源碼解讀


spring學習筆記之handler mapping源碼解讀


   用 handler mapping 可以映射請求到合適的 handler ,比如用 SimpleUrlHandlerMapping 或者 BeanNameUrlHandlerMapping 。首先我們來看 handler mapping 這個概念。

   最基本的 HandlerMapping 提供的功能是 HandlerExecutionchain 的傳遞,必須包括請求匹配的處理器,也可能包括一系列應用於這個請求的的攔截器。當請求發生時, DispatcherServlet 將請求遞交給 hangler mapping, 讓其檢測請求並提出一個合適的 HandlerExecutionChain.DispatcherServlet 將執行該處理器和攔截器。

   Handler mappings 對攔截器的配置是可選的,包括前,後執行或者前後都執行,功能很強大。很多已經支持的功能可以在 HandlerMappings 配置中定製。選擇一個處理器的 handler mapping 定製不僅基於請求的 URL ,而且基於請求相關的 session 的狀態。

所有 handler mapping 類都要繼承 AbstractHandlerMapping 。下面是共有的屬性。

Interceptors: 攔截器

defaultHandler: 默認的處理器,當沒有匹配的處理器時使用。

Order: 基於 order 屬性的值。

   BeanNameUrlHandlerMapping 簡單而強大,根據定義在 web 應用環境的 bean 的名字映射 http 請求。比如說我們要讓一名用戶增加一帳號,我們已經提供了合適的表單控制器, jsp 或者 velocity 視圖渲染表單。

如果使用 BeanNameUrlHandlerMapping, 請求 http://samples.com/editaccoutn.form. 配置如下: <beans>



所有請求的 url editaccount.form 都會被 SimpleFormController 處理。當然在 web.xml 也要作如下的配置。


需要注意的是,你想用 BeanNameUrlHandlerMapping 是,並不需要定義。如果沒有定義處理類,則 DispatcherServlet 默認創建它。

SimpleUrlHandlerMapping 功能更強大。下面是例子


上面例子表示以 .form 或者 .html 結尾的請求都會被下面的處理器處理。



上面配置的意思很容易看明白的。


我們也可以用 HandlerInterceptor 攔截請求。攔截器必須實現 HandlerInterceptor 接口。這個接口定義了三個方法。見代碼:

上面三個方面分別負責預處理,後置處理和請求完成後的處理。下面是例子:




我們看到,攔截器類是繼承了 HandlerInterceptorAdapter ,而 HandlerInterceptorAdapter 基本實現了 HandlerInterceptor 接口,接下來就是我們根據需要改寫上面的三個某些方法了,而不需要全部實現。


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