1

[TOC]

Servlet是什么

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

狭义的Servlet是指java实现的一个接口。

广义的Servlet是任何一个实现了这个接口的类。

我们看一下,Servlet这个接口,Servlet接口定义了所有Servlets必须实现的方法

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接口定义的5个方法

  • init:当一个请求进来时,Servlet容器会调用该方法初始化一个Servlet来处理请求
  • getServletConfig:返回Servlet初始化参数
  • service:Servlet初始化后,调用该方法处理具体请求
  • getServletInfo:返回作者,版本等信息
  • destroy:Servlet处理完请求后调用该方法销毁Servlet,清理该servlet持有的资源,比如内存,线程,确保任何持久状态都与内存中servlet的当前状态同步

Servlet容器启动时,根据配置生成Servlet实例并调用init方法初始化,当有请求进来时,调用对应的service方法处理请求。

Servlet容器关闭时,调用Servlet的destroy方法销毁Servlet。

实现Servlet

  1. 实现Servlet接口
public class MyServlet implements Servlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("MyServlet开始初始化");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest req,
                        ServletResponse res) throws ServletException, IOException {
        System.out.println("MyServlet开始处理请求");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("MyServlet开始销毁");
    }
}
  1. 配置web.xml
...

<servlet>
  <servlet-name>MyServlet</servlet-name>
  <servlet-class>com.servlet.MyServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>MyServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

...
  1. Tomcat作为容器,启动
......
MyServlet开始初始化
[2020-05-10 06:16:13,229] Artifact sample-servlet:war exploded: Artifact is deployed successfully
[2020-05-10 06:16:13,230] Artifact sample-servlet:war exploded: Deploy took 473 milliseconds

可以看到,Tomcat容器调用了init方法初始化了MyServlet

  1. 浏览器请求
......
MyServlet开始初始化
[2020-05-10 06:16:13,229] Artifact sample-servlet:war exploded: Artifact is deployed successfully
[2020-05-10 06:16:13,230] Artifact sample-servlet:war exploded: Deploy took 473 milliseconds
MyServlet开始处理请求

可以看到,Tomcat容器调用了service方法初始化了MyServlet

  1. 关闭Tomcat
MyServlet开始初始化
[2020-05-10 06:16:13,229] Artifact sample-servlet:war exploded: Artifact is deployed successfully
[2020-05-10 06:16:13,230] Artifact sample-servlet:war exploded: Deploy took 473 milliseconds
MyServlet开始处理请求
MyServlet开始销毁
Disconnected from server

可以看到,Tomcat容器调用了destroy方法销毁了MyServlet


Scott
6 声望0 粉丝

码路新手,请多关照