Java 应用程序可以在服务器上运行,但是不管是在客户机-服务器环境下,还是在基于 Web 的环境下,JDK 中都没有提供让 Java 应用程序专用于服务器机器的接口或包。认识到 Java 在 Web 环境下作为一种服务器语言的潜力,Sun Microsystems 编写了 Java Servlet 规范。servlet 在许多方面与 applet 相似,它是专门为在 Web 服务器机器上运行而设计的 Java 程序:
“servlet 是由容器管理的 Web 组件,可产生动态内容。servlet 是一种小型的、与平台无关的 Java 类,被编译成体系结构中立的字节代码,这种代码可以动态地加载到一个 web 服务器上,并由此 web 服务器运行。servlet 通过一种由 servlet 容器实现的请求-响应模型与 Web 客户机进行交互。这种请求-响应模型建立在超文本传输协议 (HTTP) 行为的基础之上。”(见 JavaSoft 的“Java Servlet API Specification”)
在一台 Web 服务器控制下,在多台服务器上运行若干小型用户程序,这种想法并不新鲜 — 一段时间以来,公共网关接口 (CGI) 程序(常被称为 CGI 脚本)一直起着这种作用,并推动了 Web 的普及。但 Java servlet 可以以更高的效率和可移植性来实现这一目的,因而可望最终会取代 CGI 程序。为 servlet 提供运行时环境的软件(通常被称为 servlet 引擎)可以添加到现有的、本身并不支持 Java 可执行程序的 Web 服务器上。
Java servlet 的出现,为应用程序员使用 Java 来创建 Web 应用程序开辟了新的途径。但是,仅有 servlet 还不能为真正的企业计算提供完整的模型。CGI 应用程序本身往往不是完整的应用程序,在处理接收自 Web 浏览器上用户的信息请求时,CGI 只是整个处理过程中的一个中间步骤。例如,CGI 应用程序的一种常见用途是访问数据库。将它用于这种任务时,CGI 程序提供一种方法,将用户的数据请求连接到能满足这种请求的企业数据库。CGI 程序常常充当一种中间软件,从 Web 浏览器接收请求,决定必须调用哪些计算资源来满足这些请求,并向浏览器发回响应。Java servlet 与 CGI 程序一样,最适合充当连接前端 Web 请求与后端数据资源的中间层组件。
三层体系结构 Web 编程向服务器端 Java 应用程序的演化,也带来了体系结构的演化,使它脱离了常规的客户机-服务器两层模型,而向一种三层方法发展。两层模型当时曾经具有创新意义,因为它将一些计算任务从主处理器上卸载到灵巧的客户机。常规的基于 LAN 的数据库应用程序就是一个例子,其中数据库管理器服务器软件驻留在一个专用的服务器机器上,而用户则通过他们的工作站上的客户机代码来访问数据库。随着客户机-服务器模型成长到能付诸使用,就出现了对服务器可伸缩性和对客户机代码大小和复杂性的关注。于是提出了一种三层的体系结构,以避免在两层模型中已察觉到的弱点,使 Web 能成为一个计算平台:
“许多人...断言,传统的客户机/服务器两层体系结构不会有好的可伸缩性,因为用户连接和数据访问的数量无法预测,而且在一些系统管理上也存在问题。为处理两层体系结构的限制,许多开发集体都在转向三层体系结构。这种体系结构大致可以定义为:客户机层上的表示层、中间的服务器和后端的某种数据库。这种设想的目的就是缓和客户机或数据库服务器上的代码膨胀,集中管理业务逻辑,更灵活地使用数据库,而不仅是使用所存储的过程和触发器。”(见 Kim 的“Looking for a 3-Tier App Builder?”)
一个三层结构模型通常被想像成有一个 Web 浏览器作为客户层。Web 浏览器由于有可能成为一种真正的通用客户机,使它从观念上取代了两层结构的“胖客户机”。如果浏览器作为 Web 应用程序体系结构的标准瘦客户机获得认可,那么以前驻留在两层模型的胖客户机中的功能会怎么样呢?现在,应用程序专用的功能并不移植回服务器(例如数据库管理器),而是有意将它驻留在一个新的中间层上。中间层支持应用程序服务器软件,这种软件是中间件的一种形式,它处于第一层上瘦客户机的最小功能和第三层上服务器端业务系统的丰富功能之间。由于三层体系结构与 Web 处理模型有密切关系,所以中间层应用程序服务器常被视为 Web 服务器的一种功能扩展。现有的 Web 应用程序利用 CGI 程序,将来自 Web 浏览器的用户请求传送到不基于 Web 的业务系统,并向浏览器返回响应,就是三层模型的一种实现。这些应用程序逐渐向 servlet 技术的转移说明三层模型正在增强。
“事务的概念是一个重要的编程范例,其目的在于简化既要求可靠性又要求可用性的应用程序结构,特别是那些需要同时访问共享数据的应用程序。事务的概念最早是用在商务运作的应用程序中,其中它被用于保护集中式数据库中的数据。后来,事务的概念已扩展到分布式计算的更广泛的环境中。今天,事务是构建可靠的分布式应用程序的关键,这一点已得到广泛承认。”(见对象管理组的“Transaction Service Specification”)
OMG 的对象事务服务 (OTS) Sun Microsystems 的 Transaction Service (JTS) Sun Microsystems 的 Java Transaction API (JTA) 开放组 (X/Open) 的 XA 接口 这种与语言无关的对象事务服务,为一个强健的分布式事务服务提供了基本概念、定义和功能。
Java Transaction Service 是 OTS 的 Java 映射,在 org.omg.CosTransactions 和 org.omg.CosTSPortability 这两个包中定义。JTS 对事务分界和事务环境的传播之类的服务提供支持。JTS 功能由应用程序通过 Java Transaction API 访问。
Java Transaction API 指定事务管理器与分布式事务中涉及的其他系统组件之间的各种高级接口,这些系统组件有应用程序、应用程序服务器和资源管理器等。JTA 功能允许事务由应用程序本身、由应用程序服务器或由一个外部事务管理器来管理。JTA 接口包含在 javax.transaction 和 javax.transaction.xa 这两个包中。
XA 接口定义了资源管理器和分布式事务环境中外部事务管理器之间的约定。外部事务管理器可以跨多个资源协调事务。XA 的 Java 映射包含在 Java Transaction API 中。
要了解更多有关 Java 技术和 EJB 体系结构的内容,请访问 Sun 的网站。 关于从 applet 和应用程序的角度看 Java 编程,请阅读 David Flanagan 所著的 Java in a Nutshell。 下载一份 Java Servlet API Specification 的副本。 下载 Java Developer's Journal第 3 卷第 1 期中 Tom Kim 所写的“Looking for a 3-Tier App Builder?”(PDF)。 参加 JavaSoft 的“Using the Beans Development Kit 1.0”课程。 从“JavaBeans Guidelines”中可以发现一些补充的指导原则,它们使您能开发出性能优良的 Bean,这些 Bean 能够在大多数环境中表现良好,包括流行的各种 IDE 和各种浏览器。 阅读 Patricia Seybold Group 的 Anne Thomas 所写的“Java 2 Platform, Enterprise Edition: Ensuring Consistency, Portability, and Interoperability” 中对 J2EE 的详细说明。 查阅“JNDI: Java Naming and Directory Interface” 中的 JNDI 体系结构和接口的概述,以及各种情况和示例。 了解Java 2 Platform, Enterprise Edition 中包含的以下 Java 技术: Java IDL Java Message Service (JMS) API Java Naming and Directory Interface (JNDI) Java Remote Method Invocation (RMI) Java Transaction API (JTA) Java Transaction Service (JTS) JavaServer Pages (JSP) 技术 JDBC 数据访问 API 要了解常见问题、与 LDAP 相关的 RFC 以及更多信息,请访问 Mark Wahl 的 LDAP 网站。 要了解如何将 linux 配置为 NIS(YP) 或 NIS+ 客户机及如何安装成 NIS 服务器,请查阅 Linux NIS(YP)/NYS/NIS+ HOWTO。 下载 Java IDL 的命名服务 COS naming。 详细了解 Java Remote Method Invocation (RMI),包括规范、示例和常见问题。 了解 Novell 提供的大量的产品和解决方案。 访问 Object Management Group (OMG) 的网站。 查阅开放组的 XA interface 规范。
作者简介 Ken Nordby 是位于 Research Triangle Park,North Carolina 的 IBM 软件开发实验室的软件工程师。作为 SWG ProdUCt Affinity Services 工作组的成员,Ken 和他的 IBM 同事从事 IBM WebSphere Application Server(Enterprise JavaBeans 的 IBM 实现)的开发及咨询工作。可以通过 nordby@us.ibm.com 与 Ken 联系。进入讨论组讨论。