SpringMVC 工作原理

103 阅读5分钟

一个请求是如何映射到我们写的 controller 类中的,本篇文章将彻底讲清楚。

这个是我在面试过程中碰到比较高频率的问题。记得之前面试五八同城,面试官就问到这个问题,恰巧在面试之前背过工作原理,所以很流畅的讲了出来,讲完后面试官点点头看着我,然后夸我说背的挺熟,当然还有一些其他的问题回答的也比较顺利,随后就进入了二面。其实个人主观认为面试是一件有运气成分的事情,恰巧面试的问题都掌握或者刚刚复习过,就会很顺利的拿到 offer。

说回本篇文章的主题,每次找工作都是背一下 SpringMVC 工作流程,但有一些原理和细节不是很清楚,本篇文档将尝试理解 SpringMVC 的工作原理

基本概念

  • 基于 Spring 容器。将 @controller 注解修饰的类注册到 Spring 容器中,也使用 Spring 中 aop 功能(拦截处理)。
  • 使用 MVC 编程理念。核心是 DispatcherServlet 前端控制器,它的本质是一个 Servlet 类(继承 HttpServlet)。

Servlet

什么是 Servlet

Servlet 是基于 Http 协议,按照 servlet 规范编写的 Java 程序,其运行在 web 容器中,如 Tomcat 或者 Jetty 中。客户端发送请求首先回到 web 容器中,web 容器接收到消息会转发给 servlet 进行处理,web 容器与 servlet 是如何交互的?是通过 servlet 接口,只要我们编写的类符合 servlet 规范,就会被 web 容器识别并管理。

Servlet = Server + Applet

Servlet 生命周期

Servlet 生命周期分为三个阶段,分别为初始化阶段使用阶段卸载阶段

  • Servlet 初始化后调用 init ()  方法。
  • Servlet 调用 service()  方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy()  方法。

image.png

初始化阶段

1、servlet容器加载servlet类,把servlet类的.class文件中的数据读到内存中。
2、servlet容器创建一个servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。
3、servlet容器创建一个servlet对象。
4、servlet容器调用servlet对象的init方法进行初始化。

使用阶段

1、servlet容器接收到一个请求时,servlet容器会针对这个请求创建servletRequest和servletResponse对象。
2、然后调用service方法。并将这两个参数传递给service方法。service方法通过servletRequest对象获得请求的信息。并处理该请求。
3、再通过servletResponse对象生成这个请求的响应结果。然后销毁servletRequest和servletResponse对象。不管这个请求时post提交的还是get提交的,这一种这个请求都会由service方法来处理。

卸载阶段

当web应用被终止时,servlet容器会先调用servlet对象的destroy方法,然后在销毁servlet对象,同时也会销毁与servlet对象相关联的servletConfig对象。我们可以在destroy方法的实现中,释放servlet所占用的资源,如关闭数据库连接,关闭文件输入输出流等。

Servlet 如何处理请求

当用户从浏览器向服务器发起一个请求,通常会包含如下信息:http://hostname: port /contextpath/servletpath,hostname 和 port 是用来与服务器建立 TCP 连接,而后面的 URL 才是用来选择服务器中那个子容器服务用户的请求。那服务器是如何根据这个 URL 来达到正确的 Servlet 容器中的呢?
Tomcat中这件事很容易解决,因为这种映射工作有专门的一个类来完成,这个类保存了Tomcat的container容器中所有子容器的信息。当 Request 进入 Container 容器之前,它要访问那个子容器这时就已经确定了。
当用户发送一个请求到某个servlet的时候,servlet容器会创建一个servletRequest和servletResponse对象。在servletRequest对象中封装了用户的请求信息,然后servlet容器把servletRequest和servletResponse对象传递给用户所请求的servlet,servlet把处理好的结果卸载servletResponse中,然后servlet容器把响应结果传给用户

SpringBoot 与 SpringMVC 的关系

使用 SpringBoot 作为开发框架,是看不到 SpringMVC 相关配置。但如果继承 web 项目,使用 SpringMVC 作为 MVC 框架,其处理请求还是使用 SpringMVC 框架。SpringBoot 为 SpringMVC 做了自动装配,并不是替代 SpringMVC 框架。

相关注解

  • @Controller: 返回一个视图,属于传统的 SpringMVC 应用,一般作用于前后端不分离的情况。
  • @RestController: 相当于 @Controller 和 @ResponseBody。返回一个 Json 或者 xml 数据对象,一般使用于 Restful Web 服务

工作原理

未命名文件 (2).png

  1. SpringMVC 会将请求提交到 DispatcherServlet 前端控制器,由前端控制器统一处理和响应请求
  2. DispatcherServlet 将查询一个或者多个 HandlerMapping 找到处理请求 Controller
  3. DispatcherServlet 将请求提交到目标 Controller
  4. Controller 进行业务处理返回一个 ModelAndView
  5. DispatcherServlet 查询一个或多个 ViewResolver 视图解析器找到 ModelAndView 对象指定的视图对象
  6. 视图对象负责渲染返回给客户端

对于本篇文章或者其他技术交流,可以加我微信:QTG43432166。也会有相关岗位推荐。

参考文章:

www.springmvc.cn/archives/54…

www.runoob.com/servlet/ser…