Servlet生命周期

Servlet生命周期

什么是 Servlet?

Servlet 是一个 Java 编写的程序,此程序是在服务器端运行的,是按照 Servlet 规范 编写的一个 Java 类。

Servlet 是做什么的?

Servlet 是处理客户端的请求并将其发送到客户端。

Servlet API

  1. Servlet 框架的组成
    Servlet 框架是由 2 个 Java 包组成:(1)javax.servlet 和(2)javax.servlet.http

    (1) javax.servlet 包中定义了所有 Servlet 类都必须实现的接口和类。

    javax.servlet 包的接口为:

    1. ServletConfig 接口 —- 在初始化过程中由 Servlet 容器使用
      ServletContext 接口 —- 定义 Servlet 用于获取容器信息的方法
      ServletRequest 接口 —- 向服务器请求信息
      ServletResponse 接口 —- 响应客户端请求
      Servlet 接口 —- 定义所有 Servlet 必须实现的方法

    2. javax.servlet 包中的类为:
      ServletInputStream 类 —- 用于从客户端读取二进制数据
      ServletOutputStream 类 —- 用于将二进制数据发送到客户端
      GenericServlet 类 —- 抽象类,定义一个通用的,独立于底层协议的 Servlet。

    (2) javax.servlet.http 包中定义了采用 HTTP 通信的 HttpServlet 类。

    1. javax.servlet.http 包的接口为:

      HttpServletRequest 接口 —- 提供 http 请求
      HttpServletResponse 接口 —- 提供 http 响应
      HttpSession 接口 —- 用于标识客户端并存储有关客户信息
      HttpSessionAttributeListener 接口 —-实现这个侦听接口用户获取会话的属性列表的改变的通知

    2. javax.servlet.http 包中的类:
      HttpServlet 类 —- 扩展了 GenericServlet 的抽象类,用于扩展创建Http Servlet
      Cookie 类 —- 创建一个 Cookie,用于存储 Servlet 发送给客户端的信息

  2. Servlet 框架的核心
    Servlet 框架的核心是:javax.servlet.Servlet 接口,所有的 Servlet 都必须实现这一接口。

Http Servlet

HttpServlet 是一个抽象类,用来创建用户自己的 HTTP ServletHttpServlet 类的子类必须至少重写一下方法中的一个:doGet()doPost()
HttpServlet 类提供 doGet()方法来处理 GET 请求

1
public void doGet(HttpServletRequest req,HttpServletResponse res)

提供 doPost()方法处理 POST 请求

1
public void doPost(HttpServletRequest req,HttpServletResponse res)

其中有 2 个参数:HttpServletRequsetHttpServlerResponse
这 2 个类实现了 ServlerRequset 接口和 ServletResponse 接口
ServletRequest 接口中封装了客户请求信息<客户请求方式,参数名,参数值等>
ServletResponse 接口 为 Servlet 提供了返回相应结果的方法。

Servlet 体系结构

Servlet–>GenericServlet–>HttpServlet–>用户自定义的 Servlet

Servlet 的生命周期

Servlet 的生命周期由 Servlet 容器控制,该容器创建 Servlet 的实例。
Servlet 生命周期就是指创建 Servlet 实例后响应客户请求直至销毁的全过程。

  1. Serlvet 生命周期的三个方法:init()–>service()–>destroy()

  2. 生命周期的各个阶段:

    实例化:Servlet 容器创建 Servlet 类的实例对象
    初始化:Servlet 容器调用 Servlet 的 init()方法
    服务:如果请求 Servlet,则容器调用 service()方法
    销毁:销毁实例之前调用 destroy()方法
    不可用:销毁实例并标记为垃圾处理

Servlet 的生命周期

Servlet 的生命周期由 Servlet 容器控制,该容器创建 Servlet 的实例。Servlet 的生命周期就是指 Servlet 实例在创建之后响应客户请求直到至销毁的全过程。Servlet 实例的创建取决于 Servlet 的首次调用。Servlet 接口定义了 Servlet 生命周期的 3 个方法。

  1. init()
    创建 Servlet 的实例后对其进行初始化。实现 ServletConfig 接口的对象作为参
    数进行传递。init 方法在浏览器请求 servlet 或 web server 启动时加载运行。

    1
    2
    3
    4
    5
    6
    public void init()throws servletexception{
    }
    public void init(servletconfig conf)throws servletexception{
    super.init(conf);//init 方法带 servletconfig 参数时必须有此句代码
    //此处写一些初始化操作。如连接数据库等。
    }
  2. service()
    响应客户端发出的请求。Service()方法接受 ServletRequest 接口和
    ServletResponse 接口的对象来处理请求和发送响应。经常的用法是:不用 service()方法,用dopost,doget方法来处理请求。其他的方法还有dotrace(),dooptions().dohead()方法,因 traceoptions.head 信息已经在 dopost,doget 方法中包括,不必使用,doput(),dodelete()方法在 web app 不经常使用Service()方法的语法为:

    1
    public void service(ServletRequest request, ServletResponse response) throws ServletException,IOException

    其中,request 是作为参数传递以存储客户端请求的 ServletRequest 接口的对象;
    ServletResponse 接口的对象,它包含 Servlet 作出的响应。

  3. destroy()
    如果不需要处理的请求,则释放 Servlet 实例。Destroy()方法的语法为:

1
2
3
4
5
public void destroy(){
}
public void destroy(){
super.dedtroy(conf);
}

注意:Servlet 关闭时才销毁。

Servlet 层次结构

在写 Servlet 程序时,一开始必须导入(import) javax.servlet.*javax.servlet.http.*

其中:
javax.servlet.*:存放与 Http 协议无关的一般性 servlet 类;
javax.servlet.http.*:除了继承 javax.servlet.*之外,并且还增加了与 HTTP 协议有关的功能。

所有 Servlet 都必需实现 javax.servlet.Servlet 接口(Interface),但是通常我们都会从
javax.sevler.GenericServletjavax.servlet.http.HttpServlet 择一来实现。
javax.servlet.* 里的 ServletRequestServletResponse 接口提供存取一般的请求和响应;
javax.servlet.http.* 里的 HttpServletRequestHttpServletResponse 接口,则提供HTTP 请求及响应的存取服务。

声明 servletMyServlet

1
public class MyServlet extends httpservlet{}

javax.servlet 包主要的接口和类:

  1. ServletInputStream 类:用于从客户端读取二进制据数。
    ServletInputStream 类是从 java.io.InputStream 类扩展而来的抽象类。它只实现
    一个 readLine()方法。
1
Public int readLine(byte b[],int offset,int length) throws IOException

b 是用于存储读取的数据的字节数组;
offset 指定开始读取字符串的位置;
length 指定要读取的最大字节数
返回实际读到的字节数。到达流的结尾时返回-1.

  1. ServletOutputStream 类:向客户端发送二进制数据。
    ServletOutputStream类是从java.io.OutputStream类扩展而来的抽象类。主要方法:
1
2
public void print(String s) throws IOException
public ovid println(String s) throws IOException

s 是要发送到客户端的字符串

  1. GenericServlet 类:抽象类,定义一个通用的、独立于底层协议的 Servlet。

  2. ServletRequest 接口:定义一个对象,封装客户向 Servlet 的请求信息。
    使用 ServletRequest 接口创建的对象,用于使客户端请求信息对 Servlet 可用。创建
    的对象作为参数传递至 ServletService()方法。

  3. ServletResponse 接口:定义一个对象辅助 Servlet 将请求的响应信息发送给客户端。

  4. ServletContext 接口:Servlet 上下文。定义 Servlet 使用的方法以获取其容器的信息。

  5. ServletConfig 接口:定义了在 Servlet 初始化的过程中由 Servlet 容器传递给 Servlet
    的配置信息对象。保存 Servlet 的配置信息。

  6. Servlet 接口:定义所有 Servlet 必须实现的方法。

javax.servlet.http 包主要的接口和类:

  1. HttpServletRequest 接口:扩展 ServletRequest 接口,为 Http Servlet 提供 Http 请求
    信息。

getrealpath,getinputstream,getcontenttype,getcontentlengh...

得到服务器的根目录

1
string path=request.getrealpath(".");

取得输入流

1
datainputstream din=new datainputstream(request.getinputstream());
  1. HttpServletResponse 接口:扩展 ServletResponse 接口,提供 Http 特定的发送响应的功能。常用的方法:
    sendredirect,getwriter,setcontenttype,getoutputstream.
    设置文件类型
1
2
private static final string content_type="text/html;charset=gb2312";
response.setcontenttype(content_type);

输出 html 文件头部信息:

1
2
printwriter out=response.getwriter();
out.close();
  1. HttpSession 接口:用于创建客户端与服务器端之间的会话。

    1
    Public HttpSession getSession()

    返回与请求关联的当前会话。如果请求没有与其关联的话,则 getSession()会创建一个新
    会话。

    1
    Public HttpSession getSession(boolean value)

    返回与请求关联的当前 session 的对象。
    boolean value 为 true 时等同于 Public HttpSession getSession()
    boolean value 为 false 时,则返回 null。

  2. HttpSessionAttributeListener 接口:实现这个侦听接口用于获取会话的属性列表的改变
    的通知。

  3. HttpServlet 类:扩展了 GenericServlet 的抽象类,用于扩展创建 Http Servlet。

  4. Cookie 类:创建一个 Cookie,用于存储 Servlet 发送给客户端的信息。

会话跟踪

会话跟踪允许服务器确定访问站点的用户、用户访问站点的次数和用停留站点的时间
段。会话跟踪技术包括隐藏表单域、URL 重写、Cookie、Session。

  1. 隐藏表单域:是实现会话跟踪最简单的方式。将字段添加到 HTML 表单中,但并不在
    客户端浏览器中显示。

  2. URL重写

    URL(Uniform Resource Locator,统一资源定位符)是Web上特定页面的地址。URL重写技术在URL结尾添加一些附加数据以标识该会话。

  3. Cookie

    Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取信息发送到服务器端

    Servlet API为使用Cookie而提供javax.servlet.http.Cookie。

    Cookie类常用的方法如下:

    (1) setMaxAge():设置Cookie的最大保存时间(以秒表示)

    1
    public void setMaxAge(int age)

    (2) getMaxAge():返回Cookie的最大保存时间

    1
    public int getMaxAge()
  4. Session

Servlet通信方法

Servlet运行一个称为ServletContext的环境,此环境描述了与Servlet关联的各种参数,一个Servlet只属于一个ServletContext

  1. Servlet与jsp页面通信

    下面是UserServlet1中的doGet()方法中的部分代码:

    1
    2
    3
    4
    String uid=request.getParameter("txtuserid");
    ServletContext context=this.getServletContext();
    context.setAttribute("userid", uid);
    RequestDispatcher dispatcher=request.getRequestDispatcher("../x.jsp");

    x.jsp部分代码:

    1
    2
    3
    4
    <%
    ServletContext context=this.getServletContext();
    String userid=context.getAttribute("userid").toString();
    %>

    用户ID:${userid}

  2. ServletServlet通信

    属于同一个应用程序的Servlet可以使用javax.servlet.RequestDispatcher接口的forwardinclude方法来共享数据。

    forward()方法将HTTP请求从一个Servlet发送到其它Servlet。该请求包含传递到目标ServletURL和请求参数。

    include方法可以接收Servlet以包括Servlet响应中的其他Servlet响应数据。接收客户端可以接收的对象,并将数据写入到response对象。

    (1)forward():用于将请求从一个Servlet转发到同一个服务器上的另一个Servlet。语法为:

    1
    public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException

    基中,request是客户端向Servlet发出的请求,responseServlet对客户端作出的响应。

    2include():用于包括另一个Servlet的内容。语法为:

    1
    public void include(ServletRequest request,ServletResponse response) throws IOException

    其中,request是包含客户端请求的对象,response是包含Servlet响应的对象。

    下面是UserServlet1中的doGet()方法中的部分代码:

    1
    2
    3
    4
    String uid=request.getParameter("txtuserid");
    ServletContext context=this.getServletContext();
    context.setAttribute("userid", uid);
    RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet/UserServlet2");

Servlet上下文

Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问。Servlet上下文API用于设置应用程序中所有Servlet共有的信息。

Javax.servlet.ServletContext接口中用于处理上下文属性的方法如下:

  1. getAttribute():返回Servlet上下文中对应属性名称的对象。若没有则返回null

    1
    public Object getAttribute(String name)

    其中,nameServlet的属性名称。

  2. setAttribute():将对象绑定到Servlet上下文中提供的属性名称。

    1
    public void setAttribute(String name,Object object);

    其中,name指定属性名称,object表示要绑定的对象。