servlet是使用java servlet应用程序设计接口及相关类和方法的java程序。它在web服务器上或应用服务器上运行并扩展了该服务器的能力。java servlet对于web服务器就好像java applet对于web浏览器。applet装入web浏览器并在web浏览器内执行,而servlet则是装入web服务器并在web服务器内执行。java servlet api 定义了servlet和服务器之间的一个标准接口,这使得servlet具有跨服务器平台的特性。
servlet通过创建一个框架扩展服务器的能力,采用请求-响应模式提供web服务。当客户机发送请求至服务器时,服务器将请求信息发送给servlet,servlet生成响应内容并将其传给server,然后再由server将响应返回给客户端。
servlet的功能
servlet的功能涉及范围很广。例如,servlet可完成如下功能:
创建并返回一个包含基于客户请求性质的动态内容的完整的 html页面。
创建可嵌入到现有 html 页面中的一部分 html 页面(html 片段)。与其他服务器资源(文件、数据库、applet、java应用程序等)进行通信。
用多个客户机处理连接,接受多个客户机的输入,并将结果广播到多个客户机上。例如,servlet 可以是多参与者的游戏服务器。
允许在单连接方式下传送数据的情况下,在浏览器上打开服务器至applet的新连接,并将该连接保持在打开状态。允许客户机和服务器简单、高效地执行会话的情况下,applet也可以启动客户浏览器和服务器之间的连接。可以通过定制协议或标准(如 iiop)进行通信。
对特殊的处理采用 mime 类型过滤数据,例如图像转换和服务器端(包括ssi)。
将定制的处理提供给所有服务器的标准例行程序。例如,servlet 可以修改如何认证用户。
java servlet与现有网络技术的差别
那么java servlet与一些现有的网络技术有什么具体的差别呢?
java servlet与applet之间的差别 从基本上来说,servlet与 applet 是截然相反的。servlet可以被视为服务器方面的 applet。servlet在网络服务器内运行而applet在网络浏览器内运行。浏览器提交一个请求执行servlet的命令;而由于浏览器可直接命令applet,所以它可以在运行时单机运行。
java servlet与cgi之间的差别 与传统的cgi和许多其他类似cgi的技术相比,java servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。其中最大的区别是在性能方面。
在传统的cgi中,每个请求都要启动一个新的进程,如果cgi程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而使用servlet时,服务器上仅有一个java虚拟机在运行,只有当servlet被调用时,它才被加载,且直到servlet更改时,它才会被再次加载。在传统cgi中,如果有n个并发的对同一cgi程序的请求,则该cgi程序的代码在内存中重复装载了n次;而对于servlet,处理请求的是n个线程,只需要一份servlet类代码。在性能优化方面,servlet也比cgi有着更多的选择,比如缓冲以前的计算结果,保持数据库连接的活动,等等。
通过使用servlet api,开发人员不必担心服务器的内部运作方式。表格资料、服务器头、cookies等皆可通过servlet处理。另外,因为servlet是用java写的,能将其从一个服务器移到另一个服务器以供发布,同时不必担心操作系统或服务器的类型。这一优点充分体现了java"一次编写,随处运行"的优越特性。
servlet的生命周期
servlet的生命周期定义了一个servlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。
在代码中,servlet生命周期由接口javax.servlet.servlet定义。所有的java servlet 必须直接或间接地实现javax.servlet.servlet接口,这样才能在servlet engine上运行。servlet engine提供network service,响应mime request,运行servlet container。 javax.servlet.servlet接口定义了一些方法,在servlet 的生命周期中,这些方法会在特定时间按照一定的顺序被调用。如图14-1所示。

图14-1 servlet的生命周期
servlet 如何被加载(load)、被实例化(instantiated)
servlet engine 负责实例化和加载servlet,这个过程可以在servlet engine 加载时执行,可以在servlet 响应请求时执行,也可以在两者之间的任何时候执行。
servlet如何被初始化(initialized)
servlet engine 加载好servlet 后,必须要初始化它。初始化时servlet 可以从数据库里读取初始数据,建立jdbc connection,或者建立对其他有价值的资源的引用。
在初始化阶段,init( )方法被调用。这个方法在javax.servlet.serlet接口中定义。init( )方法以一个servlet 配置文件(servletconfig 型)为参数。servlet configuration 对象由servlet engine 实现,可以让servlet 从中读取一些name-value对的参数值。servletconfig对象还可以让servlet接受一个servlet context对象。
servlet 如何处理请求
servlet 被初始化以后,就处于能响应请求的就绪状态。每个对servlet 的请求由一个servlet request 对象代表。servlet 给客户端的响应由一个servlet response对象代表。当客户端有一个请求时,servlet engine 将servletrequest 和servletresponse对象都转发给servlet,这两个对象以参数的形式传给service方法。这个方法由javax.servlet.servlet定义并由具体的servlet 实现。
servlet还可以实现 servletrequest 和servletresponse接口。servletrequest接口可以让servlet 获取客户端请求中的参数,如form data、request信息、协议类型,等等。servlet 可以从servletinputstream流中读取request 数据。servletresponse接口允许servlet设置response headers和status codes。实现这个接口可以使servlet能访问servletoutputstream流用来向客户端返回数据。
servlet如何被释放
servlet engine 没有必要在servlet 生命周期的每一段时间内都保持servlet的状态。servlet engine可以随时随意使用或释放servlet。因此,你不能依赖servlet class或其成员存储信息。当servlet engine判断一个servlet应当被释放时(比如说engine准备shut down 或需要回收资源),engine必须让servlet 能释放其正在使用的任何资源,并保存持续性的状态信息。这些可以通过调用servlet的destroy方法实现。 在servlet engine 释放一个servlet 以前,必须让其完成当前实例的service方法或是等到timeout(如果engine定义了timeout)。当engine释放一个servlet以后,engine将不能再将请求转发给它,engine必须彻底释放该servlet并将其标明为可回收的(给garbage collection)。
在servlet api中最重要的是servlet interface。所有的servlets执行这个interface的方式有很多种:或者是直接的,或者通过extending这个class执行它,如 httpservlet。这个servlet interface 提供并安排servlet与客户端联系的方法。servlet 编写者可以在他们开发servlet程序时提供更多一些或所有这样的方法。
当一个servlet接收来自客户端的调用请求时,它接收两个对象:一个是servletrequest,另外一个是servletresponse。这个servletrequest class 概括从客户端到服务器之间的联系,而 servletresponse class 概括从servlet返回客户端的联系。
servletrequest interface 可以获取到这样一些信息,如由客户端传送的参数名称,客户端正在使用的协议,产生请求并且接收请求的服务器远端主机名。它也提供获取数据流的servlet、servletinputstream,这些数据是客户端引用中使用http post和put方法递交的。一个servletrequest的子类可以让servlet获取更多的协议特性数据。
例如,httpservletrequest 包含获取http-specific头部信息的方法。servletresponse interface 给出相应客户端的servlet方法。它允许servlet设置内容长度和回应的mime类型,并且提供输出流servletoutputstream,通过编写者可以发回相应数据。servletresponse子类可以给出更多protocol-specific容量的信息。例如,httpservletresponse 包含允许servlet操作http-specific头部信息的方法。
上面有关classes 和 interfaces的描述构成了一个基本的servlet框架。http servlets有一些附加的可以提供session-tracking capabilities的方法。servlet编写者可以用这些api在有他人操作时维护servlet与客户端之间的状态。
闽公网安备 35060202000074号