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的更多相关文章

  1. Spring MVC的handlermapping之SimpleUrlHandlerMapping初始化

    前面信息同BeanNameUrlHandlerMapping,这里不再过多分析,详情请看 :Spring MVC的handlermapping之BeanNameUrlHandlerMapping初始化 ...

  2. spring mvc 自定义Handlermapping

    上次大概写了个可以解决velocity 多视图的东西. 但是实际运用过程中又到处找了些资料看了下.这里 小计下: DispatcherServlet解析过程: ..1..HandlerMapping. ...

  3. Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)

    本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...

  4. Spring MVC 梳理 - handlerMapping和handlerAdapter分析

    参考图片 综上所述我们来猜测一下spring mvc 中根据URL找到处理器Controller中相应方法的流程 ①:获取Request的URL ②:从UrlLookup这个map中找到相应的requ ...

  5. Spring MVC:DispatchServlet类

    Spring MVC架构 Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就已包含在Spring框架中.传统的模型层被拆分为了业务层(Service)和数据访问层 ...

  6. Spring MVC:使用SimpleUrlHandlerMapping的一个简单例子

    实现一个控制器ShirdrnController,如下所示: package org.shirdrn.spring.mvc; import java.util.Date; import javax.s ...

  7. spring mvc:复选框(多选)

    以user为例,user下有 username用户,password密码, address地址, receivePaper是否订阅, favotireFramework兴趣爱好, user.java ...

  8. spring mvc:常用标签库(文本框,密码框,文本域,复选框,单选按钮,下拉框隐藏于,上传文件等)

    在jsp页面需要引入:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form&q ...

  9. Spring MVC : Java模板引擎 Thymeleaf (二)

    本文原计划直接介绍Thymeleaf的视图解析,但考虑到学习的方便,决定先构建一个spring-mvc. 以下的全部过程仅仅要一个记事本和JDK就够了. 第一步,使用maven构建一个web app. ...

随机推荐

  1. 从输入 URL 到展现页面的全过程

    总体分为以下几个过程 DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 DNS解析 域名到ip地址转换 TCP连接 HTTP连接是基于TCP连接 ...

  2. Linux安装Cockpit监控服务

    CentOS/RHEL 8的新特性之一就是自带了一个cockpit的监控服务.通过c/s架构模式运行,客户端输入ip:端口即可访问 这类似于glances监控. 如果你不是使用的centos/rhel ...

  3. supermvc 操作备要

    模板暂时仅支持smarty,需要指定模板文件   系统配置文件在supermvc文件夹下 sconfig.php 修改项目目录下的conf下的config.php 会覆盖系统默认配置   contro ...

  4. java中避免集合死链调用

    目录 1. 前言 2. 场景 3. 环境 3.1 开发环境准备 3.2 数据准备 3.2.1 Mysql数据库表及数据 3.2.2 redis库数据 4. 解决方式 5.完整代码 5.1Model 5 ...

  5. Elasticsearch6.8.6版本 在head插件中 对数据的增删改操作

    一.访问ES方法:http://IP:PORT/ 一.创建索引:head插件创建索引的实例:在"索引"-"新建索引"中创建索引名称,默认了分片与副本情况: 直接 ...

  6. gin 源码阅读(2) - http请求是如何流入gin的?

    推荐阅读: gin 源码阅读(1) - gin 与 net/http 的关系 本篇文章是 gin 源码分析系列的第二篇,这篇文章我们主要弄清一个问题:一个请求通过 net/http 的 socket ...

  7. httprunner开发实践&源码解析

    上次作业讲解 排错 控制台查看报错信息 打开代理工具,调试脚本 注释掉其他接口,先跑一个接口 pip uninstall httprunner 修复断言100为int型问题 修复两次登陆问题 报告 p ...

  8. 配置php redis 扩展

    参照runoob:PHP 使用 Redis Windows: - 假设redis已经安装好 服务启动 - xampp (php 7.1 x86 windows) 查看phpinfo (php 7.1 ...

  9. re.findall用法

    其中,re.findall() 函数可以遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表. 在python源代码中,展示如下: 搜索string,返回一个顺序访问每一个匹配结果(Match对象 ...

  10. P5074-Eat the Trees【插头dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5074 题目大意 给出一个\(n\times m\)的网格,有的必须铺线有的不能,铺成若干条闭合回路,求方案数. ...