Servlet生命周期
要点和思维图解
-
生命周期5个生命节点
-
Servlet接口继承关系和api使用
-
servlet的xml和注解配置
-
ServletConfig对象
-
servlet的生命周期由servlet容器来管理,该生命周期规定了 Servlet 如何被加载、实例化、初始化、
处理客户端请求,以及何时结束服务。下图展示了Servlet的生命周期的基本过程。
3.1 加载
由servlet容器对Servlet类的字节码进行加载。(这属于Java基础,设计到虚拟机如何加载类文件,不过多介绍。)
3.2 实例化
由servlet容器对Servlet进行实例化。将会调用Servlet类的无参构造器,所以servlet一定要有一个默认的无参构造器,否则会抛出异常。(这个操作时servlet容器来实现,在后面介绍tomcat容器的时候详细介绍。)
3.3 初始化
- 实例化完成后会默认调用Servlet的init(ServletConfig config)方法
public void init(ServletConfig config) throws ServletException;
3.3 处理客户请求阶段
当servlet的实例被创建之后,servlet容器会把相应的请求转到servlet实例的service方法中来。
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
3.3.1 Servlet多线程问题
这里有一个面试经常会被问到的问题,就是servlet是不是线程安全的。转换过来意思就是当用户请求的时候是不是一个请求就是一个实例呢,还是所有的请求都是一个实例?
默认情况下,servlet容器对servlet在一个线程上实现单实例模式,因此servlet在容器中默认不是线程安全的。
但是如果servlet实现了SingleThreadModel接口,那么servlet容器会对该servlet实例实行多实例化。当然也不是每个请求都有是一个实例而是由serve容器确定的。但是这种写法不推荐使用,因为会严重影响容器的响应性能。而且,这个借口已经定义成为了一个过时的接口后续的版本可能会不支持的。
3.4 结束服务
当需确定从服务中移除servlet时,servlet容器会自动调用destroy方法。 一般就是在我们正常停止服务器时,会触发容器的该操作。
public void destroy();
Servlet接口源码
package javax.servlet;
import java.io.IOException;
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();
}
这里还有getServletConfig和getServletInfo方法没介绍。
那我们先来说说getServletInfo这个简单的方法,看源码接口的注释。说该方法是返回一个关于当前servlet的作者,版本,版权等信息的字符串。也就是说在具体的功能中是没有什么作用的。就是提供一些servlet的信息而已。
getServletConfig方法会返回一个ServletConfig对象,看名称我们也清楚它肯定是一个servlet的配置对象。而且是在容器调用init(ServletConfig config)方式时候传进来的。那么它的作用肯定还是蛮大的,下一届我们通过具体的案例来看啊可能servlet接口的架构和ServletConfig参数的具体作用。