Servlet和SpringMVC处理请求流程

很尴尬 之前面试被问懵逼了 吓得我赶紧在回顾一下

一、还是先说最简单的Servlet的处理流程吧

基本的话有四大部分:
1.初始化阶段(调用init()方法)

一旦Servlet实例被创建,Web服务器会自动调用init(ServletConfig config)方法来初始化该Servlet。其中方法参数config中包含了Servlet的配置信息,比如初始化参数,该对象由服务器创建。配置了两个初始化参数user和blog

2.响应客户请求阶段,调用service()方法

而对于service方法,一般来说这个方法是不需要重写的,因为在HttpServlet中已经有了很好的实现,它会根据请求的方式,调用doGet,doPost以及其他的doXXXt方法,也就是说service是用来转向的,所以我们一般写一个servlet,只需要重写doGet或者doPost就可以了。servlet中service方法会自动调回的。

3.由service()方法根据提交的方式选择doGet()和doPost()

4.终止阶段(调用destory()方法实现销毁)

当Web服务器认为Servlet实例没有存在的必要了,比如应用重新装载,或服务器关闭,以及Servlet很长时间都没有被访问过。服务器可以从内存中销毁(也叫卸载)该实例。Web服务器必须保证在卸载Servlet实例之前调用该实例的destroy()方法,以便回收Servlet申请的资源或进行其它的重要的处理。

Web服务器必须保证调用destroy()方法之前,让所有正在运行在该实例的service()方法中的线程退出或者等待这些线程一段时间。一旦destroy()方法已经执行,Web服务器将拒绝所有的新到来的对该Servlet实例的请求,destroy()方法退出,该Servlet实例即可以被垃圾回收

前面说过了Servlet的处理流程,现在的话要说一个很细微的servlet解析客户端http请求的问题

  1. web客户向Servlet容器发出HTTP请求;

  2. Servlet容器解析web的HTTP请求.

  3. Servlet容器创建一个HttpRequest对象,在这个对象中封装了http请求信息;

  4. Servlet容器创建一个HttpResponse对象;

  5. Servlet容器(如果访问的该servlet不是在服务器启动时创建的,则先创建servlet实例并调用init()方法初始化对象)调用HttpServlet的service()方法,把HttpRequest和HttpResponse对象为service方法的参数传给HttpServlet对象;

  6. HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;

  7. HttpServlet调用HttpResponse的有关方法,生成响应数据;

  8. Servlet容器把HttpServlet的响应结果传给web客户.

二、现在开始说SpringMVC的请求处理流程

1.用户向服务端发送请求,请求被Spring前端控制DispatcherServlet捕获

2.DispatcherServlet对请求的URL进行解析,调用HandlerMapping获取Hander配置的所有对象(包括拦截器)

3.DispatchServlet根据获得的Handler,选择合适的HanderAdapter适配器

4.提取Request中的模型数据,填充Handler入参

5.Handler执行完成后,向DispatchServlet返回一个ModelAndView对象

6.根据返回的ModelAndView,选择一个适合的ViewResolver视图解析器返回给DispatchServlet

7.ViewResolver视图解析器结合Model和View渲染视图

8.把渲染结果返回给客户端

Servlet和SpringMVC处理请求流程