http://blog.chinaunix.net/uid-20415521-id-1949916.html
SpingMVC中的HandlerMapping (2007-05-22 11:33)
分類: Spring
DispatcherServlet要將一個請求交給哪個特定的Controller,它需要咨詢一個Bean——這個Bean的名字為“HandlerMapping”。
HandlerMapping是把一個URL指定到一個Controller上,(就像應用系統的web.xml文件使用<servlet-mapping>將URL映射到servlet)。
Spring帶有三種HandlerMapping,(SpringMVC中的所有HandlerMapping都實現了接口org.springframework.web.servlet. HandlerMapping)。
1、BeanNameUrlHandlerMapping
這是Dispatcher Servlet的默認的HandlerMapping,所以在應用上下文配置文件中簡單地用“Url樣式”來定義一個控制器Bean的名字,就可以告訴Dispatcher Servlet什么樣式的請求應該由哪個控制器去處理,而不用顯式地定義一個HandlerMapping。(私下說一句,這樣做雖然簡單,但這樣用URL樣式定義出來的ControllerBean,其名字顯得古怪,因為這個名字同時也是Controller Bean的實例名)
例:若控制器ListCoursesController的URL樣式是“listCourses.go”,則
<bean name="/listCourses.go"
class="com.w3cs.vlar.ListCoursesController">
<property name="couseService">
<ref bean="courceService"/>
</property>
</bean>
當然,也可以在定義這個控制器Bean之前,顯式地聲明你所用的HandlerMapping,顯式定義如下:
<bean id="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
2、SimpleUrlHandlerMapping
這種方式不同於BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping不需定義Controller Bean的名字,而是直接把URL映射到控制器。
由於SimpleUrlHandlerMapping不是Dispatcher Servlet默認的HandlerMapping,所以這個HandlerMapping必須得顯式定義。
下面定義了一個ID為“SimpleUrl”的HandlerMapping Bean:
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/listCourses.go">listCoursesController</prop>
<prop key="/login.go">loginController</prop>
</props>
</property>
</bean>
解釋:
1)、SimpleUrlHandlerMapping中,用<prop>裝配了一個名為mappings的java.util.Properties。
2)、<prop>元素的key屬性是URL樣式,而<prop>的值是處理這個URL的控制器Bean的名字。(而在BeanNameUrlMapping中的那個古怪的名字是控制器Bean的實例名)。
3、CommonsPathMapHandlerMapping
這個處理器使用控制器代碼中的元數據將控制器映射到URL。但具體俺不會用。誰知道了可以告訴俺!!!
