ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Swing 或 JavaServer Faces:究竟选择哪一个?

Swing 或 JavaServer Faces:究竟选择哪一个?

原创 Linux操作系统 作者:dvlue 时间:2009-07-21 10:04:00 0 删除 编辑

作者:Frank Nimphius 和 Duncan Mills Oracle ACE

AJAX 和 JSF 是 UI 开发唯一的未来发展方向吗?Swing 能否经受住富互联网应用程序宣传热潮的考验?

2006 年 3 月发布

 

J2EE Web 技术已经从一个静态的内容提供环境迅速发展为一个在内联网和互联网上运行的动态业务应用程序的可靠平台。Web 的前景体现在,无论您的业务需求如何,浏览器都将是您未来唯一需要的客户端。在这种趋势的推动下,最近掀起了新一轮围绕高度交互的 Web 界面(基于一组称作 AJAX 的技术)的宣传热潮。AJAX 与新 J2EE 标准 JavaServer Faces (JSF) 的结合使用在处理 Web 应用程序方面有望提供更好的最终用户体验和认可。

AJAX(异步 Javascript+XML 的缩写)描述了一组现有技术(如 JavaScript、XML 和文档对象模型 (DOM))的使用模式。不可否认的是,AJAX 和 JavaServer Faces 来势迅猛,并将很快挡住 Swing 的去路,而 Swing 自 1998 年以来一直是用 Java 构建丰富用户界面的标准方法。浏览器将在未来唱主角?Swing 能否经受住富互联网应用程序宣传热潮的考验?

本文针对 Swing 和 JavaServer Faces 进行了介绍、定位和比较,以帮助开发人员决定对某种作业使用哪种技术。此外,本文还介绍了 Oracle 应用程序开发框架 (ADF) 如何有助于简化使用这两种技术进行的应用程序开发。

从 Java 到 Swing 再到 JavaServer Faces

应用程序开发史中曾出现过许多编程语言。早在 1991 年,James Gosling 发明了“Oak”,即 Java 的前身。由于 Oak 无法出售,因此 Sun 于 1995 年推出了 Web 编程语言 - Java,此后不久 Java Applet 即成为 Web 应用程序开发的这个“石器时代”的主导技术。

1998 年发布了用于开发轻型 Java Web GUI 和客户端桌面应用程序的 Java Swing 平台。一年以后,Sun 推出了 Java 2 企业版 (J2EE) 平台,该平台在 6 年后引入了 JavaServer Faces。

Swing 本身是一个基于抽象窗口工具包 (AWT) 和 Java 基础类 (JFC) 构建的轻型组件集。从推出到现在的七年多时间里,Swing 程序包已经成为 J2SE 中一个非常成熟的 Java 库,并广泛用在企业级业务应用程序的构建中。

Swing 以灵活而强大的开发环境著称,它为应用程序开发人员提供了大量的控制权。毫不夸张地说,只要是可以用 Java 构思的应用程序,就可以用 Swing 构建它。但 Swing 的灵活增加了复杂度和学习难度。类似 Oracle JDeveloper、NetBeans 和 IntelliJ 这样的 Java IDE 为 Swing 提供了可视的 4GL 编辑环境,有助于开发人员快速入门并执行更深层次的操作,而不必深入学习 Swing。

2004 年 3 月推出的 JavaServer Faces(也称作 JSF,或简称为“Faces”)是一个用于构建 Web 应用程序的基于组件的框架,该框架并入了 JavaBean 事件模型,用于将信息发送到其他组件。作为 J2EE Web 技术的发展,JavaServer Faces 将基于模板的编程式 Web 开发与 4GL 类型的开发选项结合在一起。

J2SE Swing 体系结构

尽管 Swing 是 Java 标准版 (Java SE) 的正式部分,但它并不是核心 Java 语言的成员,而是被视为一个标准扩展。以 javax.swing 而非 java.swing 开头的 Swing 程序包名称也反映了这一点。使用 Swing 开发的应用程序在 Java 运行时环境 (JRE) 中执行,该环境可以安装在本地桌面客户端中,也可以集成到 Java Web Start 或 Web 浏览器中。

所有 Swing UI 组件均为 JavaBean,并采用对象模型控制器体系结构,将数据表示与对数据的操作分离。该模型不包含任何 UI 特定的代码,反之亦然。模型与 UI 之间的所有信息交换均通过 JavaBean 事件和监听器进行。这种职责划分使经验丰富的 Swing 开发人员能够自定义组件 UI,而不必更改组件行为。Swing 中的组件控制器和视图称作 UI 代理。控制器将用户交互指派给模型,并由模型保存组件的状态。


图 1:Swing 体系结构


Swing 中的 UI 组件可在运行时通过属性方法或在设计时通过可视编辑器以编程方式进行控制。并非 Swing 中的所有组件均绑定到数据,某些组件(如按钮)只需要处理 GUI 状态。

UI 组件中的事件通过注册的 JavaBean 监听器(如 MouseListener、FocusListener 或 ChangeListener)进行检测。

ADF 与 Swing

Swing 始终存在的难题之一是如何将组件绑定到动态数据。过去,有许多不同框架已经通过非标准方法多次解决了这一难题。

而作为 JSR-227(用于解决此数据绑定难题的建议标准)早期采用者的 ADF 以及 ADF Swing 采用标准方法将 Swing 应用程序绑定到所有业务服务,如 Enterprise JavaBeans、TopLink、Web 服务、ADF 业务组件以及 URL。

ADF Swing 是一个将 Swing 域模型绑定到 Oracle ADF 绑定的小型 Java 层。ADF Swing 开发人员采用声明方式将组件模型设置为 ADF 绑定中的有名引用。ADF 中的数据控件将一致的客户端开发 API 公开给不同的业务服务,以便 Swing 开发人员使用。数据控件采用标准方法来创建、删除和插入数据,并采用标准控件来导航数据集。ADF 绑定将一个可以从数据控件访问的较小的数据子集公开给 Swing 应用程序面板或框架。

Swing 开发人员无需了解应用程序构建所基于的业务服务,这是因为他们不再处理特定的模型 API。同样,他们并不负责资源查找或类似任务。所有这些任务均由 JSR-227 实现处理,该实现提供了一个有效的控制反转机制。

由于 ADF Swing 应用程序开发在很大程度上是一个使用 ADF 执行的声明任务,因此它缩短了新手和 Java 专家的应用程序开发周期。例如,UI 第一绑定使项目团队可以轻松地进行快速原型设计。可以采用概念验证的方式创建 UI 的非绑定版本,然后采用回溯方式将其绑定到服务。


图 2:ADF Swing 体系结构

JavaServer Faces

JavaServer Faces 是 Web 应用程序开发中的一个里程碑,它将成为 J2EE 5.0(SUN 最近将其重新命名为 JEE 5.0)中核心 Java 企业版平台的一部分。JavaServer Faces 可以作为独立的 Servlet 在 J2EE1.4 应用服务器中使用。

Web 并非为需要事务和状态处理的业务应用程序而设计。多年来,开发人员花费了大量时间使用各种技术(如隐藏的 HTML 域、cookie、URL 或会话参数)来跟踪 Web 应用程序的状态,而这样做仅仅为了克服 HTTP 协议无状态这个问题。JavaServer Faces 有助于开发人员重新关注应用程序的业务要求,而不再关注基础的交付技术。JavaServer Faces 是一个 UI 框架,它对应用程序开发人员隐藏了 HTTP 请求 – 响应循环的细节。

与 Swing 中的 JavaBean 体系结构相似,JavaServer Faces 使用通过属性公开状态和行为的 UI 组件来构建 Web 界面。尽管 JavaServer Faces 页面通常汇集在 JSP 文件中,但这并不是必需的。JSF 这项技术并非只可用于基于浏览器的应用程序,同时也可用于构建移动应用程序。JavaServer Faces 中的 UI 组件是显示不可知的。这意味着应用程序开发人员并不构建针对特定设备的应用程序,而是构建可以在许多设备上运行的应用程序。JSF 中的 UI 组件呈现器类(打包的呈现器集的一部分)决定 UI 的可视化表示。如果初始应用程序请求来自 Web 浏览器,则该表示采用 HTML 格式,否则应用程序将按照请求客户端设备所支持的方式呈现(假设该设备类型存在一组呈现器类)。

类似文本域这样的 UI 组件通过 ExpressionLanguage (EL) 值绑定绑定到 (JSF) 管理的 bean 模型上。在值绑定中,EL 用于引用辅助 bean 中的 setter 和 getter 方法对。例如,EL 表达式 #{users.firstname} 将 JSF 组件绑定到用户 bean 中的 setFirstname 和 getFirstname 方法上。EL 绑定另一个可能的形式是方法绑定。方法绑定引用受管理 bean 中的方法,并在 JSF 中(就像在按钮中一样)用于将操作属性绑定到视图层逻辑,以便在复杂导航情形下或者在需要导航前和导航后处理的情况下执行。


图 3:JavaServer Faces 体系结构

受管理 bean 的另一个角色是将 UI 组件绑定到域数据,例如访问 JDBC 查询的结果集或查找 Enterprise JavaBean (EJB) 会话。此外,页面上的 UI 组件可能在辅助 bean 中包含一个用于以编程方式访问的表示。

Oracle 应用程序开发框架 (ADF) 和 JavaServer Faces

Oracle JDeveloper 10.1.3 支持通过可视编辑器进行 JavaServer Faces 开发。此外,Oracle ADF 可用于通过声明方式将 JavaServer Faces 和 ADF Faces 组件绑定到业务服务数据。正如在 Swing 的上下文中介绍 Oracle ADF 时所指出的,使用 Oracle ADF 绑定为 JavaServer Faces Web 应用程序开发人员提供了一个统一的开发 API,用于访问 Web 服务、Enterprise Java Bean、TopLink、POJO、ADF 业务组件以及其他类型的业务服务。

ADF Faces 是一组基于 JavaServer Faces API 构建并可以部署到任何 JSF 实现(如由 Sun 或 Apache MyFaces 提供的参考实现)的 100 多个 JSF UI 组件的总称。除了适用于浏览器客户端的 HTML 呈现器工具包以外,ADF Faces 还为在 telnet 客户端、移动设备和 PDA 上显示的 Web 应用程序提供了呈现器,并支持作为显示不可知 Web 应用程序开发环境的 JavaServer Faces 的强大功能。

为将 ADF 与 JavaServer Faces 应用程序集成,表达式语言值绑定访问 ADF 绑定对象,而非辅助 bean 中的数据。ADF 绑定对象(默认情况下名为“bindings”)由 ADF servlet 在应用程序初始化过程中创建,并使开发人员能够访问通过 ADF 数据控件和绑定层公开的所有集合和方法。

要以编程方式引用和使用辅助 bean 中的 ADF 绑定对象,可以通过 faces 配置中的 ExpressionLanguage 表达式 #{bindings} 访问绑定对象并将其作为受管理属性的值注入到辅助 bean 中。


图 4:使用 ADF 的 JavaServer Faces 体系结构


 

履行富互联网应用程序的诺言:AJAX 和 ADF Faces

对于并非熟悉 Javascript、XML 或文档对象模型 (DOM) 等 Web 技术的开发人员而言,AJAX 易于理解但却难于实现。对于业务应用程序而言,仅当在 JavaServer Faces 这样的 Web 应用程序框架中以“现成方式”在组件中使用时,AJAX 才有意义。

ADF Faces 提供了部分页面呈现和对话框支持,使开发人员能够构建更好的 Web 客户端。作为一个早期实现的 AJAX,部分页面呈现缩短了客户端的响应时间,因为它减小了只需刷新页面的某些部分的网页的下载大小。

ADF Faces 的未来发展方向是提供一组利用 AJAX 的富互联网组件,以便 Web 应用程序开发人员能够构建响应性和交互性较高的 Web 客户端,而不必编写 JavaScript. 或 DHTML 代码。在 JavaOne 2005 召开期间首次展示了 ADF Faces 富互联网应用程序客户端的预览版本。

在什么场合使用什么技术?

当决定对新应用程序开发使用哪种技术时,应用程序的要求(而非各种技术的功能)是一个不错的指标。以下是对两种技术的简要分类比较

  • 开发:主要的 Java IDE 支持对 Swing 和 JavaServer Faces 进行可视开发。开发 JavaServer Faces 应用程序时,开发人员可以获得很多好处而不必编写 Java 代码。
  • 组件:Swing 和 JavaServer Faces 均基于组件,并将 JavaBeans 用于其 UI 组件。还可以创建在应用程序中使用的自定义组件。
  • 页面和布局:Swing 中的布局通过嵌套 Swing 面板定义。Swing 组件的位置及其调整大小的行为通过 LayoutManagers 确定。同样,在 JavaServer Faces 中,布局通过容器(如 ADF Faces 中的 PanelPage 和 PanelBox)定义。每个容器可以有很多个子组件,而其中的每个子组件本身也是容器。尽管使用 HTML 表格安排 JSF 应用程序的布局可能比较吸引人,但在处理 JSF 应用程序时建议您不要混合使用多技术。
  • UI 响应性:AJAX 更适合于 Web 应用程序,它可以根据提供的输入或模型层中引发的事件向用户立即提供反馈。Swing 用户界面具有高响应性,并可以刷新屏幕上的特定区域而不用刷新整个屏幕。例如,股票应用程序可以向 Swing 应用程序发送有关已更改值的信息,无需重新查询即可将该信息显示给用户。
  • 更新、插入和删除:Web 模型基于 HTTP 协议,该协议并非为事务应用程序和动态业务应用程序而设计。JavaServer Faces 自动处理 Web 开发人员以往所面临的大量问题,但在处理多行更新方面,有时仍需要开发人员亲自操作。而在 Swing 中,多行操作对于应用程序开发人员(如使用 ADF Swing 的开发人员)而言比较简单。
  • 外观: Swing 支持动态外观类,这些类在应用程序启动时向其应用特定颜色方案。更改应用程序外观不需要更改应用程序代码。JavaServer Faces 使用样式表显示不同的用户外观。此外,Oracle ADF Faces 还提供了一个称作“换肤”的特性,其作用与 Swing 中的外观类相似。
  • 国际化:这两种技术均支持使用资源包进行字符串翻译。JavaServer Faces 包含客户端上的浏览器设置中的首选用户语言,而 Swing 应用程序根据 Java 运行时环境中的区域设置确定语言。JavaServer Faces 和 Swing 均可以编程方式设置语言,以便应用程序用户可以从应用程序中选择一种翻译。
  • 事件模型:JavaServer Faces 和 Swing 组件均使用 JavaBean 事件模型发布有关模型或组件更改的信息。相关各方可以使用 JavaBean 监听器注册事件,如值更改事件、属性更改事件或阶段事件。
  • 键盘快捷方式:尽管这两种技术均支持键盘快捷方式,但由于 Swing 并不依赖于浏览器,因此在这方面优势比较明显。所有键盘功能均由 Swing 处理并可以由应用程序开发人员控制。
  • 桌面集成:安装到本地的 Swing 应用程序拥有客户端桌面的完全访问权限。JavaServer Faces 通过上载和下载文件只提供有限的桌面集成。
  • 导航:Swing 只具有编程式导航功能,而不存在为 Swing 标准(定义应根据操作输出显示哪个面板)定义的外部控制器。JavaServer Faces 使用一个控制器组件,可以根据计算输出使用指定的导航示例对其进行配置。导航可以定义为操作组件的静态字符串,而对于更复杂的导航,则可以用 Java 表示。
  • 应用程序控制:与导航相关,相对于在 JavaServer Faces 中而言,应用程序开发人员可以更好地控制客户端中的 Swing 应用程序。用户在 Java 运行时环境中运行 Swing 应用程序,而这并不会因为(例如)工具栏不是应用程序本身的一部分而引起冲突。在浏览器中运行的 JavaServer Faces 应用程序总要求开发人员解决已知的浏览器限制。如今,没有使应用程序开发人员能够关闭不需要的浏览器行为或功能(如浏览器后退按钮或浏览器保留的键盘快捷方式)的通用浏览器标准和一组通用 API。
  • 性能:对于执行数据密集型操作的应用程序而言,JavaServer Faces 的性能似乎要高于 Swing,这是因为它只显示对客户端的更改。使用 AJAX,所需的下载大小将变得更小,从而性能将得到进一步的提高。尽管 Swing 可以使用远程服务器上部署的业务逻辑,但这需要使用远程方法调用 (RMI),该调用的性能要低于 JavaServer Faces 模型。但应始终针对单个应用程序来分析网络性能,并应在可能的用户界面中考虑应用程序的要求。
  • 安全性:JavaServer Faces 集成了声明式 J2EE 安全性,从而易于保护 Web 应用程序以及与一次性登录集成。Swing 更难于保护,且将基于 J2SE 权限的安全性与需要更多专业技能的 Java 验证和授权服务 (JAAS) 结合使用。
  • 部署:JavaServer Faces 部署到 J2EE 容器并从 Web 中进行访问。该部署的体系结构既可以是两层的(其中的业务逻辑层与视图层位于同一服务器上)也可以是三层的。Swing 通常部署到本地客户端上,或通过 JavaWeb Start(J2SE 中一个基于服务器的软件管理选件)进行部署。对于 JavaServer Faces 而言,使用 Oracle Application Server Control 或相似的管理控制台可以使部署变得更简单、更易于管理。

综上所述,如果应用程序要求对用户输入或更改用户显示的事件立即做出响应,则应使用 Swing。这对在一个屏幕上显示多个主/从相关性的复杂用户界面也是如此。此外,与 Web 相比,Swing 还可以为需要执行即时项目验证的应用程序(可能基于复杂的逻辑)提供更好的支持。使用 Swing 的另一个重要原因是需要不仅能文件上载和下载的桌面集成。此类集成的例子有本地打印机访问、对电话或扫描仪等外部设备的访问。此外,与 Web 技术(其中封闭浏览器使用某些键盘组合)相比,Swing 可以为需要定义其自身的键盘映射的应用程序提供更好的服务。在构建 Swing 应用程序时,其他浏览器功能(如可能妨碍业务控制的应用程序导航的浏览器后退按钮)不会成为问题。某些业务要求应用程序脱机运行(即与网络断开连接),您可以根据此要求来构建 Swing 应用程序。最后,Swing 应用程序只使用一种语言开发,而 JavaServer Faces 混合使用 Java、XML 和 ExpressionLanguage 等技术。

如果需要可以从任何位置(不要求安装客户端)访问应用程序,则应使用 JavaServer Faces。这包括可能为 PDA、移动电话和 telnet 客户端等显示设备提供的支持。与 Swing 不同,JavaServer Faces 可以通过防火墙(使用 HTTP 或 HTTPS 来保护客户端-服务器通信)进行轻松的运行。由于逻辑在服务器上执行,因此 JavaServer Faces 更易于部署并需要更少的客户端资源。如今,互联网应用程序已得到普遍使用,因此您可以假设应用程序用户熟悉 Web 应用程序的外观和使用。这降低了用户在使用新应用程序时的学习难度。安全性是使用基于 Web 的 JavaServer Faces 应用程序的另一个重要原因。尽管可以使用 JAAS 构建安全的 Swing 应用程序,但构建与服务器上容器管理的安全性和一次性登录集成的基于 Web 的应用程序则更为简单。此外,与在 Swing 中相比,在 JSF 中更容易实现需要将其中的身份发送到其他组件或应用程序的安全性集成。但您应该知道的是,将 JSF 与 AJAX 结合使用是基于 Javascript(需要浏览器支持)的。

将来,Swing 技术如今具有的优点将逐渐消失。例如在美国,宾西法尼亚和旧金山两座城市已经启动了一些在整个城市提供无线访问的项目。一旦世界上的其他国家/地区采用了该模型,那么在断开连接模式下工作(Swing 当前的优点)将不再必要。有关 Swing 逐渐失去优势的另一个例子是 AJAX 有望为 Web 应用程序带来的即时客户端显示响应这一优点。

有选择的生产效率:是否只须学习一种技术?

成功开发 J2EE 应用程序需要 J2EE 框架和 Java IDE,它们尽量对应用程序开发人员隐藏复杂性,同时还实施了最佳的编码实践。

一项互联网工作招聘快速调查显示,Web 应用程序开发人员的就业市场远远大于 Swing 应用程序开发人员。因此,在理想情况下您需要学习的一门技术是 Web 应用程序开发,其中包括 JavaServer Faces、AJAX 和 JavaServer Pages。

在需要开发 Swing 应用程序时,如果将 Oracle 应用程序开发框架和 Oracle JDeveloper 与 Swing 结合使用,则 Web 应用程序开发技术就足够了。

Oracle JDeveloper 是一个支持 J2EE 桌面和 Web 应用程序的集成 Java IDE。使用 Oracle 应用程序开发框架,应用程序开发人员无须再学习如何使用不同的 API 来访问各种持久层技术,使用一个一致的 API 就可以了。

使用 Oracle ADF,Web 应用程序开发人员可以在设计时和运行时使用与 Swing 应用程序开发人员构建 Java 桌面应用程序所使用的同一组元数据文件。由于提供了相似的开发环境,因此 Swing 应用程序开发人员将发现开发 Web 应用程序其实比较简单,反之亦然。因此,如果您必须只学习一种技术,则建议您最好学习如何使用 Oracle 应用程序开发框架开发 Web 应用程序。

总结

JavaServer Faces 与 AJAX 的发展过程就像人类学习走路一样,是一个渐进的过程。Web 应用程序最初以静态界面形式出现,现在已经逐步演变为一个动态应用程序平台。AJAX 只不过是需要在其最具有意义的环境 - JSF 中实现的下一个逻辑步骤。拥有富互联网客户端使开发人员可以选择使用适当的技术解决问题。

  • 富互联网应用程序 (AJAX)
  • 基于组件的 Web 客户端 (JSF)
  • 基于动态标记的 Web 客户端 (JSP)
  • 桌面集成客户端 (Swing)

AJAX 阐述了一种使 J2EE 应用程序开发人员能够将复杂的业务应用程序发布到 Web 的可能。作为 Swing 开发人员,您不必在意围绕 AJAX 展开的宣传热潮,但应在意它的动机。宣传是为了推广新机会,而这正体现了 JavaServer Faces 和 AJAX 的本质:为应用程序开发人员构建富 Web 应用程序提供新机会。

Swing 是为客户端桌面开发 Java 应用程序的标准方法,并且它要解决的开发问题与 JavaServer Faces 和 AJAX 不同。它通过 Community Process 以及 Sun(它还领导了 Java 桌面网络组件 (JDNC) 项目)的努力得到不断发展和改进。

尽管 Swing 与 JavaServer Faces/AJAX 在功能上存在重叠,但两者并不直接竞争。为某项工作选择的技术必须解决您要解决的问题,而反之则不然。使用 Oracle 应用程序开发框架,开发人员可以灵活地选择相应的技术,以便使用一种基础技术集开发 Web 应用程序和桌面应用程序。

Frank NimphiusDuncan Mills 是 Oracle 开发人员工具部门的产品经理,两人均为 Oracle ACE。可以在 orablogs.com/fnimphiusgroundside.com/blog/content/DuncanMills 上阅读两人各自的网志。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7656893/viewspace-609776/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-06-26

  • 博文量
    45
  • 访问量
    98388