轻量级Java EE企业应用开发实战
上QQ阅读APP看书,第一时间看更新

3.1 Servlet概述

Servlet是Server Applet的简称,称为服务器端小程序或服务连接器,主要功能在于交互式地浏览和修改数据,生成动态Web内容。目前,新Servlet规范版本为Servlet 4.0(JSR 369)。

3.1.1 Servlet架构

Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。

使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

图3-1展示了Servlet架构。

图3-1 Servlet架构

Servlet主要执行以下任务:

  • 读取客户端(浏览器)发送的显式数据,包括网页上的HTML表单或自定义的HTTP客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式HTTP请求数据,包括Cookies、媒体类型和浏览器能理解的压缩格式等。
  • 处理数据并生成结果。这个过程可能需要访问数据库、执行RMI等远程过程调用、调用Web服务或者直接计算得出对应的响应。
  • 发送显式数据(文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML、XML或JSON文件)、二进制文件(GIF图像)、Excel等。
  • 发送隐式HTTP响应到客户端(浏览器),包括告诉浏览器或其他客户端被返回的文档类型(例如HTML)、设置Cookies和缓存参数以及其他类似的任务。

3.1.2 Servlet生命周期

Servlet生命周期可被定义为从创建Servlet直到其销毁的整个过程。以下是Servlet遵循的过程:

  • Servlet通过调用init方法进行初始化。
  • Servlet调用service方法来处理客户端的请求。
  • Servlet通过调用destroy方法终止。
  • 最后,Servlet是由JVM的垃圾回收器进行垃圾回收的。

现在让我们详细讨论生命周期的方法。

1.init方法

init方法被设计成只调用一次。它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。因此,它用于一次性初始化。

Servlet创建于用户第一次调用对应于该Servlet的URL时,但是也可以指定Servlet在服务器第一次启动时被加载。

用户调用一个Servlet就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交给doGet或doPost方法。init方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

init方法的定义如下:

2.service方法

service方法是执行实际任务的主要方法。Servlet容器调用service方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet、doPost、doPut、doDelete等方法。

下面是该方法的特征:

service方法由容器调用,会在适当的时候调用doGet、doPost、doPut、doDelete等方法。所以,不用对service方法做任何动作,只需要根据来自客户端的请求类型来重写doGet、doPost方法即可。

doGet和doPost方法是每次服务请求中常用的方法。下面介绍这两种方法的特征。

3.doGet方法

当Servlet容器接收到GET请求时,会将该请求交由doGet方法处理。处理逻辑写在重写的doGet方法中,代码如下:

4.doPost()方法

当Servlet容器接收到POST请求时,会将该请求交由doPost方法处理。处理逻辑写在重写的doPost方法中,代码如下:

5.destroy方法

当Servlet容器确定Servlet应该从服务中移除时,将调用Servlet接口的destroy方法以允许Servlet释放它使用的任何资源和保存任何持久化的状态。例如,当想要节省内存资源或它被关闭时,容器可以执行destroy方法。

Servlet容器调用destroy方法之前,它必须让当前正在执行service方法的任何线程完成执行,或者超过了服务器定义的时间限制。

一旦调用了Servlet实例的destroy方法,容器就无法再路由其他请求到该Servlet实例。如果容器需要再次使用该Servlet,就必须用该Servlet类的一个新实例。在destroy方法完成后,Servlet容器必须释放Servlet实例以便被垃圾回收。

destroy方法定义如下:

3.1.3 常用方法

基本的Servlet接口定义了service方法来用于处理客户端的请求。当有请求到达时,该方法由Servlet容器路由到一个Servlet实例来调用。

Web应用的并发请求处理通常需要Web开发人员设计适合多线程执行的Servlet,从而保证service方法能在一个特定时间点处理多线程并发执行。通常Web容器对于并发请求将使用同一个Servlet处理,并且在不同的线程中并发执行service方法。

HttpServlet抽象子类在基本的Servlet上添加了协议相关的方法,并且这些方法能根据HTTP请求类型自动由HttpServlet中实现的service方法转发到相应的协议相关的处理方法上。这些方法是:

  • doGet处理HTTP GET请求。
  • doPost处理HTTP POST请求。
  • doPut处理HTTP PUT请求。
  • doDelete处理HTTP DELETE请求。
  • doHead处理HTTP HEAD请求。
  • doOptions处理HTTP OPTIONS请求。
  • doTrace处理HTTP TRACE请求。

一般情况下,开发基于HTTP的Servlet时,Servlet开发人员只需实现doGet和doPost请求处理方法即可。如果开发人员想使用其他处理方法,那么其使用方式跟之前的类似,即HTTP编程都是类似的。

doPut和doDelete方法允许Servlet开发人员让支持HTTP/1.1的客户端使用这些功能。HttpServlet中的doHead方法可以认为是doGet方法的一种特殊形式,它仅返回由doGet方法产生的header信息。doOptions方法返回当前Servlet支持的HTTP方法。doTrace方法返回的响应包含TRACE请求的所有头信息。