Servlet生命周期,Servlet是线程安全的吗?

目录

首先我们先了解一下什么是Servlet

servlet生命周期

Servlet是线程安全的吗? 


首先我们先了解一下什么是Servlet

        在JavaWeb中有三大组件,分别是Servlet、Filter和Listener。其中Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,即接收请求数据、处理请求和完成响应。        
       Servlet是运行在Web服务器端的Java应用程序,Servlet对象主要封装了对HTTP请求的处理,并且他的运行需要Servlet容器的支持,提供了Servlet功能的服务器,叫做Servlet容器。
 1. 实现Servlet的方式
  主要有三种实现方式:①实现javax.servlet.Servlet接口;② 继承javax.servlet.GenericServlet类;③继承javax.servlet.http.HttpServlet类;其中最常用的继承HttpServlet类来实现。
   

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();

}

以上是Servlet接口的源码,主要有五个方法,其中与Servlet生命周期有关的方法有 init方法、service方法和destroy方法。
(1) 加载和实例化;在第一次请求Servlet时,Servlet容器将会创建Servlet实例;
(2) 初始化;Servlet容器加载完成Servlet之后,必须进行初始化,此时,init方法将被调用;
(3) Servlet初始化之后,就处于响应请求的就绪状态,此时如有客户端请求发送,就会调用Servlet实例的service()方法,并且根据用户的请求方式,调用doPost或者doGet方法;
(4) 最后,Servlet容器负责将Servlet实例进行销毁,调用destroy方法实现;对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。
一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

下面用张图片总结一下:

Servlet生命周期,Servlet是线程安全的吗?_第1张图片

Servlet是线程安全的吗? 

        什么是线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
我们都知道servlet是多线程的,同时一个servlet实现类只会有一个实例对象,也就是它是单例的,所以多个线程是可能会访问同一个servlet实例对象的。所以servlet是线程不安全的。

你可能感兴趣的:(JavaEE,servlet,java)