Spring Boot 2.0.2-webmvc源码分析(一)

在介绍webmvc模块之前,需要先简单回顾一下Servlet。如果对Servlet知识比较熟悉的可以跳过该篇,直接阅读后面章节。

Servlet是Java Servlet的简称,用Java编写的服务器端程序,具有独立于平台的特性,主要功能在于接收客户端请求,并生成动态Web内容进行响应。
Servlet运行于支持Java的应用服务器上。从原理上讲,Servlet可以响应任何类型的请求,但大多数情况下Servlet用来扩展基于HTTP协议的Web服务器。

实现过程

Servlet 的主要功能在接收客户端请求,生成动态 Web 内容进行响应。这个过程为:
1、客户端发送请求至服务器端。
2、服务器将请求信息发送至Servlet。
3、Servlet生成响应内容并将其传给服务器,根据客户端的请求动态生成响应内容。
4、服务器将响应返回给客户端。

生命周期

1、客户端请求至Servlet.
2、加载Servlet类到内存。
3、实例化并调用init()方法初始化该Servlet。
4、调用service()方法。(根据请求方法不同调用doGet() 或者 doPost(),还有doHead()、doPut()等方法。
5、当server关闭时,调用servlet的destroy()方法。

下面是Servlet的执行流程

Server 创建一个 Servlet的实例,当第一个客户端的请求到达 Server,Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 标签下配置 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)。
Server 创建一个请求对象ServletRequest,用来进行处理客户端请求。
同时创建一个响应对象ServletResponse,用来响应客户端请求。
Server 调用Servlet 的 service() 方法,传递请求和响应对象作为参数,
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获取需要的信息。然后调用响应对象的方法,将获取的信息传回Server,最终到达客户端。service()方法在执行时可以使用不同的方法处理请求,如 doGet() 或 doPost()。

对于更多的客户端请求,Server 创建新的请求和响应对象,仍然调用此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的流程,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

下图显示了一个典型的 Servlet 生命周期方案:

image.png

1、Servlet容器在启动时会加载Servlet。
2、第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。Servlet 容器在调用 service() 方法。
3、当有多个请求同时访问该Servlet时,Servlet 容器创建多个线程来处理这些请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

工作模式

1、客户端发送请求至服务器.
2、服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器。
3、服务器将响应返回客户端。

Servlet小结:

从上面内容可以看出,当客户端第一个请求访问servlet时,服务器会创建该servlet实例调用init()方法进行初始化,init方法只会执行一次。
当有多个线程同时访问该servlet时,服务端不会再创建servlet实例,都是共享一个servlet对象,可以理解为单例模式。
执行的service方法是一个,所以在使用servlet的时候,尽量不要定义成员变量,不然带来线程安全问题

下面是Spring Boot 2.0.2版本内嵌tomcat容器tomcat-embed-core-8.5.31.jar内部Servlet接口定义,和上述描述一致。

public interface Servlet {

   
    public void init(ServletConfig config) throws ServletException;

   
    public ServletConfig getServletConfig();

   
    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

   
    public String getServletInfo();

   
    public void destroy();
}

本篇内容就介绍到这里,下一篇开始webmvc模块源码分析。

你可能感兴趣的:(Spring Boot 2.0.2-webmvc源码分析(一))