Java Servlet简介
Web Application历史
为了了解servlet的能力,我们需要回顾一些其他能够生成web application的方式。
通用网关接口CGI
通用网管接口(Common Gateway Interface, CGI),是早期一种产生动态内容的有效技术。一个服务器传递某些请求(request)到外部程序。这个程序的输出将动态内容传递给客户端。CGI的特性使得在网页上实现多种新功能成为了可能,并且迅速成为实际上的应用标准。
CGI的第一个缺点在于,它对于客户端作出的每个请求,必须创建CGI程序的一个新实例,这样占用大量的内存资源。
第二个缺点在于,CGI程序一旦启动后,就不能跟web服务器进行交互,不能利用服务器的能力,因为它是跑在一个独立的进程中的。比如说,CGI不能写服务器的日志文件。
FastCGI
一个叫Open Market的公司研发了一种标准CGI的替代版本,叫FastCGI。它的特点在于会为每一个FastCGI创建一个持久进程。
PerlEx
跟FastCGI类似。
mod_perl
Apache服务器提供的CGI,可以在服务器上预编译,跑起来很快,只能用在Apache服务器上。
其他方式
包括ASP和服务端的JavaScript,能够动态地创建web服务。
Java Servlet
下面开始介绍Java Servlet。
Servlet是一种通用服务器扩展,一种能够被动态加载用来扩展服务器功能的的Java类。
Servlet和专用服务器扩展相似,不同的是它运行在服务器的JVM上,所以它是安全和便携的。
Servlet仅在服务器的域内运行:与applet不同,它们在Web浏览器不需要Java支持。
与CGI不同,Servlet不需要多进程来处理不同的请求,它可以处理通过一个进程的不同线程来处理不同请求,也可以分散在多个后端服务器中的多个进程内的线程处理。这意味着servlet是高效和可扩展的。由于servlet与Web服务器进行双向通信,因此可以与服务器进行非常密切的交互,以便进行CGI脚本不可能执行的操作。
支持Servlets
跟Java一样,servlet是可以扩展的。servlet支持所有支持Java的平台。Servlet不是核心Java API的一部分。但是,它们现在被认可为J2EE平台的一部分。
javax.servlet和javax.servlet.http包构成了Servlet API。
除了servlet类之外,还需要一个servlet转换器(技术上称为servlet容器,有时称为servlet引擎),以便您可以测试和部署servlet。您选择的servlet容器部分取决于您正在运行的Web服务器。有三种类型的servlet容器:独立的,附加的和可嵌入的。
独立Servlet容器
一个独立的servlet容器是一个包含对servlet的内置支持的服务器。这样一个容器的优点在于所有的工作都是开箱即用的。然而,一个缺点是您必须等待新版本的Web服务器才能获得最新的servlet支持。另一个缺点是服务器供应商通常仅支持供应商提供的JVM。提供独立支持的Web服务器包括:
Apache的Tomcat服务器。该服务器可以独立运行,也可以作为附加组件,为Apache或其他服务器提供servlet支持。甚至可以用作嵌入式容器伴随着Tomcat,Apache开发了javax.servlet和javax.servlet.http包的标准实现。
iPlanet (Netscape) Web Server Enterprise Edition (Version 4.0 and later)。
Zeus Web Server。
Sun’s Java Web Server
附加的Servlet容器
附加servlet容器用作现有服务器的插件,它将Servlet支持添加到不是最初设计为servlet的服务器上,这些servlet使用较差或过时的servlet实现。
嵌入的Servlet容器
可嵌入容器通常是可以嵌入另一个应用程序的轻量级servlet部署平台。该应用程序成为真正的服务器。
Servlet的能力
我们认为,servlet比其他方法提供了许多优势,包括可移植性,能力,效率,耐力,安全性,优雅性,集成性,可扩展性和灵活性
可移植性
用Java写的,可以跨平台使用。
能力
Servlet可以利用核心Java API的全部功能:网络和URL访问,多线程,图像处理,数据压缩,数据库连接(JDBC),对象序列化,国际化,远程方法调用(RMI)和遗留集成(CORBA)。
Servlet还可以利用J2EE平台包括对Enterprise JavaBeans(EJB),分布式事务(JTS),标准化消息传递(JMS),目录查找(JNDI)和高级数据库访问(JDBC 2.0))的支持的J2EE平台。可用于servlet的标准API列表继续增长,使Web应用程序开发的任务更快,更轻松,更可靠。
Servlet可以使用第三方Java类和JavaBeans组件,使用第三方代码实现正则表达式搜索、数据库访问等。
Servlet也非常适合启用客户端/服务器通信。使用基于Java的小程序和基于Java的servlet,您可以在客户端/服务器通信中使用RMI和对象序列化,这意味着您可以在客户端上使用与服务器上相同的自定义代码。在服务器端使用Java以外的语言要复杂得多,因为您必须开发自己的自定义协议来处理通信。
安全性
Servlets支持多个级别的安全编程实践。由于它们是用Java编写的,所以servlet继承了Java语言的强大类型安全性。此外,Servlet API被实现为类型安全的。
集成性
Servlet与服务器紧密集成。这种集成允许servlet能和服务器协作更多CGI程序不能做的事情。例如,servlet可以使用服务器来翻译文件路径,执行日志记录,检查授权和执行MIME类型映射。Server-specific的扩展可以做更多事情,但是这个过程通常要复杂得多,容易出错。