当前位置: 首页 > article >正文

Springmvc原理解析

在这里插入图片描述

1. DispatcherServlet

springmvc的核心控制器,负责截获所有的请求,当截获请求后委托给HandlerMapping进行请求映射的解析工作,目的是找到哪一个Controller的方法可以处理该请求,找到后再交由给HandlerAdaptor去负责调用并返回ModelAndView对象,然后将ModelAndView对象交给相应的视图解析器(ViewResolver)解析成对应的视图(View)对象,最后由这个视图对象响应客户端。

2. HandlerMapping和HandlerAdapter

当xml配置了mvc:annotation-driven/或者配置类中配置了@EnableWebMvc注解时,spring会自动装配RequestMappingHandlerMapping(请求映射处理器)RequestMappingHandlerAdapter(请求处理适配器)这两个类。

**RequestMappingHandlerMapping:**负责解析带有@ReqeustMapping注解的方法以及类信息,并在请求到达时找到相应的HandlerMethod(一个JavaBean,封装了请求处理方法、参数信息、类信息以及IOC容器等重要的内容)。当找到相应的HandlerMethod后,如果程序中有定义拦截器,那么就会将这个HandlerMethod封装到HandlerExecutionChain的类中,这个类包含了一个拦截器的集合和一个HandlerMethod的对象。最后将这个chain返回给DispatcherServlet。DispatcherServlet从这个HandlerExecutionChain中取出HandlerMethod来匹配相应的HandlerAdapter,找到合适的可以调用HandlerMathod的请求处理适配器。接着DispatcherServlet负责调用HandlerExecutionChain中的所有拦截器中的预处理方法,如果预处理方法没有任何问题,那么就将HandlerMethod交给HandlerAdapter去调用。

**RequestMappingHandlerAdapter:**DispatcherServlet将HandlerMethod传递给HandlerAdapter,由它负责调用HandlerMethod(也就是目标控制器的方法)。调用时还会使用具体的MethodArgumentResolver(方法参数解析器,RequestMappingHandlerAdapter内部会初始化一系列默认的HandlerMethodArgumentResolver)将请求中的参数解析为请求处理方法所需要的具体类型参数。最后将Controller方法返回的ModelAndView一并返回到DispatcherServlet中。接着DispatcherServlet会继续执行所有拦截器中的后置处理方法。

3. ViewResolver

springmvc内部提供了许多视图解析器用于解析不同的视图对象,最长见的有InternalResourceViewResolver(内部资源视图解析器)、FreeMarkerViewResolver(模板引擎视图解析器)等。

**InternalResourceViewResolver:**在DispatcherServlet接收到HandlerAdapter返回的ModelAndView之后,DispatcherServlet将这个ModelAndView交给指定InternalResourceViewResolver来进行视图解析,InternalResourceViewResolver会根据ModelAndView的视图名称来创建一个InternalResourceView的视图对象返回到DispatcherServlet。由DispatcherServlet去调用视图对象的渲染方法来响应视图。在渲染完视图之后,DispatcherServlet会执行所有拦截器中的after方法。

4. View

视图对象是由相应的视图解析器解析出来的,Spring也提供了不同的视图对象来完成不同的视图响应工作,常见的有的InternalResourceView(内部资源转发视图)等。

**InternalResourceView:**这个视图对象会将ModeAndView中而外带的数据放入请求作用域,以及获取到拼接好的转发地址。并提供一个renderMergedOutputModel渲染方法由DispatcherServlet调用,这个方法就是负责具体的url转发工作。


http://www.kler.cn/a/145486.html

相关文章:

  • 【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?
  • Linux安装mysql5.7
  • Spring Boot MyBatis Plus 版本兼容问题(记录)
  • 【数据结构进阶】红黑树超详解 + 实现(附源码)
  • 把网站程序数据上传到服务器的方法和注意事项
  • 如何理解json和json字符串
  • C语言第三十弹---打印一个整数的每一位数
  • 数据结构 / day04 作业
  • 微服务-京东秒杀
  • 虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!
  • 频剪辑软件Corel VideoStudio 会声会影2024最新7大新全新功能解析
  • 脚本自动化定制开发:实现高效工作的魔法钥匙
  • steam/csgo搬砖项目真能月入过万吗?到底真的假的
  • Qt手写ListView
  • kafka详细讲解与安装
  • 2023年亚太杯数学建模A题解题思路(*基于OpenCV的复杂背景下苹果目标的识别定位方法研究)
  • MVCC多版本并发控制相关面试题整理
  • Python基础【三】--数据类型-Number【2023.11.23】
  • 吴恩达《机器学习》10-4-10-5:诊断偏差和方差、正则化和偏差/方差
  • 区间第k小数 (可持久化线段树、主席树)
  • 计算机组成原理4
  • 【华为OD】B\C卷真题 100%通过:找城市 多叉树实现 python源码
  • python 点云las生成深度图
  • VMware 安装 Centos7 超详细过程
  • 安装Anaconda、PyTorch(GPU版)库与PyCharm】
  • 云原生Kubernetes系列 | Kubernetes静态Pod的使用