Spring mvc HandlerMapping 实现机制
概述
当DispatcherServlet接受到客户端的请求后,SpringMVC 通过 HandlerMapping 找到请求的Controller。
HandlerMapping 在这里起到路由的作用,负责找到请求的Controller。
Spring MVC 默认提供了4种 HandlerMapping的实现
- org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
通过配置请求路径和Controller映射建立关系,找到相应的Controller - org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping
通过 Controller 的类名找到请求的Controller。 - org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
通过定义的 beanName 进行查找要请求的Controller - 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种访问路径
- SimpleUrlHandlerMapping
访问方式: http://ip:port/project/userlist.htm - ControllerClassNameHandlerMapping
访问方式: http://ip:port/project/user
注:类的首字母要小写 - BeanNameUrlHandlerMapping
访问方式: http://ip:port/project/users
注:bean name属性必须要以“/”开头。 - 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 实现机制相关推荐
- three.js 一个页面可以存在多个render吗_你确定把Spring MVC的视图机制吃透了吗?...
# 前言 SpringMVC是目前主流的Web MVC框架之一. 本文将分析SpringMVC的视图这部分内容,让读者了解SpringMVC视图的设计原理. # 重要接口和类介绍 1. View接口 ...
- Spring mvc DispatchServlet 实现机制
在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件.而 ...
- Spring mvc ViewResolver视图解析器实现机制
概要 我们在controller里面经常这样return一个ModelAndView. return new ModelAndView("userList", "user ...
- 【Java学习路线之JavaWeb】Spring MVC框架入门教程
文章目录 读者 阅读条件 MVC设计模式简介 JSP+JavaBean Servlet+JSP+JavaBean MVC优缺点 优点 缺点 Spring MVC是什么 Spring MVC优点 第一个 ...
- 【Spring-MVC基础】由浅入深-Spring MVC
本文致力于由浅入深的去介绍,使用Spring MVC:细节比较多,希望能对正在观看的你有所帮助! 博主水平有限,难免存在缺陷和错误,欢迎大佬的指出与补充,谢谢! 0x01.认识Spring MVC 1 ...
- Spring MVC中数据绑定流程和原理
Spring MVC不支持表单日期字符串和日期类型之间的转换 Spring MVC数据绑定的流程(Spring MVC通过反射 机制对目标处理方法进行解析) 1.Spring MVC将ServletR ...
- Spring 2.5:Spring MVC中的新特性
转载说明:infoQ就是牛人多,看人家去年就把Spring2.5注视驱动的MVC写出来了,还是这么详细,我真是自叹不如,今天偶尔看到这篇文章非常认真的拜读了2遍,简直是茅厕顿开啊....\(^o^)/ ...
- Java Web系列:Spring MVC基础
1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...
- Spring MVC数据转换、格式化、校验、文件上传和下载
本篇文章主要分享下自己在学习Spring MVC数据转换.格式化和数据校验.Spring MVC文件上传和下载以及Spring MVC拦截器遇到的一些问题和读书笔记,希望对你有所帮助. @Compon ...
最新文章
- oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
- [转]linux各文件夹介绍
- python的基本语法if语句_Python基础之条件控制操作示例【if语句】
- 使用程序修改域帐户直接领导时遇到的错误
- htcvr设备计算机配置,VR对电脑配置要求高吗?HTC Vive电脑配置要求
- js便签笔记(3)——切记:appendChild()、insertBefore()是移动element节点!
- cisco学习笔记(2)
- Linux 命令(21)—— cd 命令(builtin)
- MySQL数据库篇之索引原理与慢查询优化之一
- Kyoto Tycoon挂载LevelDB,编译安装篇
- 如何利用迅雷下载百度云获取实际下载地址
- Windows Server 2019 Datacenter OVF 模板 百度网盘 下载
- 时间序列分析中的增长率——同比与环比
- iol植入手术过程_有晶体眼IOL植入技术
- 微信小程序——new Date()显示NAN + 正则表达式
- 人力资源外包是什么?转型灵活用工系统,解决服务痛点
- html5悬浮圆圈背景动画特效,html5圆圈浮动背景动画特效
- BIM应用(VR\AR\MR)相关设备及软件——来自《中国建筑业BIM应用分析报告(2020)》
- Python图像处理之透视变换
- [Unity插件]Flux 插件
热门文章
- ArrayList和HashSet
- 全面涵盖传统方法和深度学习方法:3D人脸识别的十年发展及未来趋势
- ACL 2021 | Glancing Transformer:惊鸿一瞥的并行生成模型
- 视觉与听觉相结合的深度跨域情绪识别
- 本周有哪些值得读的 AI 论文?进来告诉你答案
- 医学影像中用 python 读取 nrrd 文件、nrrd转nii、nrrd转h5
- 04 | 负载均衡:Ribbon 如何保证微服务的高可用
- J2EE经典面试题及答案
- visual studio code python插件下载_visual studio code 的必装推荐插件plugin, vscode, vsc
- spring原始注解(value)-03