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请求的所有头信息。