与您阅读本文之初相比,现在您已经知道了更多关于 Java 语言的知识,下面应该返回到支持 Web 的 Windows 客户机-服务器应用程序这个主题了。将 Java 或 J2EE 应用程序构造为一个多层的、模块化的、基于组件的体系结构,这样在 Web 支持、重用、可维护性和灵活性方面带来了许多好处。
典型的 J2EE Web 应用程序体系结构基于模型-视图-控制器(Model-View-Controller、MVC)体系结构设计模式(请参阅 图 1),并且包含以下关键元素:
基于瘦客户机 Web 浏览器/Java applet 模型的客户机,它支持从基于浏览器和基于客户机的纯 Java 程序对基于服务器的 Web 应用程序进行普遍访问,从而按需交付应用程序组件。体系结构合理的 Web 应用程序支持同时用于终端用户和外部应用程序的多种接口类型。J2EE 对 Java servlet 和 JavaServer Pages(JSP)的使用,允许用户从瘦客户机 Web 浏览器和其他设备通过 HTTP 访问应用程序。您可以使用 HTML、XHTML、XML、JavaScript、Java applet 以及其他瘦客户机技术来构建瘦客户机接口。还可以使用 Java 语言和 J2EE 来构建功能丰富的“瘦客户机”应用程序,以访问位于内部网络/防火墙之内的基于服务器的应用程序。
提供服务的网络基础结构比如 TCP/IP、防火墙、路由器、LDAP 目录服务器、Web 服务器和安全 -- 您可以通过开放标准的接口和协议访问访问这些服务的功能。
业务逻辑组件,它通过控制事务的执行来强制业务单元的策略和过程,并请求用户通过用户界面提交请求来访问和更新后端数据源和应用程序。能够实现应用程序业务逻辑的 Java 和 J2EE 应用程序组件包括 servlet、JavaBean 组件和 Enterprise JavaBean(EJB)组件。
应用服务器软件,它为基于 Web 的电子商务应用程序提供平台。它通常包括一个 HTTP 服务器、数据库和事务服务、会话管理、邮件和群件服务,以及消息服务。诸如 Apache JBoss 和 IBM WebSphere 之类的 J2EE 应用服务器能够提供这些服务。您需要一个 J2EE 应用服务器来部署和运行 Web 应用程序的 J2EE 服务器端。
集成中间件和组件,它们允许访问现有的数据、应用程序组件、数据源,以及在有些情况下访问整个应用程序。Java 技术和 J2EE 提供了许多标准组件和技术,用于数据源集成、通过 EJB 组件实现的数据源实体、消息服务以及本机平台服务和组件。Web 应用程序还能够通过各种各样的工具和组件,访问现有的平台相关的数据和应用程序组件。
后端数据源和现有的非 Java 应用程序和应用程序组件:对于本路标图来说,这些资产通常是您不能或不想移植到 Java 或 J2EE,但是又必须与整体 Java 技术或 J2EE 解决方案集成的 Windows 应用程序组件。新的 Java 或 J2EE 应用程序服务还能够直接或间接地访问 Windows 应用程序组件所连接到的关键数据源。例如,您可以将 Microsoft SQLServer 客户机组件替代为使用 JDBC API 来实现的 Java 数据访问组件。
Web 应用程序编程环境和开发工具 ,它们提供用于创建、装配、部署和管理动态和健壮的电子商务应用程序的服务器端 Java 编程和 J2EE 编程环境。
图 1. MVC 与 J2EE Web 应用程序
访问本机 Windows 组件
Java 编程环境为大多数平台无关的常用系统服务提供类和库,包括 TCP/IP 网络和套接字、文件系统资源,以及打印。(我们将在本文后面的 用户界面考虑因素中讨论窗口处理和用户界面。)由于您已决定使用 Java 技术来实现应用程序的 Web 支持特性,因此应该使用对应的支持 Java 的服务和功能来代替任何平台 /Windows 相关的服务和功能。例如,将使用了 NetBios 或 Windows 网络的通信服务代替为使用 java.net 包的 TCP/IP 和套接字,以及将 Windows 文件系统功能代替为 java.io 包中的等价特性。
Java 本机接口(Java Native Interface,JNI)
JNI 提供了用于整合本机 C/C++ 和 Java 代码的机制。它是一个具有文档和受支持的 API,JVM 本身就使用该实现来访问底层的本机平台操作系统服务。这些服务包括大多数平台上可用的公共功能,比如通信、网络、应用程序配置、进程管理,以及文件系统。本机平台服务还可以包括特定平台相关的服务,比如基于 Windows 的网络、设备管理、打印,以及 COM/DCOM。
如果选择使用 JNI 来访问本机 Windows 组件,您就剥夺了自己使用 Java 语言的主要价值诉求 —— 平台无关性。然而,在某些情况下使用 JNI 是必要的。例如:
您在原型化应用程序的 Java 实现,并且能够提供瘦客户机接口和 Java Web 组件作为 Web 应用程序原型的前端。
您在分阶段地对应用程序组件向 Java 语言或 J2EE 的移植进行阶段测试。作为权宜之计,您将剩余的非 Java 组件的服务作为它们当前的 Windows 实现来访问。
应用程序访问的服务或数据的接口将是平台相关的(例如 COM/DCOM 组件)。
应用程序访问的服务或数据是通过某个组件或外部应用程序来提供的,在向 Java 的移植过程中包括该组件或应用程序是不切实际的。(例如,源代码不可用是因为另一家公司或合作伙伴拥有它,因而不允许修改它或再分发它。)
您计划将应用程序的组件移植到 Java,或者在以后某个时间将它们替代为外部可用的 Java 组件,并且您必须使用本机平台组件。
其他工具和技术
除了 JNI 之外,还有其他几种工具和技术有助于从 Java 语言中访问本机 Windows 组件。与 JNI 一样,您应该将那些技术的使用限制到以下情况,即您不能使用 Java 语言或 J2EE 实现该集成的本机代码组件,或者您计划以后才这样做。
JNI++ 项目
JNI++ 项目提供了两个代码生成实用程序和一个旨在简化用 C++ 进行 JNDI 编程的核心 C++ 库。使用仅具有相对简单的数据结构的本机 C/C++ 类来编写简单的 JNI 程序,即这些程序仅访问字段和使用简单的访问方法(accessor)和修改方法(modifier method),这是相当容易的。但是使用 JNI 来提供对如下这样的 C/C++ 类的访问就更具挑战了:这些类具有复杂的数据结构、异常处理以及需要从 C/C++ 中回调 Java 代码。JNI++ 代码生成实用程序旨在把从 C/C++ 世界和 Java 语言之间的映射所花的时间减到最少。JNI++ 生成许多从 Java 语言访问 C++ 类(或反之)所必需的大量代码。核心本机代码库为 JVM 和每个运行线程的 JNI 环境提供了简化的接口。这个库还包含用于原始 JNI 类型的包装类,并且还处理 Java 代码和 C++ 异常之间的转换。
Interface Tool for Java
IBM alphaWorks Interface Tool for Java(以前名为 Bridge2Java)允许 Java 程序与 ActivX 对象通信,以便将 ActiveX 对象容易地集成到 Java 环境中。Interface Tool for Java 使用 JNI 和 COM 技术来允许您将 ActiveX 对象完全当作 Java 对象来处理。 您只需运行一个代理生成工具,根据 ActiveX 控件的 typelib 创建 Java 代理。然后您可以使用这些代理来允许 Java 程序与该 ActiveX 对象通信。Interface Tool for Java 包括的示例展示了 Java 应用程序代码如何访问该工具所生成的那些 Java 代理,从而与各种各样的 COM 对象交互,包括 Lotus 1-2-3 电子表格、Microsoft Excel、Microsoft Word、Microsoft Outlook、Microsoft Calendar,以及 Microsoft Internet Explorer。
Codemesh JunC++ion
JunC++ion 允许您混合和匹配 Java 组件与 C++ 组件,以便解决诸如使 C++ 应用程序支持 Web、将 C++ 客户机集成到 EJB 环境中、使用 C++ 实现 EJB 组件以及同时允许 Java 和 C++ 组件使用单个 API 集等问题。
JNIWrapper
JNIWrapper 通过 JNI 提供一个针对平台相关(比如 Windows 和 Linux)的特性和服务的 Java 接口,这是平台无关的 Java 环境所没有提供的。有些平台相关的操作,比如 Windows 下的注册表项,在 Java 语言中不受支持。为了使用 JNI 来提供这个功能,您需要实现一个本机库和一些 Java 类,并与它配合工作,同时在 Java 调试器和本机端的调试器中测试和调试它。JNIWrapper 提供了用于调用本机库函数的 Java 库。使用 JNIWrapper,您可以在 Java 应用程序中访问本机系统的操作和特性(比如托盘图标或者定制的启动屏幕)。
Jawin 集成项目
Jawin(Java/Win32)是一个免费的、开放源代码的体系结构,用于 Java 组件和通过 Windows COM 对象或 Windows DLL 来公开的组件之间的互操作。Jawin 允许 Java 应用程序调用任何基于 COM 或 DLL 的遗留代码,而不需要编写任何 JNI 代码。您的代码将能与诸如 Microsoft Office 套件等可编写脚本的应用程序交互,调用诸如 Microsoft 的基于 COM 的 XML 解析器和工具等可编写脚本的逻辑组件,以及访问诸如 Windows 注册表、安全 API 和事件日志等 Win32 API 特性。Jawin 包括一个用于可编写脚本的 COM 组件的代码生成器。该代码生成器读取类型库,并自动产生从 Java 应用程序调用该组件所需要的 Java 存根(stub)。
Stryon i-HUB
Stryon Corp. 在其 iHUB 服务器产品中提供了许多技术,允许 Java 和 J2EE 应用程序访问现有的 Windows .NET 和 COM 应用程序。iHUB 还包括一个 Java 到 COM+ 的桥接中间件,它将 Microsoft ActiveX、DLL 和 COM+ 与运行在支持 Java 的平台上的 Java 应用程序联系起来。使用 Java2COM 桥接,Java applet 和应用程序能够支持现有的本机代码。
用户界面考虑因素
移植用户界面是从客户机-服务器转向基于 Web 的应用程序所面临的最大挑战。客户机-服务器应用程序通常具有丰富的用户界面,而这可能难于在基于 Web 的应用程序中重现。简单地尝试将每个屏幕改写为 Web 页面通常是徒劳无益的。一个很好的类比是使用逐个短语的字面翻译将一本书从一种语言翻译为另一种语言,这种方法通常会导致无法准确传达作者原意的译文。显而易见,更好的方法是使用新的语言来表达作者的本意。用户界面也是如此:如果使用 Web 设计的非常好的实践而不是使用屏幕到 Web 页面的简单映射来设计 Web 界面,这样移植到基于 Web 的应用程序的客户机-服务器应用程序会更好。下面让我们研究一些可用的 J2EE 应用程序用户界面选项。
基于 Web 的界面
大多数基于 Web 的应用程序都能够利用 Web 浏览器或基于浏览器的扩展(比如 MIME 处理程序和 Java applet)作为它们的界面。 这种方法的一个主要优点是,在客户机需要运行应用程序的任何内容都包含在浏览器中,或在应用程序运行时下载到本地,从而使得应用程序易于管理。具有 Web 浏览器用户界面的应用程序可以使用 Java Servlets、JSP 技术、HTML 以及 JavaScript 来编写。
Java Server Faces(JSF)是一个相关的规范,它允许 J2EE 提供商为基于 Web 的 J2EE UI 开发提供拖放功能。它还允许厂商开发可供他们的开发工具使用的自定义组件。要看到 JSF 的实际应用,可考察一下 WebSphere Studio 5.11 版中的系列工具(请参阅 参考资料)。WebSphere Studio 有一个名为 Page Designer 的完全集成的工具,可以使用它通过拖放操作来可视化地开发 HTML 页面和 JSP 页面。Page Designer 已实现了 JavaServer Faces 规范,并且允许您将诸如 HTML 表单元素以及更高级的组件(这些组件允许您将 HTML 表格绑定到后端数据源)之类的内容拖放到页面上。
从这里开始了解 Web 界面设计须知:
useit.com
Jakob Nielsen 是公认的 Web 用户界面设计专家,他在这个站点上提供了丰富的信息 -- 包括非常好的实践。您还会找到指向他关于这个主题的书籍和文章的链接。
从这里开始了解关于 JavaServer Faces 的更多信息:
JavaServer Faces 主页
从 Sun 获得关于 JSF 的官方信息。
Magical Web Interface Development
这篇文章展示了如何提供基于服务器的强大能力和构建基于 Web 的用户界面的灵活性,以使得组件与您的业务对象保持同步。
Developing JSF Applications using WebSphere Studio V5.1.1 -- Part 1
这篇文章提供了 JSF 开发的实际练习。
JSF Central
这是一个 JavaServer Faces 社区站点,它允许访问用于开发 JSF 相关技术的资源。
Applets
applet 是缩微的 Java 应用程序,用户从网络上下载它们并在浏览器中执行。applet 通常被认为是不受信任的,因为它们匿名地通过网络发送,并在一个安全的、受限制的“沙箱(sandbox)”中执行,这个沙箱将它们与当前浏览器会话之外的本地系统的所有部分隔离。然而,创建者可以对他们的 applet 签名,并且浏览器用户可以允许来自受信任的提供商的经过签名的 applet 拥有特权 —— 比如访问本地文件系统和其他资源,这些特权通常与完整的 Java 应用程序联系在一起。
applet 最初在 Java SDK 的第一个版本中是使用原先的窗口工具包来实现的。Java 2 SDK 引入了允许 applet 使用 Swing 组件而不是使用原先的窗口组件的能力,从而赋予它们更好的响应能力和平台无关的外观。
浏览器“帮助程序”
Java applet 的一种替代技术是浏览器帮助程序和 MIME 类型处理程序。当基于浏览器的 GUI 需要访问文件和资源,而 Web 浏览器又不能在本地输出(可视资源)或“播放”(媒体类型)时,这些技术就可能很有用。这样的例子包括专用的可视化格式的应用程序内容,比如地图、电子表格、字处理文件类型(Adobe Acrobat、Microsoft Word、Lotus WordPro,等等)、诸如 PostScript 等设备类别相关的文件、诸如视频、音频、语音等多媒体,以及应用程序相关的格式(可以是任意格式)和诸如外部应用程序安装程序、软件清单实用程序、病毒扫描工具、金融或税务软件格式等功能。
从这里开始了解关于浏览器帮助程序和 MIME 处理程序的更多信息:
Extending the Browser with Plug-ins 这篇文章介绍了插件、客户机 Java 编程、客户机脚本编写,以及 DOM 和 dHTML。
Web 服务
Web 服务提供了将客户机-服务器 Windows 应用程序移植到 J2EE 的替代方法。Web 服务是自包含的、模块化的应用程序,您使用标准的 Internet 和 XML 技术来构建它们,并描述和发布到网络上以供其他程序使用。Web 服务是分布式系统演进过程中的下一步。它们允许企业使其资产可在全球范围内通过 Internet 访问,并且通过开放的 Internet 协议动态地连接和执行事务。
通过使用诸如 SOAP 这样的 Web 服务标准,您可以保留当前的 Windows 用户界面,并使用 Web 服务来访问基于 J2EE 的业务逻辑。使用这种方法,你需要使用 J2EE 标准来改写业务逻辑,以利用基于服务器的 J2EE 代码的平台无关性、远程访问以及可扩展性,同时保持 Windows 客户机界面不变,从而最小化对终端用户的影响。
从这里开始了解关于 Web 服务的更多信息:
Speed-start Web services
Speed-start Web services 计划拥有包含 IBM 的最新软件开发工具和中间件(试用版)的 DVD、大量的在线教程和文章、实用的研讨会和技术简报,以及由 IBM Web 服务专家主持的在线讨论论坛以帮助回答您的问题。
Java 客户机接口
如果需要保持应用程序的丰富外观和感觉,又要使其能在各种各样的操作系统平台(比如 Linux)上运行,那么您应该考虑为 J2EE 应用程序构建一个 Java 客户机界面。然后应用程序就能够利用像 RMI 这样的标准 API、Web 服务 和 EJB 技术,与 J2EE 服务器代码以及诸如文件访问、网络、多媒体和图形窗口功能等系统服务交互。
这种方法要求您或者通过手工过程,或者通过集中管理的自动化分发或共享机制,向用户分发应用程序的初始版本和后续更新。(使用 applet、Web 浏览器插件和 MIME 类型“帮助程序”的基于“瘦客户机”浏览器的界面通常更容易管理,因为代码下载是在每次代码被激活时从 Web 服务器下载的。)
从这里开始了解关于 Java 客户机应用程序的更多信息:
" The Java 2 user interface"
这篇 developerWorks文章探讨了 JFC/Swing 的各种特性,包括可插入的外观和感觉特性、拖放支持、Java 2D 图形支持、音频 API、辅助特性、使用 AWT Robot 的自动化事件,以及媒体支持(包括 3D 图形、高级图像处理、Java Media Framework,以及语音) 。
Eclipse.org
Eclipse 是一个基于 Java 的开放和可扩展的 IDE。遵循开放源代码范型,并具有一个提供免费源代码和全球再分发权的公共公开许可证,Eclipse 平台给开发人员提供了灵活性和控制能力。
" Using the Eclipse GUI outside the Eclipse Workbench, Part 1: Using JFace and SWT in stand-alone mode"
使用 Standard Widget Toolkit(SWT)和 JFace,您能够开发与本机应用程序紧密相似的独立 Java 应用程序。SWT 是一个窗口工具包,它具有一个与本机操作系统紧密集成的平台独立的 API。JFace 是一组建立在 SWT 基础上的实用工具,用于使得基于 SWT 编写 GUI 应用程序代码更加容易。SWT 和 JFace 都是开放源代码的 Eclipse 项目的组成部分,可用于将 Java 应用程序与独立应用程序中的本机平台组件(比如 ActiveX 控件)集成。标准 Java 用户界面和窗口系统(Swing)对于开发客户端应用程序用户界面来说是足够的和经得起考验的;然而,它缺乏本机应用程序所具有的外观和风格,而 SWT 则直接使用操作系统的本机窗口环境。
" 将 ActiveX 控件集成到 SWT 应用程序 -- 如何将 ActiveX 与 Eclipse 一起使用" 使用 SWT,您能够开发感觉和操作起来都像本机应用程序的独立 Java 应用程序。这篇 developerWorks展示了如何在独立的 SWT 应用程序中利用和集成 ActiveX 控件。
J2EE 应用程序的部署环境
J2EE 应用程序并不是直接在 Web 服务器器(比如 IIS 或 Apache Web 服务器)上运行。相反,运行它们的是一个称为 应用服务器的单独组件。应用服务器与您选择的平台上的选择的 Web 服务器和平共处。有各种各样商业化和开放源代码的应用服务器可供使用。您可以从以下这些资源了解其中两种应用服务器的更多信息:
Apache 软件基金会
Apache 是一个开放源代码的项目,它提供几种广泛使用的 Web 部署技术。这其中包括一个 Web/HTTP 服务器(Apache Web Server)和一个 servlet 容器/JSP 处理器(Tomcat)。Apache Web Server 自从 1996 年 4 月以来一直是 Internet 上最流行的 Web 服务器,现在它比其他所有 Web 服务器加起来都还使用得更广泛。Tomcat 是 Java Servlet 规范和 JavaServer Pages 标准的官方参考实现中所使用的 servlet 容器。
WebSphere Application Server V5.1 - Express
IBM 提供了一个管理简单而又动态的 Web 站点的高本益比的现成解决方案,它具有一个简化的基于 J2EE 的 Web 应用程序服务器和一个基于 WebSphere Studio 的开发环境。
WebSphere for newcomers
这个路标图介绍了 IBM WebSphere 系列产品,还提供了帮助您开始使用 WebSphere 产品来开发和部署 J2EE 解决方案的参考资料。
结束语
我们希望本路标图为您提供了相关任务和技术的有用概述,从而帮助您将客户机-服务器 Windows 应用程序移植到 Java 和 J2EE Web 应用程序。