目录
1、前言
DispatchServlet需要通过url来找到对应的controller,而在SpringMVC中为我们完成这个工作的组件就是HandlerMapping。
而我们常见的No mapping found for HTTP request with URI……
错误也是因为HandlerMapping没有找到对应handler,今天我们就来了解一下,SpringMVC中HandlerMapping的实现类。
2、HandlerMapping的实现类
在HandlerMapping的实现类中,除去抽象类、已弃用的实现类、子接口以及EmptyHandlerMapping空实现之外,我们可以得出三个实现类:
- BeanNameUrlHandlerMapping
- SimpleUrlHandlerMapping
- RequestMappingHandlerMapping
我们来逐一解读一下这几个类的作用。
2.1 BeanNameUrlHandlerMapping
该实现类可以把IOC容器中name以"/" 开头的Bean注册为handler
简单介绍一下这个类的使用方式:在xml文件中,我们只需要在配置bean的时候,加上name属性就可以将handler注册上去:
<bean name="/hello.html" class="com.zhengfa.controller.HelloController"/>
需要注意的是,name属性必须带上“/”前缀,否则BeanNameUrlHandlerMapping是不会将其注册进去的,关于这一点我们可以在源码中验证:
protected String[] determineUrlsForHandler(String beanName) {
List<String> urls = new ArrayList<String>();
if (beanName.startsWith("/")) {
urls.add(beanName);
}
String[] aliases = getApplicationContext().getAliases(beanName);
for (String alias : aliases) {
if (alias.startsWith("/")) {
urls.add(alias);
}
}
return StringUtils.toStringArray(urls);
}
2.2 SimpleUrlHandlerMapping
该实现类需要我们在xml文件中手动配置url与handler的映射,使用方式有点类似struts2:
<bean name="helloController" class="com.zhengfa.controller.HelloController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<props>
<prop key="/hello.html">
helloController
</prop>
</props>
</property>
</bean>
2.3 RequestMappingHandlerMapping
这是最常用的HandlerMapping实现,通过它,我们可以使用注解的形式来标识url与handler的映射:
@Controller("/mvc")
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
3、SpringMVC中的默认配置
当我们没有在xml文件中配置任何HandlerMapping实现类时,SpringMVC会使用默认的实现类,该配置可以在DispatcherServlet.properties中找到:
在此处SpringMVC为我们引入了两个默认实现类,一个是我们上面讲过的BeanNameUrlHandlerMapping。
而另一个DefaultAnnotationHandlerMapping是已经弃用的实现类,在Spring3.1使用新的HandlerMapping 和 HandlerAdapter来支持@Contoller和@RequestMapping注解处理器
需要注意的是,如果我们在xml中配置了HandlerMapping,那么默认的HandlerMapping就会失效。