重点: 学会配置常见的HandlerMapping
HandlerMapping :
映射处理器
管理URL和Controller 映射关系的处理器
工作原理
- 注册
IOC容器初始化的时候,初始化映射处理器的HashMap<String, Object>, 其中 key 是 http 请求的 path 信息;
Value 可以是一个字符串,或者是一个处理请求的 HandlerExecutionChain ,如果时String 类型,则会将其视为 Spring的bean 名称。
不同的映射处理器在初始化时会按照不同的算法进行处理。
- 获取
HandlerMapping 对象被创建的时候,即完成url 到 handler 之间的映射关系的注册。映射处理器的 HashMap<String , Object> 已经被赋值,可以使用了。
这时前端控制器调用映射处理器时就可以使用 getHandler() 方法,根据http 请求获得handler 对象了
HandlerMapping 类型
BeanNameUrlHandlerMapping 默认的 bean name 映射器
ControllerClassNameHandlerMapping 类名映射
SimpleUrlHandlerMapping 简单url处理器映射
BeanNameUrlHandlerMapping
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order" value="10"></property>
</bean>
<!-- 验证beanNameUrlHandlerMapping的控制器 可以加通配符* -->
<bean name="/className.do" class="com.kgc.controllers.WelcomeController"></bean>
ControllerClassNameHandlerMapping
<!-- 类名映射器 -->
<bean id="classNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="caseSensitive" value="true"></property>
<property name="order" value="1"></property>
</bean>
<!-- 验证classNameHandlerMapping的控制器 -->
<bean class="com.kgc.controllers.ClassNameController" />
实际上是去掉Controller 这个单词进行匹配,并把去掉后的剩余部分全部变成小写,不严格区分大小写,加上 <property name="caseSensitive" value="true" />
SimpleUrlHandlerMapping
三种方法:
<!-- 简单Url -->
<!-- prop key 方式 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- key 就是url value:控制器的名字 -->
<prop key="/className.do">simpleUrlController</prop>
</props>
</property>
</bean>
<!-- value写法 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/className.do = simpleUrlController
</value>
</property>
</bean>
<!-- map配法 -->
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/className.do" value-ref="simpleUrlController" />
</map>
</property>
<property name="order" value="9"></property>
</bean>
java 代码 模版如下:
public class WelcomeController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
// 创建ModelAndView对象
ModelAndView mav = new ModelAndView();
// 添加要在页面上显示的数据
mav.addObject("msg","beanNameUrlHandlerMapping");
// 要返回的逻辑视图名
mav.setViewName("welcome");
return mav;
}
}
设置Mapping 的优先级
<property name="order" value="9"></property>
用order 来设置, 值小的优先匹配 值不能为负数