简介
在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种获取方式:
- Javax.servlet.http.HttpSession.getServletContext();
- Javax.servlet.jsp.PageContext.getServletContext(); PageContext是JSP的隐式对象,所以可以在JSP页面直接获取ServletContext对象。
- 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包中的成员。
以上。