HandlerMapping根据请求返回一个HandlerExecutionChain,HandlerExecutionChain包括两个类对象,一个处理器Handler,一个处理拦截器HandlerInterceptor。他们根据URL请求信息按不同的策略查找DispatcherServlet上下文中所定义的控制器(Controller),同时也可以在配置HandlerMapping时,注入多个处理器拦截器
HandlerMapping的所有实现类都AbstractUrlHandlerMapping,该抽象类定义了所有实现类的共性
interceptors:拦截器列表
defaultHandler:默认处理器(当不存在匹配请求的处理器时使用)
order:如果DispatcherServlet有多个HandlerMapping,将按这个顺序一一匹配
alwaysUseFullPath:是否使用全路径。默认为false,如果为true,如果在url-pattern中使用/admin/*,则对于index.html一定要写成/admin/index.html
urlPathHelper:指定在分析url时使用的UrlPathHelper
urlDecode:对请求url解码
一:BeanNameUrlHandlerMapping
查找spring容器中和请求的url同名的bean.这个映射器不需要配置,因为spring在找不到handlerMapping的情况下会使用BeanNameUrlHandlerMapping.如果一定要配置,像下面这样就行了:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
也可以配置过滤器
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<bean class="com.test.MyInterceptor"/>
<ref bean="someOtherCheckInterceptor"/>
</list>
</property>
</bean>
配置控制器
<bean name="/user/index.htm" class="controller.Test1Controller"/>
<bean name="/admin/index.htm" class="controller.Test2Controller"/>
二:SimpleUrlHandlerMapping
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor"/>
<ref bean="someOtherCheckInterceptor"/>
</list>
</property>
<property name="mappings">
<props>
<!--key值采用ant风格-->
<prop key="/project.htm">projectController</prop>
<prop key="com/**/manage.htm">managementController</prop>
<prop key="/user/*.htm">userController</prop>
<prop key="/upl?ad.htm">fileUploadController</prop>
</props>
</property>
</bean>
<bean name="userController" class=""/>
三:ControllerClassNameHandlerMapping
将控制器类名的Controller后缀删除,转换成小写后作为请求url的前缀
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<!-- 以下为Controller -->
<!-- 对应/registration*的url -->
<bean id="registrationController" class="com.RegistrationController"/>
<!-- 对应/user*的url -->
<bean id="userController" class="com.UserController" scope="request"/>
对于MultiActionController,匹配子路径
<bean class="org.springframework.web.servlet.mvc.support.MultiActionController"/>
<!-- 对应/registration/*的url -->
<bean id="registrationController" class="com.RegistrationController"/>
<!-- 对应/user/*的url -->
<bean id="userController" class="com.UserController" scope="request"/>
多个处理器
<bean id="beanNameUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="1"/>
</bean>
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping">
<property name="order" value="2"/>
</bean>
<bean id="indexController" class="com.controller.IndexController"/>
当/index.html发来请求时,首先BeanNameUrlHandlerMapping进行映射解析,因为userController不符,所以不能正确解析,而后选择ControllerClassNameHandlerMapping,这时解析正确,匹配IndexController