SpringMVC的HandlerMapping(处理器映射器)
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(处理器映射器)的更多相关文章
- springMVC三种处理器映射器
1.配置处理器映射器,springmvc默认的处理器映射器BeanNameUrlHandlerMapping <bean class="org.springframework.web. ...
- SpringMVC 学习笔记(处理器映射器的配置)
前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...
- SpringMVC注解配置处理器映射器和处理器适配器
一.springmvc.xml中配置方式 <!--注解映射器 --> <bean class="org.springframework.web.servlet.mvc.me ...
- SpringMVC入门案例及请求流程图(关于处理器或视图解析器或处理器映射器等的初步配置)
SpringMVC简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 Spring结构图 Spr ...
- SSM-SpringMVC-07:SpringMVC中处理器映射器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping BeanN ...
- SpringMVC由浅入深day01_3非注解的处理器映射器和适配器
3 非注解的处理器映射器和适配器 3.1 非注解的处理器映射器 3.1.1 HandlerMapping处理器映射器 HandlerMapping 负责根据request请求找到对应的Handler ...
- 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)
上一篇我们讲解了DispatcherServlet的url-pattern配置详解,今天我们来真正对SpringMVC进行配置式开发.所谓配置式开发是指“处理器类是程序员自己定义的.实现了特定接口的类 ...
- SpringMVC处理器映射器和方法名称解析器
所谓配置式开发是指,“处理器类是程序员手工定义的,实现了特定接口的类,然后再在SpringMVC配置文件中对该类进行显式的,明确的注册”的开发方式” 1.处理器映射器HandlerMapping Ha ...
- 4.SpringMVC 配置式开发-处理器映射器
处理器映射器 HandlerMapping HandlerMapping 接口负责根据request请求找到对应的Handler处理器及Interceptor拦截器, 并将它们封装在HandlerEx ...
随机推荐
- Java与C/C++有什么区别?
(1)Java为解释型语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行.而C/C++为编译型语言,源代码经过编译和链接生成可执行的二进制代码,因此,Java的执行速度 ...
- P3957 跳房子
题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n 个格子,这些格子都在同一条直线上.每个格子内 ...
- vs code 本地请求json
首先下载扩展live server 重新加载后 右下方工具栏会多出一个go live 点击go live,会默认启动chome,地址 http://127.0.0.1:5500 js脚本: $.aj ...
- beifen
Comparison of Models for Predicting the Outcome of Craniocerebral Injury by Using Machine Learning ...
- 判断客户端是IOS还是Android
PHP 判断客户端是IOS还是Android <?php if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['H ...
- CentOS 7 下使用yum安装MySQL5.7.20 最简单图文详解
CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的. 上一篇安装的是5.6的但是我想安装5.7的 yum安装是最简单 ...
- iOS跳转第三方应用举例一号店和京东
1.首先要跳转到第三方应用都需要知道第三方应用的scheme,虽然百度能得到很多,但是不乏一些新增的或者改了的,怎么获得APP的scheme,鉴于现在iTunes不好用了,介绍一个app ---app ...
- vue-router+elelment-ui,实现导航栏激活高亮
<el-menu :default-active="$route.path" class="el-menu-vertical-demo" backgrou ...
- POJ - 1830:开关问题 (开关问题-高斯消元-自由元)
pro:有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开. ...
- Spring+Mybatis+SpringMVC+Maven+MySql搭建实例(转)
http://blog.csdn.net/evankaka/article/details/48785513?spm=5176.100239.blogcont28591.10.9Fdj9R