Servlet API
已经被大多数基于
Java
的
Web
服务器支持,这意味着当使用
ServletAPI
时,可以继承
Java
的许多优点:不但代码不存在内存漏洞和难以发现的指针
Bug,
而且还可以运行在许多不同的服务器提供的平台上。
1.Javax.Servlet
的主要功能
servlet
采用常见的接受请求和生成响应的编程模型,该模型使用了一系列的分布式系统编程工具箱,这包括从远程过程调用到向
Web
服务器发出
HTTP
请求等。
Servlet
编程其实非常简单,主要就是实现一个
Servlet
接口,例如:
import javax.servlet.*;
public class MyServlet extends GenericServlet{
public void service(
ServletRequest request;
ServletRespose response;
) throws ServletException,IOEXception
{
......
}
}
service
方法内可以操作
request
和
response
参数,这里封装了客户机发送的数据,提供了对参数的访问,并允许
Servlet
报告各种状态(包括错误信息),通常,
Servlet
通过输入流得到大多数参数,并使用输出流发送它们的响应。
ServletInputStream in=request.getInputStream();
ServletOutputStream out=response.getOutputStream();
这些输入
/
输出流可以使用多种不同格式的数据,例如:
Applet
和
Servlet
可以使用对象序列化(
object serialization)
交换数据,或者
HTML
、图象格式等。
2.Servlet
及其环境
由于
Servlet
是一种
Java
对象,它们由特定的实例数据组成,这意味着正在执行的
Servlet
是运行在服务器内部的独立的应用程序。
在初始化期间,
Servlet
访问一些特定的
Servlet
配置数据,这允许相同
Servlet
类的不同实例可以用不同的数据来初始化,并当作不同名字的
Servlet
来管理。在初始化期间提供的数据中,包括了每个实例在哪里保存它们自己的状态。
Servlet
还可以利用
ServletContext
对象与它们自己的环境进行交互。
3.
使用模式
Servlet
可以使用下面几种模式,然而,不同是所有的服务器环境支持所有这些模式:
(
1
)基本的模式是以请求
/
响应协议为核心。
(
2
)服务器可以用过滤链
(filter chains)
链接多个
Servlet.
(
3
)
Servlet
可以支持特定的协议,例如
HTTP.
(
4
)在基于
HTTP
的应用程序中,
Servlet
是一个基于
CGI
扩展的完全的(且更高效)替代品。
(
5
)在基于
HTTP
的应用程序中,
Servlet
还可以作为
HTML
的服务器端来包含动态地生成的
Web
文档。
4.
主要的
Servlet
方法
Servlet
总是动态地被装载,尽管在服务器启动时,服务器通常提供一个管理选项来强制装载和初始化特定的
Servlet
。
Servlet
使用普通
Java
类装载工具装载,这意味着它们可以从远程目录装载(例如,信任的
http://user/Servlet
目录),与使用本地文件系统一样容易,这种方式提高了系统结构的灵活性,网络中服务的发布变得更加容易和快捷。
Servlet
被装载之后,其生命周期涉及三个主要方法:
(
1
)
Servlet
通过调用
init
方法被服务器激活,如果
Servlet
的开发者需要,可以执行一些内在的设置,这样无需每个请求都设置一次,例如初始化其他网络服务的
session
或者访问它们拥有的数据(存储在数据库或文件中)。
(
2
)当初始化后,
Servlet
处理许多请求,为每一个客户请求生成一个
service
调用,这些请求可能是并行的,这允许
Servlet
调整多个客户的行为,类的静态状态可以用于在请求中共享数据。
(
3
)
Servlet
对象将一直处理请求,除非服务器调用
destroy
方法显式地关闭
Servlet
,
Servlet
类还是一个有效的垃圾收集器。
5.
安全性
Servlet
必须访问发出请求的客户的有关信息,当使用安全协议时,例如
SSL
,可以相当可靠地认证对方的身份。
Servlet
拥有
Java
的大多数优点,例如不允许违规访问内存及类型,这样,有缺陷的
Servlet
不会导致服务崩溃,而这在大多数
C
语言的服务器环境中经常发生。
与当前任何其他的服务器扩展
API
不同,
Java Servlet
提供了强大的安全策略支持,这是因为所有的
Java
环境都提供了一个安全管理器,可以用于控制是否允许执行某项操作,例如网络文件的访问。缺省的,通过网络装载的所有
Servlet
都是不可信的,它不许执行诸如访问网络服务或本地文件的操作。仅仅在
Java Web Server
中创建的,或者在本地由服务器管理控制的,
../Servlet
目录的
Servlet
,才是完全可信的,并赋予所有的权限。
然而,使用数字签名并放进
JAR
文件的
Servlet
是可信的,并可以被安全管理器赋予了更多的权利。在执行码上的数字签名描述了该代码是哪个组织签署并为其担保的。
其他语言中的扩展
API
,例如,
C
或者脚本语言,即使它们允许对代码进行数字签名,也无法支持如此精细的访问控制。这意味着
100%
纯
Java
的扩展(
extensions
)从根本上比其他况争方案更加安全,包括
ActiveX
。
今天,大多数
ISP
(
Internet Service Providers
)还不能接受来自它们的客户的服务器扩展,这是因为它们无法保护自己,或者不能保护它们的客户不受到使用本地
C
代码或
CGI
工具创建的扩展的攻击。然而,
100%
纯
Java Servlet
创建的扩展可以有效地防止数据被恶意地篡改。配合数字签名的使用,
ISP
可以保证,当它们使用由客户提供的
Servlet
来扩展它们的服务器时,不用担心由于不恰当编程所造成的种种危险。
6.
对于生成
HTML
许多
Servlet
将直接生成
HTML
格式的文本,标准的、国际化的
Java
格式输出类(例如
Java.io.PrintWrite
)可以容易地做到。
当然,也可以使用其他的
Java HTML
生成方法,例如,一些多语言站点更喜欢维护特定的本地化
HTML
模板文件,并使用本地化的信息目录来充填这些模板。另外,许多站点通常会开发
HTML
生成包来生成动态的
Web
页。
在完全支持
Servlet
的
Web
服务器中,
Servlet
还可能被服务器调用,使用服务器端包含的功能,预处理
Web
页。这种预处理请求被放在
.shtml
文件中,通过特定的
HTML
语法来向
Web
服务器描述。
通常
Servlet
可以从许多地方接受输入的参数:
(
1
)请求的输入流中,可能来自一个
Applet
。
(
2
)请求的
URI
中。
(
3
)自自其他的
Servlet
或网络服务。
(
4
)使用从
HTML
表格传递来的参数。
这些参数用于生成
HTML
格式的响应,为了获得响应要返回的数据,
Servlet
通常会访问一个或多个数据库,或者
Servlet
已经配置的其他数据。
7.
与
HTTP
有关的
Servlet
使用
HTTP
协议的
Servlet
支持所有的
HTTP
方法,包括
GET
、
POST
、
HEAD
等等。它们将请求重定向到其它位置,还可以发送
HTTP
错误信息。它们可以得到标准的
HTTP
表单传递的参数,包括
HTTP
要执行和描述请求目的的
URI
,例如:
String method = request.getMethod();
String uri = request.getRequestURI();
String name = request.getParameter(”name”);
String phone = request.getParameter(”phone”);
String card = request.getParameter(“creditcard”);
javax.servlet.http.httpServlet
类是实现
HttpServlet
的基类,它处理
HTTP
的细节,例如:缓存管理以及其他的子协议,分派方法并处理许多协议的错误情况。实现一个
HttpServlet
就和定义
doGet
或
doPost
方法一样容易。
对于
HttpServlet
,请求和响应数据总是以
MIME
格式提供,
Servlet
指定响应的数据类型,之后就按照设定的格式编码数据,这样,
Servlet
可以接收任意类型的输入数据,并返回表单中请求的数据。例如:
HTML
,图形格(
JPG
或
MPEG
)或者特定应用程序使用的数据格式。
8.
性能特征
Servlet
最突出的特征之一就是对于每一个请求不需要像
CGI
那样单独创建一个新的进程,在大多数环境中,许多
Servlet
可以并行运行在与服务器相同的进程中。这是因为
Servlet
仅仅要求轻量级的、现成的上下文转换,即使是
Fast-CGI
,每个请求都涉及重量级的进程上下文的转换,由于在大多数环境中,
Servlet
可以处理许多已经始化的客户请求,这些初始化的开销由许多方法分担,对于该
Service
方法所面对的所有客户请求,它们都有机会共享数据和通讯资源,并充分利用系统缓存的优点。