`
isiqi
  • 浏览: 16033038 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

2 Servlet接口

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

2.1 请求处理方法

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

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

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

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.1.1</span></strong></chsdate> 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编程的程序员们使用。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.1.2</span></strong></chsdate> 附加方法

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

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

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.1.3</span></strong></chsdate> 有条件的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实例。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.2.1</span></strong></chsdate> 单线程模型注意点

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

2.3 servlet生命周期

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

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.1</span></strong></chsdate> 加载和实例化

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

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

加载Servlet类后,容器将它实例化。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.2</span></strong></chsdate> 初始化

servlet对象实例化之后,容器必须在它能处理客户端请求之前将其初始化。初始化是为了servlet能够读取持久性的配置数据,初始化代价高的资源(比如基于JDBC连接),以及执行其他一次动作。容器通过调用Servlet接口的init方法,并使用实现ServletConfig接口的单个(每个servlet声明)对象来初始化servlet实例。配置对象允许servlet访问来自web应用配置信息的名-值初始化参数,还允许servlet访问一个实现ServletContext接口的对象,它描述servlet运行时环境。关于ServletContext接口的更多信息参见第3章“Servlet上下文”。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><em><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.2</span></em></strong></chsdate>.1 初始化的错误情形

在初始化过程中,servlet实例可能抛出UnavailableException或者ServletException异常。在这种情况下,servlet不可以被放入激活的服务中,而必须由servlet容器释放。因为它被看成是不成功的初始化,因此不会调用destroy方法。

在初始化失败之后,容器可以重新实例化并初始化一个实例。例外的是,当UnavailableException异常指出了不可用的最小时间,容器必须在创建并初始化一个新的servlet实例之前等待这段时间。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><em><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.2</span></em></strong></chsdate>.2 工具考虑

当工具加载并内省web应用而触发静态初始方法和调用nit方法有明显不同。开发人员不应当假定servlet处于激活的容器运行时中,除非调用了Servlet接口的init方法。比如,当只有静态(类)初始化方法被调用时,servlet不要试图建立与数据库或者EJB容器的连接。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.3</span></strong></chsdate> 请求处理

servlet正确初始化之后,servlet容器就可以使用它来处理客户端请求。请求表示为ServletRequest类型的request对象。Servlet通过调用提供的ServletResponse类型对象的方法来填充该请求的响应。这些对象作为参数传递给Servlet接口的service方法。

HTTP请求中,容器提供的对象类型为HttpServletRequestHttpServletResponse

注意由servlet容器放入服务的servlet实例可能在生命周期中并不处理请求。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><em><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.3</span></em></strong></chsdate>.1 多线程问题

servlet容器可以向servletservice方法发送并发请求。要处理这些请求,servlet的开发人员必须采取措施,使得在service方法中可以多线程同时处理。

开发人员可以采用的一个替代方案是实现SingleThreadModel接口,它要求容器保证service方法中一次只有一个请求线程。Servlet容器可能通过串行化servlet的请求,或者维持一个servlet实例池来满足这项需求。如果servlet所属的web应用被标记为分布式的,容器可以在应用分布的每个VM中维持一个servlet实例池。

对于没有实现SingleThreadModel接口的servlet,如果service方法(或者HttpServlet抽象类的service方法分发的doGetdoPost方法)使用了synchronized关键字,那么servlet容器不能使用实例池方案,而是必须依次处理请求。强烈推荐开发人员不要在这些情况下同步service方法(或者它所分发的方法),因为对性能有影响。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><em><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.3</span></em></strong></chsdate>.2 请求处理中的异常

Servlet可能在处理请求中抛出ServletExceptionUnavailableException异常。ServletException异常表示在请求处理中有错误出现,容器应当采取相应的错误来清除该请求。

UnavailableException异常表示servlet暂时或者永久不能处理请求。

如果是UnavailableException异常所表示的永久不可用,servlet容器必须从服务中删除servlet,调用它的destroy方法,并释放servlet实例。

如果是UnavailableException异常所表示的暂时不可用,那么容器可以选择在暂时不可用期间不发送任何请求到servlet。在此期间容器拒绝的任何请求必须返回SERVICE_UNAVAILABLE (503)响应状态,同时在Retry-After header中指明不可用何时结束。

容器可以选择忽略永久和暂时不可用之间的区别,将所有UnavailableException异常当成永久不可用,从而从服务中将抛出任何UnavailableException异常的servlet删除。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><em><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.3</span></em></strong></chsdate>.3 线程安全

requestresponse对象的实现并不保证线程安全。这意味着它们应当只在处理线程的请求作用域内使用。

requestresponse对象不可以被其他线程中执行的对象所引用,因为这将引起不能预期的后果。

<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">2.3.4</span></strong></chsdate> 服务终止

Servlet容器并不要求任意时间段保持servlet加载。servlet容器中的servlet实例可能只保持激活状态几毫秒,或者是servlet容器的生命周期(这可能是几天,几月或者几年),或者是两者之间的任何时间段。

servlet容器决定要从服务中删除一个servlet时,调用Servlet接口的destroy方法,来让servlet释放它正使用的所有资源,并保存所有持久化的状态。比如,容器想保存内存资源,或者自身被关闭时可以这样做。

servlet容器调用destroy方法之前,它必须允许当前运行在servletservice方法内的所有线程完成执行动作,或者延长服务器定义的时限。

一旦servlet实例调用destroy方法,容器不可以发送其他请求到该servlet实例。如果容器需要再次启用servlet,它必须重新创建一个servlet类的实例。

完成destroy方法后,servlet容器必须释放servlet实例,以便垃圾回收。

分享到:
评论

相关推荐

    云应用开发 ——Google App Engine & Google Web Toolkit入门指南

    6.2.2 实例——Servlet版本HelloWorld 第7章 数据操作 7.1 概述 7.2 定义数据类 7.3 创建,获取和删除数据 7.4 查询和索引 7.5 事务 7.6 关系 7.7 实例——员工管理系统 第8章 国际化 8.1 普通文本国际化 8.2 ...

    Google Android SDK开发范例大全(完整版)

    2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签——TextView标签的使用 3.2 更改手机窗口画面底色——drawable定义颜色...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    第13章 简化企业开发瑰宝之二 第14章 程序员的伴侣 第2篇 范例演练篇 第15章 学以致用 第16章 幕后英雄的用武之地 第17章 Web开发的制胜法宝 第18章 数据分析大师 第19章 体验完美视觉盛宴 第3篇 项目实战篇 第20...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    JSP高级编程          

    3.2 实体EJB 的开发技术之二——BMP EJB 3.3 EJB 开发实例封装数据源 3.4 本章小结 第4 章 JSP 与J2EE 分布式处理技术 4.1 J2EE 和分布式处理技术 4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章...

    Servlet+JSP+SQL Server实现学生网上选课系统(源代码+论文+答辩PPT)

    第二章 系统需求分析 - 6 - 2.1 需求分析 - 6 - 2.2可行性分析 - 7 - 2.3系统配置需求 - 7 - 第三章 系统总体设计 - 8 - 3.1 项目规划 - 8 - 3.2 设计目标 - 8 - 3.3 系统相关技术介绍 - 8 - 3.3.1系统开发采用的...

    JSP高级编程(全)

    3.2 实体EJB 的开发技术之二——BMP EJB 3.3 EJB 开发实例封装数据源 3.4 本章小结 第4 章 JSP 与J2EE 分布式处理技术 4.1 J2EE 和分布式处理技术 4.2 远程方法调用RMI 技术 4.3 CORBA 技术 4.4 JNDI 技术 4.5 本章...

    JAVA WEB典型模块与项目实战大全

    2.3 hibernate框架的实现  2.4 jpa框架的实现  2.5 spring框架的实现  2.6 jsf框架的实现  2.7 ajax框架的实现  2.8 使用jdbc连接数据库  2.9 小结  第3章 实现各种框架的集成  3.1 spring框架与...

    JSP教程及案例——pdf

    1.6 JSP 与 Java Servlet 的关系 ........................23 第 2 章 JSP 语法.................................................................................25 2.1 JSP 页面的基本结构.....................

    Spring_MVC_051:Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC 学习总结(五)——校验与文件上传 目录 2.2.7、范围 2.2.8、其它注解 2.3、注解控制器参数 1.4、在UI中添加错误标签 1.5、测试运行 三、使用jQuery扩展插件Validate实现前端校验 3.1、jQuery扩展插件...

    深入体验Java Web开发内幕

    4.1 Servlet的有关概念与前置知识  4.2 Servlet开发入门  4.3 Servlet的特点及运行过程  4.4 ServletConfig接口  4.5 GenericServlet与HttpServlet类  4.6 ServletContext接口  4.7 思考与...

    毕业论文 个人博客毕业论文

    1.5.1 JSP的基础——Servlet 技术 6 1.5.2 JavaBean原理和机制 7 1.5.3 开发平台:Eclipse+dreamweaver 8 1.5.4 1.5.4 数据库:SQL SERVER 2000 9 第二章 需求分析 11 2.1 系统目标 11 2.2 系统的功能要求 11 2.2.1 ...

    JSP实践之旅.exe

    Tomcat.JSP JSWDK环境安装与配置 Resin服务器平台介绍 Resin在IIS中的安装配置 JRun2.3平台介绍 Unify eWave ServletExec WebSphere应用服务器 在Windows2000上安装Apache+ApacheJserv+gnujsp...

    Java Web程序设计教程

    2.3eclipse的下载与安装 24 2.3.1eclipse的下载与安装 24 2.3.2熟悉eclipse开发环境 24 2.4项目实战——第一个javaee应用:helloworld 28 2.4.1开始创建第一个javaee应用 28 2.4.2熟悉helloworld框架结构 29 ...

    Java数据库编程宝典2

    2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 ...

    Java数据库编程宝典4

    2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 ...

    Java数据库编程宝典1

    2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 ...

    Java数据库编程宝典3

    2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 3.1 SQL语言 3.2 SQL数据类型 3.3 数据定义语言 3.3.1 ...

    Java语言程序设计

    2.2.1 类的声明 2.2.2 对象的声明与引用 2.2.3 数据成员 2.2.4 方法成员 2.2.5 类的组织——包的概念 2.2.6 类的访问控制 2.2.7 类成员的访问控制 2.3 对象初始化和回收 2.3.1 构造方法 2.3.2 内存回收技术...

    开涛高可用高并发-亿级流量核心技术

    2.3 失败重试 23 2.4 健康检查 24 2.4.1 TCP心跳检查 24 2.4.2 HTTP心跳检查 25 2.5 其他配置 25 2.5.1 域名上游服务器 25 2.5.2 备份上游服务器 26 2.5.3 不可用上游服务器 26 2.6 长连接 26 2.7 HTTP反向代理示例 ...

Global site tag (gtag.js) - Google Analytics