Servlet 在 web 容器中运行

Servlet 的生命周期

Servlet 在 Web 容器中运行,Tomcat 就是一个实现了 web 容器的服务器。启动 Tomcat 的时候,Tomcat 会加载 Web 应用的 web.xml 配置文件。

有 Http 请求发生的时候,它会在 web.xml 查找匹配当前 url 的 url-pattern。如果能匹配到,则根据该 url-pattern 找到对应的 servlet-name,然后继续在 web.xml 查找名称为 servlet-name 的 servlet,如果能找到则读取该 servlet class 的内容。

实例化 Tomcat 根据该 servlet 的内容,通过反射调用该类的无参构造函数进行 servlet 实例化。

    Class clazz = class.forName("testServlet");
    Object obj = clazz.newInstance();

初始化 然后 Servlet 容器准备 ServletConfig 对象,该对象可以从 web.xml 文件中获取 servlet 的配置信息。
接下来调用 servlet 的 init() 方法,参数为 ServletConfig 对象,根据 servlet 的配置信息对其初始化。

    Method m = clazz.getDeclareMethod("init",ServletConfig.class);
    m.invoke(obj,config);

servlet 实例在 Tomcat 中是单实例的,所以 init() 方法仅仅执行一次。

请求处理 随即 servlet 容器根据 http 请求创建 request,response 对象。通过反射调用 service() 方法实现对该 http 请求的处理。

    Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
    m.invoke(obj,request,response);

销毁 在停止服务器或者重新部署 web 应用的时候调用 destroy 方法,销毁该 servlet 实例。

Servlet 的启动分为两种情况

  • 第一个请求到 servlet 的时候,系统创建该 servlet 的示例。
  • Web 应用启动的时候创建 servlet 示例,即 load-on-start Servlet。

ServletConfig 对象

主要用于加载 Servlet 的的初始化参数,在 Servlet 创建完成之后,调用其 init() 方法之前创建。一个 Servlet 对应一个 ServletConfig 对象。

ServletContext 对象

表示当前的 web 应用环境,一个 web 应用只有一个 ServletContext 对象。在加载 web 应用的时候创建。可以从 ServletConfig 对象的 getServletContext() 方法得到。