4、SpringMVC的执行流程
-
用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。
-
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:
a) 不存在
i. 再判断是否配置了mvc:default-servlet-handler
ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误
iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404错误
b) 存在则执行下面的流程
-
根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。
-
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。
-
如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】
-
提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
a) HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
b) 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
c) 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
d) 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
-
Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。
-
此时将开始执行拦截器的postHandle(…)方法【逆向】。
-
根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。
-
渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。
-
将渲染结果返回给客户端。
先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程
springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器
然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它
先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程
springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器
然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它
先介绍dispatcServlet的流程 web.xml中加载的时候由web容器初始化DispatcherServlet 具体类似于spring的ioc容器实现 即 创建一个WebApplication对象在普通java工程中是apliaction对象由这个对象通过解析springmvc的配置文件初始化容器中的各种bean 比如 视图解析器的Resolver 以及拦截器bean 还有转发页面的视图控制器 这些对象都是存放在集合中的 这也能解释 Interceptor为什么是按照xml的循序执行 底层是for循环遍历这个集合 初始化对象之后进行容器的发布 发布到application中供整个程序使用 然后就是解析 前端的请求的过程
springmvc 前端发起请求 经过dispatchservlet解析url 经过里面的handlerMappering处理器映射器
然后在这里应该是会执行类似web的service方法的操作 第一这个类是继承FrameworkServlet 父类是GenericServlet并且顶级接口是Servelt 并且 重写了 Service方法 学过javaweb应该知道这个服务方法 是判断前端请求的方法传过来的 请求方式并且判断执行 doget|dopost|doput|dodelete 因为重写了方法所以其实调用的还是调用重写的service方法而重写的方法中都是调用的 processRequest方法全权委托给了它
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ey7KOniN-1685020606243)(C:\Users\李开恩\AppData\Roaming\Typora\typora-user-images\image-20230525205311919.png)](https://img-blog.csdnimg.cn/703c8826a92c4a4aa107cb3ac6e7af5b.png)
它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法
判断是什么类型的请求
对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例
再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换
经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上
另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法
它又执行了doservice方法 最终是调用了dispatchservlet的doDispatch方法
判断是什么类型的请求
对应到具体的Controller 这里会创建一个handlerAdapter ha=new … 控制器适配器对象因为每个controller是不同的处理 有的是返回model and view 有的是model各种 创建ha前面的实例
再由 ha.hanlder 这一操作处理controller中的各种操作 对于方法的参数进行入参 这里面hanlder已经对数据进行了类型转换
经过controller中的操作 最终返回一个 mv对象 接着找到视图解析器 如Thymleaf 通过thymleafResvoler的render方法来出来出view 视图名称经过转发到具体的页面 并且将model渲染到页面上
另外interceptor 执行的节点 第一是 pre方法 disservlet 之后controller之前 以及post方法 在controller执行还有回到Dispatchservlet前面 然后最后执行完所有流程之后 执行aftercompletion方法