servlet规范 2.2 翻译
黄鹤 2008-07-26 12:49:35 引子:
看Spring Security的时候,看到其比较多地使用了Servlet Listener、filter之类的东西。Filter做过,listener却从来没有。
于是想从网上找一份servlet规范仔细看看,查来查去,没有合适的中文翻译版(v2.3有一份网友翻译的,不过看了一下,不大合我的口味)。于是,准备自己翻译一下,一来翻译的过程中看得会更仔细,二来,有感于接触过的技术人员基础知识大多很不扎实,翻译一下也许对大家有点帮助吧。
从sun网站合jsr网站上,目前好找到的是v2.2, v2.3, v2.4这三份。v2.5看起来还没有final。先从v2.2看起吧,一个个看下来,了解这几个版本的发展过程,应当也会有所收获。
规范文档容易找到,相应实现的源代码还没下到。了解从哪里下servlet API参考实现源代码请帮忙说一下。
翻译有不合适的地方,也请多提意见
http://blog.csdn.net/oldcrane/category/434848.aspx
前言
本文内容为Java Servlet规范v2.2。
可以从下面网址下载到响应的Java Servlet API的Javadoc文档(v2.2)及其参考实现:
http://java.sun.com/products/servlet/index.html
上面提供的参考实现提供了一个规范实现的参考标准。如果规范、API和参考实现三者存在不一致的情况,则Servlet规范2.2 > Java Servlet API Reference 2.2 > 参考实现。
0.1. 谁应当阅读本规范
本文档的目标读者为:
遵循规范提供Servlet引擎的Web服务器或应用服务器提供商
Web应用开发工具提供商
需要了解servlet运行机制,以编写复杂的servlet应用的开发人员
说明:
本规范不是关于servlet的用户手册。
0.2. API参考
Java Servlet API Reference v2.2 提供了组成Servlet API的所有接口、类、例外(Exception)、方法的说明。本文档中对各函数的参数签名做了简要说明。请参考API参考文档了解详细说明。
0.3. 其他的Java规范
在本规范中,将多处参考如下Java API规范:
Java2 Platform Enterprise Edition v1.2(J2EE)
JavaServer Pages v1.1(JSP)
JavaNaming and Direcotry Interface(JNDI)
上述规范可以从J2EE网站上找到:
http://java.sun.com/j2ee
0.4. 其他重要的参考资料
在Servlet API和Servlet应用的开发实现中,还参考和遵循了如下互联网规范:
RFC 1945 Hypertext Transfer Protocol (HTTP/1.0)
RFC 2045 MIME Part One: Format of Internet message Bodies
RFC 2046 MIME Part Two: Media Types
RFC 2047 MIME Part Three: Message Header Extensions for non-ASCII text
RFC 2048 MIME Part Four: Registration Procedures
RFC 2049 MIME Part Five: Conformance Criteria and Examples
RFC 2109 HTTP State Management Mechanism
RFC 2145 Use and Interpretation of HTTP Version Numbers
RFC 2324 Hypertext Coffee Pot Control Protocol (HTCPCP/1.0)
RFC 2616 Hypertext Transfer Protocol (HTTP/1.1)
RFC 2617 HTTP Authentication: Basic and Digest Authentication
上述RFC文档可以下面的网站上找到:
http://www.rfc-editor.org/
W3c协会(http://www.w3.org)是HTTP相关信息的权威发布机构
在本规范中,部署描述符使用了XML(Extensible Markup Language)。在如下网站可以找到关于XML的更多信息:
http://java.sum.com
http://www.xml.org
0.5. 提供反馈
Java社区的成功有赖于您的积极参与。我们欢迎您就本规范提出任何方面的反馈意见,请将您的意见email到:servletapi-feedback@eng.sun.com
由于会收到大量的反馈信息,我们的工程师无法对邮件一一进行回复。但我们将安排一个专门小组,对所有的反馈信息进行认真地阅读、评估和存档。
0.6. 鸣谢
感谢Anselm Baird-Smith, Elias Bayeh, Vince Bonfanti, Larry Cable, Robert Clark, Daniel Coward, Satish Dharmaraj, Jim Driscoll, Shel Finkelstein, Mark Hapner, Jason Hunter, Rod McChesney, Stefano Mazzocchi, Craig McClanahan, Adam Messinger, Ron Monzillo, Vivek Nagar, Kevin Osborn, Bob Pasker, Eduardo Pelegri-Lopart, Harish Prabandham, Bill Shannon, Jon S. Stevens, James Todd, Spike Washburn, and Alan Williamson为本规范的改进和发展作出了巨大贡献。感谢Connie Weiss, Jeff Jackson和Mala Chandra支持和推动servlet的发展提供了非凡的管理和帮助。
本规范是一项持续的、广泛的努力的成果,包含了来自Sun及其合作伙伴的大量贡献,尤其是如下这些公司和小组,对Servlet规范的发展作出了巨大的贡献:Apache Developer Community, Art Technology Group, BEA Weblogic, Clear Ink, IBM, Gefion Software, Live Software, Netscape Communications, New Atlanta Communications和Oracle。
规范的检查和修订过程同样是非常有价值的。我们的合作伙伴和公众提供了很多反馈意见来帮助我们定义和改进规范。再次,谨对所有提供反馈的人和机构致意诚挚的感谢。
1. 概述
1.1. 什么是Servlet
Servlet是受容器管理的web组件,它能动态地生成内容。Servlet是一段小程序,被编译成平台无关、架构中立的的字节码之后,可以被Web服务器器动态地加载和运行。Servlet通过容器实现的请求-相应(request-response)方式与Web浏览器进行交互,这种请求-相应模式是基于超文本传输协议(HTTP)的。
1.2. 什么是Servlet容器
Servlet容器和Web服务器或者应用服务器一起提供网络服务,能解析MIME编码的请求,能生成MIME编码格式的相应。容器还负责容纳servlet,并对其生命周期进行管理。
Servlet容器可以内置在Web服务器中,也可以通过web服务器的扩展API作为附加组件安装。Servlet容器同样可以作为具体Web服务功能的应用服务器的内置模块或者附加组件。
所有的Servlet容器必须支持HTTP协议,并可以支持其他基于请求-相应模式的协议,例如HTTPS。Servlet容器至少需要支持HTTP 1.0版本,并强烈建议同时支持HTTP 1.1版本。
Servlet容易可以对servlet的运行环境设置安全限制。在J2SE1.2或者J2EE 1.2环境下,这些限制条件应当使用Java2平台所提供的授权框架来实现。例如,high end application servers 会限制某些操作,例如创建Thread对象,来保证容器的其他组件不会收到负面影响。
1.3. 一个例子
客户端程序,如Web浏览器,使用HTTP请求来访问Web服务器。请求首先被Web服务器处理,并被转交给Servlet容器。Servlet根据内部配置决定调用哪一个servlet,并在调用时将代表request和response的对象传递给它。Servlet容器可以与Web服务器运行在同一个进程中,同一个主机的不同进程中,或者运行在不同的主机中。
Servlet通过request对象知道谁是远程对象,哪些HTML表单参数作为request的一部分被发送,以及其他相关的数据。Servlet可以执行程序设定的各种逻辑,生成发还给客户端的数据,并通过response对象将这些数据发还给客户端。
一旦servlet完成对request的处理,servlet容器需要保证response内容被正确刷新,并将控制返还给Web服务器。
1.4. Servlet和其他技术的比较
从功能性的角度,Servlet介于CGI程序和私有服务器扩展(例如Netscape服务器API-NSAPI,Apache模块)之间。
相对于其他的服务器扩展机制,Servlet具备如下优点:
由于使用了不同的进程模型,其速度远远超过CGI脚本
使用标准API,这些API得到大量Web服务器的支持
拥有Java编程预言的所有有点,包括易于开发,平台无关性
可以使用Java平台所提供的大量API
1.5. Servlet和J2EE的关系
Servlet API是Java 2 平台企业版 1.2版本所需要的API。J2EE规范描述了对servlet和servlet容易的附加要求。Servlet应当被部署到容器中,而容器和servlet则都运行在J2EE环境中。
1.6. 可分布的Servlet容器
在这个版本的规范中,增加了一个特性:将一个Web应用标记为可分布。这个标记允许servlet容器提供商将一个Web应用的servlet部署在多个Java虚拟机中,而这些虚拟机可以运行在同一台主机上,也可以运行在不同的主机上。一个被标记为可分布的应用必须遵循一些限制条件,使得支持分布式应用的容器能实现集群、失效转移等特性。
高性能的环境支持可扩展性、集群、失效转移(J2EE兼容)。所有需要在高性能的环境下运行的Web应用,应当设计实现成为可发布的Web应用,这使得应用可以最大程度地利用服务器所提供的特性。如果一个不可分布的应用部署在这样一个服务器上,则不能充分利用服务器提供的特性。
1.7. 自2.1版本之后的变动
自2.1版正式发布之后,对本规范的主要变动如下:
Web应用的概念的介绍
web application archive files的介绍
Response buffering(响应缓存)的介绍
可分布servlet的介绍
增加通过名称获取RequestDispatcher的功能
增加通过相对路径获取RequestDispatcher的功能
改进国际化
对于分布式servlet引擎语义的一些澄清
对API做了如下变动:
ServletConfig接口添加了getServletName方法,用于获取在系统中表示本servlet的名称
ServletContext接口添加getInitParameter,getInitParameterNames这两个方法,使初始化参数能在应用层面被设置,并被改应用的所有servlet所共享
ServletRequest接口添加getLocale方法,帮助决定客户端当前在哪个locale
ServletRequest接口添加isSecure方法,用于标识request是否通过安全的方式进行传输,例如使用HTTPS协议
修改了UnavailableException类的构造函数。因为现有的构造器方面参数签名容易被开发人员混淆。修改之后的构造器使用了更简单的参数签名。
HttpServletRequest接口添加getHeaders方法,用于获取在request中,所有用某个名称标识的头信息
HttpServletRequest添加isUserInRole、getUserPrinciple两个方法,使servlet可以使用基于抽象角色的认证
HttpServletResponse接口添加addHeader、addIntHeader、addDateHeader三个方法,允许使用同一个名字,创建多个头信息
HttpSession接口添加getAttribute、getAttributeNames、setAttribute、removeAttribute四个方法,以改进API的命名规范,相应地,getValue,、getValueNames,、setValue、removeValue这四个方法被废弃。
此外,还增加了大量概念的说明和澄清。