Spring MVC:HandlerMapping
HandlerMapping 的类图

Spring中存在两种类型的handlers。第一种是 handler mappings(处理程序映射)。它们的角色定位与前面所描述的功能完全相同。它们尝试将当前请求与相应的 controller 以及其中的方法相匹配。第二种是 handler adapter(处理器适配器)。handler adapter 从 handler mappings 中获取映射的 controllers 和方法并调用它们。这种类型的适配器必须实现org.springframework.web.servlet.HandlerAdapter 接口。下面就来介绍 handler mappings。(Spring 版本:5.18)
① RequestMappingHandlerMapping:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,它的映射检测是基于注解的,它会自动在Controller 里面寻找@RequestMapping(...)等注解并解析。(注:在Spring5之前是使用DefaultAnnotationHandlerMapping,这个类在Spring5之后被移除了,一些项目在升级Spring版本时是可能会因为配置而报错)
例如:
1 <mvc:annotation-driven />
告知 Spring启用注解驱动,然后 Spring 会自动为我们注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter(这只是我们关注的其中2个)。
② SimpleUrlHandlerMapping:org.springframework.web.servlet.handler.SimpleUrlHandlerMapping,通过配置请求路径和 Controller 映射建立关系,找到相应的 Controller。SimpleUrlHandlerMapping 是最灵活的 HandlerMapping 实现。它允许在bean实例和URL之间 或 bean名称和URL之间进行直接和声明性映射。
例如:把请求“/simpleUrlWelcome”和“/*/simpleUrlWelcome”映射到 welcome 这个bean上。
1 @Configuration
2 public class SimpleUrlHandlerMappingConfig {
3
4 @Bean
5 public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
6 SimpleUrlHandlerMapping simpleUrlHandlerMapping
7 = new SimpleUrlHandlerMapping();
8
9 Map<String, Object> urlMap = new HashMap<>();
10 urlMap.put("/simpleUrlWelcome", welcome());
11 simpleUrlHandlerMapping.setUrlMap(urlMap);
12
13 return simpleUrlHandlerMapping;
14 }
15
16 @Bean
17 public WelcomeController welcome() {
18 return new WelcomeController();
19 }
20 }
等效的 xml 配置方式:
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2 <property name="mappings">
3 <value>
4 /simpleUrlWelcome=welcome
5 /*/simpleUrlWelcome=welcome
6 </value>
7 </property>
8 </bean>
9 <bean id="welcome" class="com.xxx.WelcomeController" />
或者:
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2 <property name="mappings">
3 <props>
4 <prop key="/simpleUrlWelcome">welcome</prop>
5 <prop key="/*/simpleUrlWelcome">welcome</prop>
6 </props>
7 </property>
8 </bean>
③ BeanNameUrlHandlerMapping:org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,通过定义的 beanName 进行查找要请求的Controller。BeanNameUrlHandlerMapping 是默认的 HandlerMapping 实现。BeanNameUrlHandlerMapping 将请求 URL 映射到具有相同名称的bean,这个特定映射支持直接名称匹配以及使用“*”模式的模式匹配。
例如:传入URL“/ foo”映射到名为“/ foo”的bean 。模式映射的一个示例是将请求从“/ foo *”映射到名称以“/ foo”开头的bean,例如“ / foo2 /”或“ / fooOne /”。
1 @Configuration
2 public class BeanNameUrlHandlerMappingConfig {
3 @Bean
4 BeanNameUrlHandlerMapping beanNameUrlHandlerMapping() {
5 return new BeanNameUrlHandlerMapping();
6 }
7
8 @Bean("/beanNameUrl")
9 public WelcomeController welcome() {
10 return new WelcomeController();
11 }
12 }
等效的 xml 配置:
1 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
2 <bean name="/beanNameUrl" class="com.xxx.WelcomeController" />
在这两种配置中,都不需要为 BeanNameUrlHandlerMapping 定义bean,因为 Spring MVC 提供了它。所有对“/ beanNameUrl”的请求都将由 DispatcherServlet 转发到“ WelcomeController ”。WelcomeController 返回一个名为“ welcome ” 的视图名称。
Spring MVC:HandlerMapping的更多相关文章
- Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化
前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...
- spring mvc 自定义Handlermapping
上次大概写了个可以解决velocity 多视图的东西. 但是实际运用过程中又到处找了些资料看了下.这里 小计下: DispatcherServlet解析过程: ..1..HandlerMapping. ...
- Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)
本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...
- Spring MVC 梳理 - handlerMapping和handlerAdapter分析
参考图片 综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程 ①:获取Request的URL ②:从UrlLookup这个map中找到相应的requ ...
- Spring MVC:DispatchServlet类
Spring MVC架构 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中.传统的模型层被拆分为了业务层(Service)和数据访问层 ...
- Spring MVC:使用SimpleUrlHandlerMapping的一个简单例子
实现一个控制器ShirdrnController,如下所示: package org.shirdrn.spring.mvc; import java.util.Date; import javax.s ...
- spring mvc:复选框(多选)
以user为例,user下有 username用户,password密码, address地址, receivePaper是否订阅, favotireFramework兴趣爱好, user.java ...
- spring mvc:常用标签库(文本框,密码框,文本域,复选框,单选按钮,下拉框隐藏于,上传文件等)
在jsp页面需要引入:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form&q ...
- Spring MVC : Java模板引擎 Thymeleaf (二)
本文原计划直接介绍Thymeleaf的视图解析,但考虑到学习的方便,决定先构建一个spring-mvc. 以下的全部过程仅仅要一个记事本和JDK就够了. 第一步,使用maven构建一个web app. ...
随机推荐
- 从 1 开始学 JVM 系列 | JVM 类加载器(一)
从 1 开始学 JVM 系列 类加载器,对于很多人来说并不陌生.我自己第一次听到这个概念时觉得有点"高大上",觉得只有深入 JDK 源码才会触碰到 ClassLoader,平时都是 ...
- crontab 语法和最快速的学习
1.Cron 时间表语法 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 ( ...
- 一文梳理清楚mysql各种锁
全局锁: 1.FTWRL(读锁) 用于做全库的逻辑备份 加锁:FLUSH TABLES WITH READ LOCK 解锁:unlock tables 表级锁: 1.表锁 表锁的读锁和写锁 加锁:lo ...
- Django学习day03随堂笔记
每日测验 """ 今日考题 1.什么是静态文件,django静态文件配置如何配置,如何解决接口前缀不断变化,html页面上路径的引用需要反复修改的问题 2.request ...
- Java基础系列(30)- 命令行传参
命令行传参 有时候你希望运行一个程序的时候再传递给它消息.这就要靠传递命令行参数main()函数实现 package method; public class CommandLine { public ...
- Jmeter系列(7)- 分析源码,创建下单、用户注销接口请求
源码分析 下单 用户注销 创建请求 下单 用户注销 请求调整 将信息头管理器从[02.浏览订单]请求中抽出来就变成公用的.[03,04]请求不需要单独再加信息头管理器 DeBug取样器 添加DeBug ...
- whistle浏览器抓包(以火狐浏览器为例)
环境:whistle:1.14.6 whistle浏览器抓包 以火狐浏览器为例 1.启动whistle 使用w2 start启动whistle. 退出cmd后,whistle自动关闭了,所以每次使用w ...
- First Linux Centos 7.2 rpm 安装MySQL 5.7
服务器需要换python环境,手贱重装了,今天凑巧需要测试数据库,花了一个小时搞了一下MySQL安装. 1.删除原有Mariadb 说明:目前centos默认的MySQL是Mariadb,由于习惯了M ...
- 将可执行程序设为linux服务启动
将可执行程序设为linux服务启动 如何将我们自己的程序设为linux的一个服务程序,并实现开机启动,需要经过如下三步: 1 把可执行程序放在一个linux系统可以找到的地方. ...
- 好未来数据中台 Node.js BFF实践(一):基础篇
好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...