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具备如下优点:
l 由于使用了不同的进程模型,其速度远远超过CGI脚本
l 使用标准API,这些API得到大量Web服务器的支持
l 拥有Java编程预言的所有有点,包括易于开发,平台无关性
l 可以使用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版正式发布之后,对本规范的主要变动如下:
l Web应用的概念的介绍
l web application archive files的介绍
l Response buffering(响应缓存)的介绍
l 可分布servlet的介绍
l 增加通过名称获取RequestDispatcher的功能
l 增加通过相对路径获取RequestDispatcher的功能
l 改进国际化
l 对于分布式servlet引擎语义的一些澄清
对API做了如下变动:
l ServletConfig接口添加了getServletName方法,用于获取在系统中表示本servlet的名称
l ServletContext接口添加getInitParameter,getInitParameterNames这两个方法,使初始化参数能在应用层面被设置,并被改应用的所有servlet所共享
l ServletRequest接口添加getLocale方法,帮助决定客户端当前在哪个locale
l ServletRequest接口添加isSecure方法,用于标识request是否通过安全的方式进行传输,例如使用HTTPS协议
l 修改了UnavailableException类的构造函数。因为现有的构造器方面参数签名容易被开发人员混淆。修改之后的构造器使用了更简单的参数签名。
l HttpServletRequest接口添加getHeaders方法,用于获取在request中,所有用某个名称标识的头信息
l HttpServletRequest添加isUserInRole、getUserPrinciple两个方法,使servlet可以使用基于抽象角色的认证
l HttpServletResponse接口添加addHeader、addIntHeader、addDateHeader三个方法,允许使用同一个名字,创建多个头信息
l HttpSession接口添加getAttribute、getAttributeNames、setAttribute、removeAttribute四个方法,以改进API的命名规范,相应地,getValue,、getValueNames,、setValue、removeValue这四个方法被废弃。
此外,还增加了大量概念的说明和澄清。