SpringMVC三个HandlerMapping实现类解读

1、前言

DispatchServlet需要通过url来找到对应的controller,而在SpringMVC中为我们完成这个工作的组件就是HandlerMapping。

而我们常见的No mapping found for HTTP request with URI……错误也是因为HandlerMapping没有找到对应handler,今天我们就来了解一下,SpringMVC中HandlerMapping的实现类。

2、HandlerMapping的实现类

在HandlerMapping的实现类中,除去抽象类、已弃用的实现类、子接口以及EmptyHandlerMapping空实现之外,我们可以得出三个实现类:

  1. BeanNameUrlHandlerMapping
  2. SimpleUrlHandlerMapping
  3. 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就会失效。

猜你喜欢

转载自blog.csdn.net/foxException/article/details/109337576
今日推荐