JavaEE Servlet核心接口解析

简介

在Java中,每一个Servlet程序都必须直接或间接实现javax.servlet.Servlet这个接口。当编写一个Servlet类时,直接实现它,当扩展一个实现这个接口的类时(如GenericServlet),则间接实现它。它独立于协议,控制着每个Servlet的生命周期。

Servlet接口是Servlet与Servlet容器(如Tomcat)之间的一个约定。这个约定总结起来就是说:Servlet容器会把Servlet类加载到内存中,并在Servlet实例中调用特定的方法。而且在一个应用中,每个Servlet类型只能有一个实例


核心属性

ServletConfig

封装Servlet的配置信息。Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象,包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。ServletContext对象有以下方法:

  • public String getServletName(); 返回servlet的名字,即web.xml中的servlet-name的子元素的值。如果没有配置这个子元素,则返回servlet类的名字。
  • public ServletContext getServletContext();
    返回一个servletContext()对象.
  • public String getInitParameter(String name);
    根据给定的初始化参数,返回匹配的初始化参数值。
  • public Enumeration<String> getInitParameterNames();
    返回一个Enumeration对象,里面包含了所有的初始化参数。

ServletContext

ServletContext是Servlet和Servlet容器之间直接通信的接口。Servlet容器在启动一个Web应用时,会为这个应用创建一个ServletContext对象。每一个Web应用有且只有一个ServletContext对象。同一个Web应用中的各个Servlet对象共享一个ServletContext对象。Servlet对象可以通过ServletContext来共享各种资源。

Web应用范围具有2层含义:

  • 表示由Web应用的生命周期构成的时间段;
  • 表示在Web应用生命周期内所有Web组件的集合;

ServletContext对象的3种获取方式:

  1. Javax.servlet.http.HttpSession.getServletContext();
  2. Javax.servlet.jsp.PageContext.getServletContext(); PageContext是JSP的隐式对象,所以可以在JSP页面直接获取ServletContext对象。
  3. Javax.servlet.ServletConfig.getServletContext();
    这就是ServletConfig和ServletContext关联的地方。

ServletRequest

封装当前的请求的配置和数据,以便Servlet开发者不必解析和操作原始的请求数据。

ServletResponse

当前请求的响应,它的作用是使得将响应传回用户更容易。


核心方法

init()、service()、destroy()是Servlet生命周期方法。Servlet容器将会按照以下原则调用这3个方法。

init()

public void init(ServletConfig config) throws ServletException
如果Servlet的配置参数load-on-startup=1,那么Servlet容器启动时就会调用这个方法。如果load-on-startup=0,那么第一次请求Servlet时,Servlet容器才会调用这个方法。在后续的请求中,将不会再调用这个方法

可以利用这个方法来编写一些应用程序初始化相关的代码。在调用这个方法时,Servlet容器会传递一个ServletConfig参数。一般来说,会将ServletConfig参数赋值给一个类级变量,以便Servlet类中其他方法也可以使用这个对象。

service()

public void service(ServletRequest req, ServletResponse res)throws ServletException, IOException
每次请求Servlet时,容器都会调用这个方法。必须在这里编写要Servlet完成的响应的代码。第一次请求Servlet时,容器会调用init方法和service方法;对于后续的请求,容器只调用service方法

destroy()

public void destroy();
要销毁Servlet时,容器就会调用这个方法。它通常发生在卸载应用程序,或者关闭Servlet容器的时候。一般来说,可以在这个方法中编写一些资源清理相关的代码。

getServletConfig()

public ServletConfig getServletConfig();
返回由Servlet容器传给init方法的ServletConfig。但是为了让getServletConfig()返回非null值,你肯定已经为传给init方法的ServletConfig赋给了一个类级变量

getServletInfo()

public String getServletInfo();
返回Servlet的描述。可以返回可能有用的任意字符串,甚至可能是null。


最后

必须要注意的一点是线程安全性。因为一个Web应用中所有的用户将公用一个Servlet实例,所以不建议使用类级变量,以免引起资源争夺导致混乱。除非它们是只读的,比如JUC. atomic包中的成员。

以上。