现在的位置: 首页 > 综合 > 正文

servlet2.3规范之二——Servlet接口

2013年10月10日 ⁄ 综合 ⁄ 共 1984字 ⁄ 字号 评论关闭

2 Servlet接口

Servlet接口是servlet API的主要抽象。所有servlet或者直接实现该接口,或者更常见的继承一个实现该接口的类。servlet API中有两个类实现了servlet接口,为GenericServletHttpServlet。大多数情况下,开发人员将继承HttpServlet以实现他们的servlet

 

2.1 请求处理方法

Servlet接口定义了一个service方法来处理客户端请求。当servlet容器将每个请求传递给servlet实例时都会调用该方法。

 

Web应用处理并发请求通常要求web开发人员设计servletservice方法可以多线程执行。

 

通常web容器通过不同线程并发执行service方法,处理对于同一个servlet的并发请求

 

2.1.1 HTTP专有请求处理方法

HttpServlet抽象子类在Servlet接口基础上还添加了一些附加方法,由HttpServlet类的service方法自动调用,以处理基于HTTP的请求。这些方法是:

 

doGet处理HTTP GET请求

doPost处理HTTP POST请求

doPut处理HTTP PUT请求

doDelete处理HTTP DELETE请求

doHead处理HTTP HEAD请求

doOptions处理HTTP OPTIONS请求

doTrace处理HTTP TRACE请求

 

通常在开发基于HTTPservlet时,servlet开发人员自身只需要关心doGetdoPost方法。其他方法只为非常熟悉HTTP编程的程序员们使用。

 

2.1.2 附加方法

doPutdoDelete方法允许Servlet开发人员支持采用这些特性的HTTP/1.1客户端。HttpServlet doHead方法是一种特殊的doGet方法,只返回doGet方法生成的headerdoOptions方法返回servlet支持的所有HTTP方法。doTrace方法生成的响应,包含TRACE请求中发送的所有header实例。

 

对于只支持HTTP/1.0的容器,只支持doGetdoHeaddoPost方法,因为HTTP/1.0没有定义PUTDELETEOPTIONSTRACE方法。

 

2.1.3 有条件的GET支持

HttpServlet接口定义了getLastModified方法以支持有条件的GET操作。一个有条件的GET操作所请求的资源,只有在指定时间内被修改才被发送。在适当的情况下,该方法的实现可能会有效地利用网络资源。

 

2.2 实例数

正如第13章“部署描述符”所述,作为含servletweb应用部署描述符一部分的Servlet声明,控制着servlet容器如何提供servlet实例。

 

对于一个不驻留于分布式环境(默认)的servlet而言,servlet容器必须保证每个servlet声明只使用一个实例。不过,对于实现SingleThreadModel接口的servlet而言,servlet容器可以实例化多个实例以处理繁重的请求加载,但是一个特定实例只能一次处理请求。

 

如果作为应用一部分的servlet被部署为分布式,部署描述符中标明,那么容器只能让每个虚拟机(VM)每个servlet声明持有一个实例。不过,如果分布式应用中的servlet实现了SingleThreadModel接口,那么容器可以让容器中每个VM实例化多个servlet实例。

 

2.2.1 单线程模型注意点

使用SingleThreadModel接口保证一次只能有一个线程执行指定的servlet实例的service方法。要注意这项保证只适用于每个servlet实例,因为容器可以选择池化这些对象。这些对象一次可以被多个servlet实例访问,比如HttpSession实例,在任意时刻对于多个servlet都是可用的,即使它实现了SingleThreadModel

 

2.3 servlet生命周期

servlet通过定义生命周期来进行管理,包括如何加载,实例化与初始化,处理客户端的请求,以及如何撤销服务。生命周期在API中表示为javax.servlet.Servlet接口的initservicedestroy方法,所有servlet必须直接实现或者通过GenericServletHttpServlet抽象类间接实现。

 

2.3.1 加载和实例化

servlet容器负责加载和实例化servlet。加载和实例化可以在容器启动时进行,也可以延迟到容器认为需要servlet来处理请求时。

 

当容器引擎启动时,servlet容器必须能定位所需要的servlet类。Servlet容器使用通常的Java类加载工具加载servlet类。可以从本地文件系统,远程文件系统或者其他网络服务中加载。

抱歉!评论已关闭.