本文共 1848 字,大约阅读时间需要 6 分钟。
DispatchServlet需要通过url来找到对应的controller,而在SpringMVC中为我们完成这个工作的组件就是HandlerMapping。
而我们常见的No mapping found for HTTP request with URI……
错误也是因为HandlerMapping没有找到对应handler,今天我们就来了解一下,SpringMVC中HandlerMapping的实现类。
在HandlerMapping的实现类中,除去抽象类、已弃用的实现类、子接口以及EmptyHandlerMapping空实现之外,我们可以得出三个实现类:
该实现类可以把IOC容器中name以"/" 开头的Bean注册为handler
简单介绍一下这个类的使用方式:在xml文件中,我们只需要在配置bean的时候,加上name属性就可以将handler注册上去:
需要注意的是,name属性必须带上“/”前缀,否则BeanNameUrlHandlerMapping是不会将其注册进去的,关于这一点我们可以在源码中验证:
protected String[] determineUrlsForHandler(String beanName) { Listurls = new ArrayList (); 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); }
该实现类需要我们在xml文件中手动配置url与handler的映射,使用方式有点类似struts2:
helloController
这是最常用的HandlerMapping实现,通过它,我们可以使用注解的形式来标识url与handler的映射:
@Controller("/mvc")public class HelloController { @GetMapping("/hello") public String hello(){ return "hello"; } }
当我们没有在xml文件中配置任何HandlerMapping实现类时,SpringMVC会使用默认的实现类,该配置可以在DispatcherServlet.properties中找到:
在此处SpringMVC为我们引入了两个默认实现类,一个是我们上面讲过的BeanNameUrlHandlerMapping。而另一个DefaultAnnotationHandlerMapping是已经弃用的实现类,在Spring3.1使用新的HandlerMapping 和 HandlerAdapter来支持@Contoller和@RequestMapping注解处理器
需要注意的是,如果我们在xml中配置了HandlerMapping,那么默认的HandlerMapping就会失效。
转载地址:http://amfmf.baihongyu.com/