springmvc笔记--请求映射处理器 HandlerMapping

原创
2014/06/12 20:50
阅读数 4K

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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
13 收藏
0
分享
返回顶部
顶部