概述

当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。
HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。

Spring MVC 默认提供了4种 HandlerMapping的实现

  1. org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
    通过配置请求路径和Controller映射建立关系,找到相应的Controller
  2. org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
    通过 Controller 的类名找到请求的Controller。
  3. org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
    通过定义的 beanName 进行查找要请求的Controller
  4. org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    通过注解 @RequestMapping(“/userlist”) 来查找对应的Controller。

HandlerMapping 的4种配置

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"><property name="mappings"><props><prop key="/userlist.htm">userController</prop></props></property>
</bean><bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/><bean id="userController" name="/users" class="cn.com.infcn.web.controller.UserController"></bean>

UserController

@Controller
public class UserController extends AbstractController {@Override@RequestMapping("/userlist")protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)throws Exception {List<User> userList = new ArrayList<User>();userList.add(new User("zhangsan", 18));userList.add(new User("list", 16));return new ModelAndView("userList", "users", userList);}
}

HandlerMapping 4种访问路径

  1. SimpleUrlHandlerMapping
    访问方式: http://ip:port/project/userlist.htm
  2. ControllerClassNameHandlerMapping
    访问方式: http://ip:port/project/user
    注:类的首字母要小写
  3. BeanNameUrlHandlerMapping
    访问方式: http://ip:port/project/users
    注:bean name属性必须要以“/”开头。
  4. DefaultAnnotationHandlerMapping
    访问方式: http://ip:port/project/userlist
    注:@RequestMapping(“/userlist”)定义的路径

HandlerMapping 初始化原理

继续上一篇Spring mvc DispatchServlet 实现机制 初始化DispatchServlet的时候,执行了初始化HandlerMapping操作。

initHandlerMapping() 方法


1. 判断detectAllHandlerMappings是否为true,如果为true,则加载当前系统中所有实现了HandlerMapping接口的bean。
2. 如果为false,则加载bean名称为“handlermapping”的HandlerMapping实现类。
3. 如果还没有找到HandlerMapping,则加载SpvingMVC 配置文件中,默认配置的HandlerMapping。

detectAllHandlerMappings 设置

detectAllHandlerMappings 默认为true,如果只想加载自己指定的HandlerMapping,请使用下面的方式指定

如果这样指定,则Spring MVC 只会加载这个HandlerMapping,而不会加载配置的其它的HandlerMapping。

SimpleUrlHandlerMapping

以SimpleUrlHandlerMapping 为例,简单分析下HandlerMapping

从SimpleUrlHandlerMapping 类结构中我们可以发现urlMap属性。这个urlMap中保存了xml中配置的映射关系,通过setMappings方法填充到urlMap中。

这个urlMap就充当了SpringMVC的路由功能。

每个HandlerMapping都会有一个这样的Map。

DispatcherServlet.doDispatch()

当用户请求时,真正的请求会执行到DispatcherServlet的doDispatch()方法。

1. 通过getHandler() 方法去查找HandlerMapping中查找对应的Controller,并封装成HandlerExecutionChain。
2. 如果找不到,则执行noHandlerFound() 方法。

getHandler() 方法


迭代查找所有的HandlerMapping,如果找到则直接返回。

noHandlerFound() 方法


如果找不到Controller 则后台抛出异常或响应给前台 404。


想了解更多精彩内容请关注我的公众号

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT

Spring mvc HandlerMapping 实现机制相关推荐

  1. three.js 一个页面可以存在多个render吗_你确定把Spring MVC的视图机制吃透了吗?...

    # 前言 SpringMVC是目前主流的Web MVC框架之一. 本文将分析SpringMVC的视图这部分内容,让读者了解SpringMVC视图的设计原理. # 重要接口和类介绍 1. View接口 ...

  2. Spring mvc DispatchServlet 实现机制

    在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件.而 ...

  3. Spring mvc ViewResolver视图解析器实现机制

    概要 我们在controller里面经常这样return一个ModelAndView. return new ModelAndView("userList", "user ...

  4. 【Java学习路线之JavaWeb】Spring MVC框架入门教程

    文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...

  5. 【Spring-MVC基础】由浅入深-Spring MVC

    本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...

  6. Spring MVC中数据绑定流程和原理

    Spring MVC不支持表单日期字符串和日期类型之间的转换 Spring MVC数据绑定的流程(Spring MVC通过反射 机制对目标处理方法进行解析) 1.Spring MVC将ServletR ...

  7. Spring 2.5:Spring MVC中的新特性

    转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...

  8. Java Web系列:Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  9. Spring MVC数据转换、格式化、校验、文件上传和下载

    本篇文章主要分享下自己在学习Spring MVC数据转换.格式化和数据校验.Spring MVC文件上传和下载以及Spring MVC拦截器遇到的一些问题和读书笔记,希望对你有所帮助. @Compon ...

最新文章

  1. oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
  2. [转]linux各文件夹介绍
  3. python的基本语法if语句_Python基础之条件控制操作示例【if语句】
  4. 使用程序修改域帐户直接领导时遇到的错误
  5. htcvr设备计算机配置,VR对电脑配置要求高吗?HTC Vive电脑配置要求
  6. js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!
  7. cisco学习笔记(2)
  8. Linux 命令(21)—— cd 命令(builtin)
  9. MySQL数据库篇之索引原理与慢查询优化之一
  10. Kyoto Tycoon挂载LevelDB,编译安装篇
  11. 如何利用迅雷下载百度云获取实际下载地址
  12. Windows Server 2019 Datacenter OVF 模板 百度网盘 下载
  13. 时间序列分析中的增长率——同比与环比
  14. iol植入手术过程_有晶体眼IOL植入技术
  15. 微信小程序——new Date()显示NAN + 正则表达式
  16. 人力资源外包是什么?转型灵活用工系统,解决服务痛点
  17. html5悬浮圆圈背景动画特效,html5圆圈浮动背景动画特效
  18. BIM应用(VR\AR\MR)相关设备及软件——来自《中国建筑业BIM应用分析报告(2020)》
  19. Python图像处理之透视变换
  20. [Unity插件]Flux 插件

热门文章

  1. ArrayList和HashSet
  2. 全面涵盖传统方法和深度学习方法:3D人脸识别的十年发展及未来趋势
  3. ACL 2021 | Glancing Transformer:惊鸿一瞥的并行生成模型
  4. 视觉与听觉相结合的深度跨域情绪识别
  5. 本周有哪些值得读的 AI 论文?进来告诉你答案
  6. 医学影像中用 python 读取 nrrd 文件、nrrd转nii、nrrd转h5
  7. 04 | 负载均衡:Ribbon 如何保证微服务的高可用
  8. J2EE经典面试题及答案
  9. visual studio code python插件下载_visual studio code 的必装推荐插件plugin, vscode, vsc
  10. spring原始注解(value)-03