新的一年, 开启新的篇章, 欧气满满, 迎接未来.
前几天回顾了 spring 相关的知识点, 现在再来回顾下 springmvc 相关的知识点做一下总结.
问题总结
之前面试问题总结的那篇文章中, 与 springmvc 相关的有哪些问题:
springmvc 的工作流程?
springmvc dispatcherservlet 与 handleradapter 如何关联?
有了 springmvc 的 IoC 容器, 还需要 spring 的 IoC 容器吗? 为什么? 如何处理兼容问题?
tomcat 容器如何与 springmvc 的 dispatcherservlet 通信的?
问题梳理
springmvc 的工作流程
我根据 springmvc 的流程将流程图画了出来:
请求过来之后, dispatcherServlet 的 url-pattern 拦截请求;
判断在 springmvc 中是否存在对应映射;
若不存在, 判断是否配置
如果配置, 就会找到目标资源, 没有则显示 404 页面;
如果映射存在, 则由 handlerMapping 获 handlerExecutionChain 对象;(注意两点:
1 handlerMapping 定义了请求到处理器之间的映射, 如果发送的请求是没有映射的, 那么得到的 handlerExecutionChain 也不为空, 而是默认的 defaultServletHTTPRequestHandler, 用来处理静态资源等 (配置了 default-servlet-handler, 否则报为 404);
2 handlerExecutionChain 实际上包含了拦截器和目标方法.)
获取 HandlerAdapter 对象;
(包含表单类型的校验, 数据类型的转换, 格式换等功能)
调用 interceptor 拦截器的 preHandle 方法;
调用目标方法;
调用拦截器的 postHandle 方法;
处理视图时候, 观察是否存在异常, 存在异常, 则由 HandlerExceptionResolver 来处理异常, 并得到新的 ModelAndView 对象; 不存在异常, 则由 ViewResolver 视图解析器来解析视图;
调用拦截器的 afterComplettion 方法;
springmvc DispatcherServlet 与 handlerAdapter 如何关联?
DispatcherServlet 拦截到请求之后, 根据 handlerMapping 获取到 handlerExecutionChain 对象, 然后, 在 handlerExecutionChain 对象不为 null 的情况下, 根据 handlerExecutionChain 中的 handler 对象获取 HandlerAdapter 对象;
有了 springmvc 的 IoC 容器, 还需要 spring 的 IoC 容器吗? 为什么? 如何处理兼容问题?
这个问题再进一步, 换个方式提问即是否还需要在 web.xml 方法里面配置启动 springIOC 容器的 ContextLoaderListener?
可以从正反两方面来回答, 首先是需要, 通常情况下, 类似于数据源, 事务, 整合其他框架等都是放在 spring 的配置文件中, 而不是 springmvc 的配置文件中, 一般情况下, 开发过程中的 Service,Dao 也都是放在 spring 的 IoC 容器当中; 其次可以是不需要的, 也可以都放在 springmvc 的配置文件当中, 当然需要分多个 spring 的配置文件, 然后通过 import 节点导入到 springmvc 的配置文件当中.
几点要注意的地方:
1. springIOC 容器和 springmvc 的 IoC 容器 扫描的部分有重合的地方, 就会导致 bean 被创建 2 次, 解决方案: 使用 exclude-filter 和 include-filter 配合来区分哪些 bean 交给 springIOC 容器, 哪些 bean 交给 springmvcIOC 容器;
2. springmvc IoC 容器里面的 bean 可以引用 springIOC 容器的 bean, 反之则不行, 多个 springIOC 容器之间可以设置为父子关系, 以实现良好的解耦. 举个栗子, springIOC 容器好比是全局作用域, springmvcIOC 容器好比是局部作用域, 局部的可以引用全局的, 而全局的却不能引用局部的.
tomcat 容器如何与 springmvc 的 dispatcherservlet 通信的?
Apache Tomcat 软件是 JavaServlet,JavaServerPages,Java ExpressionLanguage 和 JavaWebSocket 技术的开源实现, SpringMVC 则是 spring 推出的基于 servlet 标准的 MVC 框架实现, 由此可知, SpringMvc 和 Tomcat 的结合点就是 Servlet.SpringMVC 的 DispatcherServlet 继承了 HttpServlet, 那么对于 tomcat 来说, springmvc 实际就是一个 Servlet.
一个 http 请求的具体处理流程:
1. 用户向 tomcat 容器发送一个请求;
2. tomcat 容器接收到请求之后, 分析客户的请求信息;
3. tomcat 创建一个 Httprequest 对象, 将用户的请求信息封装到该对象中;
4. tomcat 创建一个 HttpResponse 对象;
5. tomcat 调用 HttpServlet 的 Service 方法, 将 Httprequest,HTTPResponse 传递给 Httpservlet 对象;
6. HttpServlet 调用 HttpRequest 对象的有关方法, 获取 Http 请求信息, HttpServlet 调用 HttpResponse 对象的有关方法, 生成响应数据;
7. tomcat 把 HttpServlet 的响应结果传给 Web 客户.
要注意的几点东西:
1:Web.xml 配置文件的作用其实就是配置 http 请求和 servlet 之间的映射关系, 通过这个配置文件, Tomcat 可以把请求转发给不同的 servlet 实例;
2:springmvc 也是 servlet 标准的一个实现, 所有的 http 请求都映射到 DispatcherServlet 上去, 这个时候, 请求就已经由 Tomcat 转发到 springmvc 框架中去了, 接着再由 DispatcherServlet 将请求转发到各个 Controller 当中去.
小结
这篇文章主要回顾了 springmvc 框架的如何处理 http 请求的过程, 以及其和 Tomcat 容器之间的请发转发是如何实现的, 如果能够熟练掌握, 面试碰到相关的问题, 也能够侃侃而谈了, 同时也是在平时 CURD 之余, 对框架有一个更深层次的理解, 不但要会用, 还要懂得其原理.
来源: https://www.cnblogs.com/yunjiandubu/p/10269713.html