JavaServlet:Web应用开发的理想选择
立即解锁
发布时间: 2025-08-18 02:12:13 阅读量: 1 订阅数: 2 

### Java Servlet:Web应用开发的理想选择
在当今的Java编程领域,服务器端Java应用的崛起成为了最新且令人兴奋的趋势之一。Java语言最初是为小型嵌入式设备设计的,后来曾因用于开发小程序形式的复杂客户端Web内容而备受关注。然而,直到最近,Java作为服务器端开发平台的潜力才逐渐被人们所认识。
#### 1. Web应用的发展历程
Web应用相较于普通网页,能提供更具交互性的体验,可简单如文档存档的关键字搜索,也可复杂如电子店面。它被广泛部署在互联网、企业内联网和外联网,能提高生产力并改变企业的运营方式。为了理解Servlet的强大之处,我们先来看看其他创建Web应用的方法。
##### 1.1 通用网关接口(CGI)
CGI是创建动态内容的早期实用技术之一。当Web服务器接收到访问CGI程序的请求时,会创建一个新进程来运行该程序,并通过环境变量和标准输入传递生成响应所需的所有信息。这一过程不仅耗时,还会消耗大量服务器资源,限制了服务器并发处理请求的数量。
虽然CGI程序可以用几乎任何语言编写,但Perl语言因其强大的文本处理能力成为了主流选择。不过,使用Perl编写的CGI脚本每次请求都需要启动一个单独的Perl解释器,进一步增加了时间和资源的消耗。此外,由于CGI程序在单独的进程中运行,它无法与Web服务器进行交互,例如不能写入服务器的日志文件。
##### 1.2 FastCGI
FastCGI是Open Market公司开发的一种替代标准CGI的技术。与CGI不同的是,FastCGI为每个程序创建一个持久进程,避免了为每个请求创建新进程的开销。然而,FastCGI仍然存在进程过多的问题,每个程序至少需要一个进程,处理并发请求时还需要进程池。而且,FastCGI无法帮助程序与服务器更紧密地交互,并且一些流行的服务器(如Microsoft的Internet Information Server)尚未实现该技术。
##### 1.3 mod_perl
如果你使用的是Apache Web服务器,mod_perl是提高CGI性能的另一个选择。它是Apache服务器的一个模块,将Perl解释器嵌入到Apache httpd可执行文件中,使服务器能够预编译CGI脚本并直接执行,无需分叉,从而提高了运行速度和效率。
##### 1.4 PerlEx
PerlEx由ActiveState开发,用于提高在Windows NT Web服务器上运行的Perl CGI脚本的性能。它通过使用Web服务器的本地API来实现性能提升。
##### 1.5 其他解决方案
除了上述技术,还有一些其他创建Web应用的方法:
- **服务器扩展API**:一些公司为其Web服务器创建了专有扩展API,如Netscape的NSAPI和Microsoft的ISAPI。使用这些API可以编写服务器扩展,增强或改变服务器的基本功能。但这些扩展不仅开发和维护困难,还存在安全和可靠性风险,并且与特定的服务器API和操作系统紧密绑定。
- **Active Server Pages(ASP)**:Microsoft开发的一种生成动态Web内容的技术。Web服务器上的HTML页面可以包含嵌入式代码(通常是VBScript或JScript),服务器在将页面发送给客户端之前会读取并执行这些代码。ASP适用于生成少量动态内容,支持该技术的服务器包括Microsoft Internet Information Server 3.0及以上版本。
- **服务器端JavaScript(SSJS)**:Netscape的服务器端脚本技术,允许在HTML页面中嵌入JavaScript代码以生成动态内容。与ASP不同的是,SSJS使用JavaScript作为脚本语言,并通过预编译页面来提高性能。该技术仅在Netscape FastTrack Server和Enterprise Server 2.0及以上版本中可用。
#### 2. Java Servlet的登场
Java Servlet是一种通用的服务器扩展,是可以动态加载以扩展服务器功能的Java类。它通常用于Web服务器,可替代CGI脚本。与专有服务器扩展不同的是,Servlet在服务器的Java虚拟机(JVM)中运行,因此具有安全性和可移植性。
与使用多进程处理请求的CGI和FastCGI不同,Servlet在Web服务器进程内通过单独的线程处理请求,这使得Servlet不仅高效,而且可扩展。此外,由于Servlet在Web服务器内部运行,它可以与服务器进行紧密交互,实现一些CGI脚本无法完成的任务。
Servlet的可移植性也是其一大优势,它可以在支持Java的所有平台和主要Web服务器上运行。我们认为Java Servlet为Web应用开发提供了理想的平台。
#### 3. Servlet的支持情况
Servlet的设计初衷是为了实现可移植性,它得到了所有支持Java的平台和主要Web服务器的支持。Sun Microsystems的Java软件部门定义的Java Servlet是Java的第一个标准扩展,虽然Servlet是Java语言的一部分,但不属于核心Java API。
为了方便开发者开发Servlet,Sun公开了一组提供基本Servlet支持的类,即`javax.servlet`和`javax.servlet.http`包,构成了Servlet API。这些类的2.0版本与Java Servlet开发工具包(JSDK)捆绑在一起,可从[http://java.sun.com/products/servlet/](http://java.sun.com/products/servlet/)下载。
许多Web服务器供应商已经将这些类集成到他们的服务器中,以提供Servlet支持,有些还提供了额外的功能。除了Servlet类,开发和部署Servlet还需要一个Servlet引擎。Servlet引擎主要有以下三种类型:
##### 3.1 独立Servlet引擎
独立Servlet引擎是一种内置Servlet支持的服务器,开箱即用。但缺点是需要等待服务器的新版本才能获得最新的Servlet支持。目前,以下服务器提供了独立的Servlet引擎:
- **Sun的Java Web Server**:曾被称为“Jeeves”,被认为是Servlet引擎支持Servlet的参考实现,除了两个增强功能的本地代码库外,完全用Java编写。
- **万维网联盟的Jigsaw Server**:免费提供,同样完全用Java编写。
- **O'Reilly的WebSite Professional(2.1及更高版本)**:第一个非Java编写但提供内置Servlet支持的服务器。
- **Netscape的Enterprise Server(3.51及更高版本)**:最流行的提供内置Servlet支持的Web服务器,但3.51版本仅支持早期的Servlet API 1.0,且存在许多严重的漏洞,暂时建议使用附加Servlet引擎。
- **Lotus的Domino Go Webserver(4.6及更高版本)**:另一个提供内置Servlet支持的流行Web服务器,4.6.x版本仅支持早期的Servlet API 1.0,但Lotus声称将用Java Servlet取代其专有GWAPI服务器扩展技术。
此外,一些应用服务器也包含Servlet引擎,如WebLogic的Tengah Application Server和ATG的Dynamo Application Server 3。
##### 3.2 附加Servlet引擎
附加Servlet引擎作为插件添加到现有服务器中,为原本未设计支持Servlet的服务器提供支持。以下是一些常见的附加Servlet引擎:
- **Java - Apache项目的JServ模块**:免费的Servlet引擎,为流行的Apache服务器添加Servlet支持。
- **Live Software的JRun**:免费插件,支持在所有流行操作系统上的流行Web服务器上使用完整的Servlet API,最新版本还包含一个用于开发的基本Web服务器。
- **IBM的WebSphere Application Server**:曾被称为ServletExpress,是一个插件,旨在支持多个流行Web服务器和操作系统上的完整Servlet API。
- **New Atlanta的ServletExec**:插件,支持多个Web服务器和操作系统上的完整Servlet API。
- **Gefion Software的WAICoolRunner**:免费插件,使用Netscape的WAI接口,支持Netscape FastTrack Server和Enterprise Server 3.x及更高版本的大部分Servlet API。
- **Unicom的Servlet CGI Development Kit**:免费框架,在CGI之上支持Servlet,虽然效率不高,但具有广泛的适用性。
##### 3.3 可嵌入Servlet引擎
可嵌入Servlet引擎通常是一种轻量级的Servlet部署平台,可以嵌入到其他应用程序中,使该应用程序成为真正的服务器。常见的可嵌入Servlet引擎包括:
- **Sun的JavaServer Engine**:用于设计和构建Java服务器的高质量、高端框架,Sun的Java Web Server和IBM的WebSphere Application Server均基于此构建。
- **Jef Poskanzer的Acme.Serve**:免费的简单Web服务器,运行的Servlet与Servlet API“大致兼容”。
- **Paralogic的WebCore**:免费但不受支持的可嵌入Web服务器,完全用Java编写,包含了Acme.Serve的部分功能。
- **Anders Kristensen的Nexus Web Server**:免费的Servlet运行器,实现了大部分Servlet API,可轻松嵌入Java应用程序中。
在选择Servlet引擎(可能还包括服务器)来部署Servlet时,建议进行测试,确保Servlet的行为与在Java Web Server实现中一致。你可以参考Sun维护的官方列表[http://jserv.java.sun.com/products/java-server/servlets/environments.html](http://jserv.java.sun.com/products/java-server/servlets/environments.html)获取最新的可用Servlet引擎信息。
下面用一个mermaid流程图展示Servlet引擎的分类:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A([Servlet引擎]):::startend --> B(独立Servlet引擎):::process
A --> C(附加Servlet引擎):::process
A --> D(可嵌入Servlet引擎):::process
B --> B1(Sun的Java Web Server):::process
B --> B2(万维网联盟的Jigsaw Server):::process
B --> B3(O'Reilly的WebSite Professional):::process
B --> B4(Netscape的Enterprise Server):::process
B --> B5(Lotus的Domino Go Webserver):::process
C --> C1(Java - Apache项目的JServ模块):::process
C --> C2(Live Software的JRun):::process
C --> C3(IBM的WebSphere Application Server):::process
C --> C4(New Atlanta的ServletExec):::process
C --> C5(Gefion Software的WAICoolRunner):::process
C --> C6(Unicom的Servlet CGI Development Kit):::process
D --> D1(Sun的JavaServer Engine):::process
D --> D2(Jef Poskanzer的Acme.Serve):::process
D --> D3(Paralogic的WebCore):::process
D --> D4(Anders Kristensen的Nexus Web Server):::process
```
综上所述,不同类型的Servlet引擎各有优缺点,开发者可以根据自己的需求和服务器环境进行选择。在后续的内容中,我们将深入探讨Servlet的强大之处,包括其可移植性、性能、安全性等方面的优势。
#### 4. Servlet的强大之处
前文我们介绍了Servlet作为一种替代其他动态Web内容技术的选择,接下来详细解释为何它是Web开发的可行之选,它具备诸多优势,下面逐一分析。
##### 4.1 可移植性
Servlet使用Java编写,并遵循定义明确且广泛接受的API,这使得它在不同操作系统和服务器实现之间具有高度的可移植性。例如,你可以在运行Java Web Server的Windows NT机器上开发一个Servlet,之后轻松地将其部署到运行Apache的高端Unix服务器上,真正实现“一次编写,随处运行”。
Servlet的可移植性与小程序不同,主要有两个原因。其一,Servlet的可移植性并非强制要求。与小程序需要在所有可能的客户端平台上进行测试不同,Servlet只需在用于开发和部署的服务器机器上正常工作即可。除非你从事Servlet销售业务,否则无需担心完全的可移植性。其二,Servlet避免了Java语言中最容易出错且实现不一致的部分,即构成Java图形用户界面基础的抽象窗口工具包(AWT)。
##### 4.2 强大功能
Servlet能够充分利用核心Java API的强大功能,涵盖网络和URL访问、多线程、图像操作、数据压缩、数据库连接、国际化、远程方法调用(RMI)、CORBA连接以及对象序列化等。例如,如果你要编写一个允许员工查询企业遗留数据库的Web应用程序,就可以利用所有Java企业API。若需要创建一个基于Web的目录查找应用程序,则可以使用JNDI API。
作为Servlet开发者,你还可以从大量第三方Java类和JavaBeans组件中进行选择。未来,甚至可以使用新推出的企业JavaBeans组件。目前,Servlet可以使用第三方代码来处理诸如正则表达式搜索、数据图表绘制、高级数据库访问和高级网络等任务。
此外,Servlet非常适合实现客户端 - 服务器通信。通过基于Java的小程序和Servlet,你可以使用RMI和对象序列化来处理客户端 - 服务器通信,这意味着你可以在客户端和服务器上复用相同的自定义代码。而使用CGI实现相同目的则要复杂得多,因为你必须开发自己的自定义协议来处理通信。
##### 4.3 高效性和持久性
Servlet的调用效率极高。一旦Servlet被加载,它通常会作为单个对象实例保留在服务器内存中。此后,服务器通过简单、轻量级的方法调用来调用Servlet处理请求。与CGI不同,无需生成新进程或调用解释器,因此Servlet几乎可以立即开始处理请求。多个并发请求由单独的线程处理,这使得Servlet具有高度的可扩展性。
一般来说,Servlet是自然持久的对象。由于Servlet作为单个对象实例保留在服务器内存中,它会自动维护其状态,并可以持有外部资源,如数据库连接,而建立这些资源可能需要几秒钟的时间。
##### 4.4 安全性
Servlet在多个层面支持安全的编程实践。由于它们使用Java编写,因此继承了Java语言强大的类型安全性。此外,Servlet API的实现也是类型安全的。在CGI程序中,大多数值(包括服务器端口号等数字项)都被视为字符串,而Servlet API使用其原生类型来操作值,因此服务器端口号表示为整数。Java的自动垃圾回收和无指针特性意味着Servlet通常不会受到内存管理问题的影响,如悬空指针、无效指针引用和内存泄漏。
由于Java的异常处理机制,Servlet可以安全地处理错误。如果Servlet进行了除零操作或执行了其他非法操作,它会抛出一个异常,服务器可以安全地捕获并处理该异常,礼貌地记录错误并向用户道歉。而如果基于C++的服务器扩展犯了同样的错误,则可能会导致服务器崩溃。
服务器还可以通过使用Java安全管理器进一步保护自己免受Servlet的影响。服务器可以在严格的安全管理器的监控下执行Servlet,例如,实施旨在防止恶意或编写不当的Servlet损坏服务器文件系统的安全策略。
##### 4.5 优雅性
Servlet代码的优雅性令人瞩目。它干净、面向对象、模块化且极其简单。这种简单性的一个原因是Servlet API本身,它包含了处理Servlet开发许多日常杂务的方法和类。即使是高级操作,如cookie处理和会话跟踪,也被抽象到方便的类中。API中遗漏了一些更高级但仍然常见的任务,在这些方面,我们在`com.oreilly.servlet`包中提供了一组有用的类。
##### 4.6 集成性
Servlet与服务器紧密集成,这种集成使Servlet能够以CGI程序无法实现的方式与服务器协作。例如,Servlet可以使用服务器来转换文件路径、执行日志记录、检查授权、执行MIME类型映射,在某些情况下,甚至可以将用户添加到服务器的用户数据库中。特定于服务器的扩展也可以完成其中许多任务,但过程通常更加复杂且容易出错。
##### 4.7 可扩展性和灵活性
Servlet API的设计易于扩展。目前,该API包含针对HTTP Servlet进行优化的类。但在未来,Sun或第三方可以对其进行扩展和优化,以支持其他类型的Servlet,也有可能进一步增强其对HTTP Servlet的支持。
Servlet还具有很强的灵活性。在下一章中你将看到,HTTP Servlet可以用于生成完整的Web页面;可以使用`<SERVLET>`标签将其添加到静态页面中,即所谓的服务器端包含;还可以与任意数量的其他Servlet协作,在所谓的Servlet链中过滤内容。此外,在本书付梓之际,Sun推出了JavaServer Pages,它提供了一种直接在静态HTML页面中编写Servlet代码片段的方法,其语法与Microsoft的Active Server Pages(ASP)非常相似。未来可能还会有更多创新。
下面用表格总结Servlet与其他动态Web内容技术的比较:
| 技术 | 可移植性 | 功能 | 效率 | 安全性 | 集成性 | 可扩展性 | 灵活性 |
| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
| CGI | 一般 | 有限 | 低 | 低 | 差 | 差 | 差 |
| FastCGI | 一般 | 有限 | 一般 | 低 | 差 | 差 | 差 |
| mod_perl | 依赖Apache | 一般 | 较高 | 一般 | 较好 | 一般 | 一般 |
| PerlEx | 依赖Windows NT | 一般 | 较高 | 一般 | 较好 | 一般 | 一般 |
| 服务器扩展API | 差 | 强 | 高 | 低 | 好 | 差 | 差 |
| ASP | 依赖Microsoft服务器 | 一般 | 较高 | 一般 | 好 | 一般 | 一般 |
| SSJS | 依赖Netscape服务器 | 一般 | 较高 | 一般 | 好 | 一般 | 一般 |
| Servlet | 高 | 强 | 高 | 高 | 好 | 好 | 好 |
综上所述,Java Servlet在Web应用开发中具有显著的优势,无论是可移植性、功能、效率还是安全性等方面都表现出色。不同类型的Servlet引擎为开发者提供了多种选择,以满足不同的需求和服务器环境。随着Web技术的不断发展,Servlet有望在未来的Web应用开发中发挥更加重要的作用。
0
0
复制全文
相关推荐









