SpringMvc有四种HandlerMapping:BeanNameUrlHandlerMapping ,SimpleUrlHandlerMapping,ControllerClassNameHandlerMapping ,DefaultAnnotationHandlerMapping。

1. BeanNameUrlHandlerMapping  (默认)根据controller的name名称来映射寻找controller,开启该映射:默认是开启的

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean id="helloController" name="/hello1.do" class="com.controller.HelloController"></bean>
http://localhost:5080/springmvc/hello1.do

2.SimpleUrlHandlerMapping  根据URL来映射寻找controller, 开启该映射:

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

<property name="mappings">
<props>
<prop key="/hello2.do">HelloController</prop>
</props>
</property>
</bean>
http://localhost:5080/springmvc/hello2.do

3.ControllerClassNameHandlerMapping 根据controller的类名来映射寻找controller:

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"></bean>

 4. DefaultAnnotationHandlerMapping 使用注解来映射寻找controller

<!--开启springMVC注解  -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>

使用java代码配置的方式:

     /**
* 将请求(/hessianremote.hessianservice)映射到hessianExporterService服务上
* @return
*/
@Bean
public HandlerMapping hessianMapping() {
SimpleUrlHandlerMapping mapping=new SimpleUrlHandlerMapping();
Properties maProperties=new Properties();
maProperties.setProperty("/xx/hessianremote.hessianservice", "hessianExporterService");
mapping.setMappings(maProperties);
return mapping;
} /**
* BeanNameUrlHandlerMapping 会自动探测 '/' 开头的bean当做是一个handler,
* 但默认是只探测当前context里的bean,不会探测ancestor contexts(父容器),
* 如果要探测父容器,那么设置detectHandlersInAncestorContexts为true
* @return
*/
@Bean
public HandlerMapping beanNameUrlHandlerMapping() {
return new BeanNameUrlHandlerMapping();
} /**
* 注册通过扫描注解controller的处理器映射器
* 默认情况下springmvc会自动注册BeanNameUrlHandlerMapping和DefaultAnnotationHandlerMapping这两个处理器,
* 但是当上面手动配置了SimpleUrlHandlerMapping处理器映射器以后,就默认只有这一个处理器,因此,当你还需要
* springmvc自动解析对controller类上方法的http映射,就需要手动配置该映射器处理器。
* SpringMVC默认注册处理器映射器,可参考源码:DispatcherServlet 的 initHandlerMappings方法
* @return
*/
@Bean
public HandlerMapping defaultAnnotationHandlerMapping() {
return new DefaultAnnotationHandlerMapping();
}

注意:一旦在SpringMVC 中,如同上面手动配置了HandlerMapping,最好把DefaultAnnotationHandlerMappin,BeanNameUrlHandlerMapping这两个都配置上,否则SpringMvc将不能解析http请求到Controller上。因为SpringMVC默认是会在HandlerMapping为空情况下自动注册这两个HandlerMapping,但是当你手动注册过任意HandlerMapping后,就不会再注册这两个HandlerMapping。

以上可以参考DispatcherServlet 的 initHandlerMappings方法:

 private void initHandlerMappings(ApplicationContext context) {
this.handlerMappings = null; if (this.detectAllHandlerMappings) {
// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
Map<String, HandlerMapping> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());
// We keep HandlerMappings in sorted order.
AnnotationAwareOrderComparator.sort(this.handlerMappings);
}
}
else {
try {
HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
this.handlerMappings = Collections.singletonList(hm);
}
catch (NoSuchBeanDefinitionException ex) {
// Ignore, we'll add a default HandlerMapping later.
}
} // Ensure we have at least one HandlerMapping, by registering
// a default HandlerMapping if no other mappings are found.
if (this.handlerMappings == null) {
this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
if (logger.isDebugEnabled()) {
logger.debug("No HandlerMappings found in servlet '" + getServletName() + "': using default");
}
}
}

可以看到26行,就是当没有手动配置HandlerMapping时,会自动添加默认的HandlerMapping。

SpringMVC的HandlerMapping(处理器映射器)的更多相关文章

  1. springMVC三种处理器映射器

    1.配置处理器映射器,springmvc默认的处理器映射器BeanNameUrlHandlerMapping <bean class="org.springframework.web. ...

  2. SpringMVC 学习笔记(处理器映射器的配置)

    前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...

  3. SpringMVC注解配置处理器映射器和处理器适配器

    一.springmvc.xml中配置方式 <!--注解映射器 --> <bean class="org.springframework.web.servlet.mvc.me ...

  4. SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)

    SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...

  5. SSM-SpringMVC-07:SpringMVC中处理器映射器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping BeanN ...

  6. SpringMVC由浅入深day01_3非注解的处理器映射器和适配器

     3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 3.1.1 HandlerMapping处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler ...

  7. 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)

    上一篇我们讲解了DispatcherServlet的url-pattern配置详解,今天我们来真正对SpringMVC进行配置式开发.所谓配置式开发是指“处理器类是程序员自己定义的.实现了特定接口的类 ...

  8. SpringMVC处理器映射器和方法名称解析器

    所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping Ha ...

  9. 4.SpringMVC 配置式开发-处理器映射器

    处理器映射器 HandlerMapping HandlerMapping 接口负责根据request请求找到对应的Handler处理器及Interceptor拦截器, 并将它们封装在HandlerEx ...

随机推荐

  1. Qt 文件的操作

    文件操作是应用程序必不可少的部分.Qt 作为一个通用开发库,提供了跨平台的文件操作能力.从本章开始,我们来了解下 Qt 的文件以及输入输出的功能,也就是 I/O 系统. Qt 通过QIODevice提 ...

  2. ZooKeeper 单机版安装和配置

    Zookeeper 下载链接:http://mirrors.shu.edu.cn/apache/zookeeper/ #wget https://mirrors.tuna.tsinghua.edu.c ...

  3. jar包是干什么用的

    1.JAR(Java ARchive)是将一系列文件到单个压缩文件里,就象Zip那样.但是,同Java中其他任何东西一样,JAR文件是跨平台的,所以不必关心涉及具体平台的问题.2.jar包就是别人已经 ...

  4. JS查看对象属性的方式

    var person = { type: 'person', say: function(){ console.log("Hellow World!") } } //以person ...

  5. 【温故知新】HTTP请求GET和POST的用法和区别

    转自http://www.w3school.com.cn GET的使用 请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的: /test/demo_form.asp?name1=v ...

  6. 两种语言实现设计模式(C++和Java)(四:适配器模式)

    参考:http://blog.jobbole.com/109381/ 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 系统的数 ...

  7. 第二章 函数编程&常用标准库

    函数编程&常用标准库                                                                                       ...

  8. 关于ubuntu远程访问服务器的知识点

    为了可以打开图形界面,用ssh -X 用户名@地址 如何远程打开文件夹可视化界面 nautilus /文件夹

  9. python websocket Django 实时消息推送

    概述: WebSocket 是什么? WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议.依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信. WebSoc ...

  10. fiddler近期用到的一些新功能

    一,AutoResponder导出导入 将AutoResponder中的规则全部选中,右键选择 Export All,可以导出成rule.farx文件 导入时选择Add Rule右边的Import按钮 ...