概念:Web 应用程序框架

主题

 

简介To top of page

在软件应用程序的实施期间使用应用程序框架,会有许多优点。框架提供一种可重用的基础结构,它可以处理多个应用程序中常见的许多实施细节,并有助于避免重新寻求和重新实施常见实施问题的解决方案。此外,框架通常遵守一种编程模型,该编程模型代表着一种针对构建具体应用程序类型的难题的有效解决方案。对于 Java 2 Enterprise Edition(J2EE)Web 应用程序,基于“模型-视图-控制器”(MVC)设计模式的框架被视为最佳,而其中 Struts 是最受欢迎的。最近,J2EE 标准委员会发布了 JavaServer Faces(JSF)规范,提出了具有更多好处的 MVC 框架。

本文档描述 MVC 设计模式的好处,并概述了 Struts 和 JSF 框架。该文档讨论它们的用途,列出它们的优点和缺点,并提供关于如何在它们之间选择的指南。最后,该文档还讨论了补充技术的集成,即,将 Service Data Objects(SDO)和 Enterprise JavaBeans (EJB)集成为一个使用这些框架的体系结构。

 

“模型-视图-控制器”设计模式To top of page

模型-视图-控制器(MVC)是一种将应用程序的用户界面与业务逻辑相分离的设计模式。其方式为将该应用程序的体系结构分为三部分:模型、视图和控制器。图 1 显示了应用于 Web 应用程序的 MVC 体系结构。

图 1:Web 应用程序的 MVC 体系结构

模型

模型表示应用程序的状态,并定义了修改它的业务操作(永久数据和业务逻辑)。可以向其查询其状态(通常由视图查询),并要求其更改(通常由控制器要求)。它对视图或控制器一无所知。

视图

视图用以表示模型。它代表应用程序的外观,即其用户界面。它负责从用户处收集数据并向用户展示数据。视图可以获取模型的状态,但不能修改。

控制器

控制器响应用户输入,并通知模型相应地更改其状态。具体来说,它处理传入的用户请求,将它们分派给(模型中的)相应业务逻辑功能并基于输出结果选择对用户的响应(视图)。

好处

MVC 设计模式将业务逻辑与表示相分离,这带来了以下好处:

  • 可维护性增强

    因为视图层和模型层是分开的,您可以更改用户界面而不会影响业务规则,反之亦然。因此,更改的影响得以最小化。

  • 模型可重用性

    您可以创建同一模型的多个视图。例如,如果您的应用程序需要支持不同的客户端设备类型(例如,手机和 PDA),则可以创建特定于每种技术的新视图并重用同一模型。

  • 职责分离

    开发角色可以分离,这样就允许开发团队的各个成员专注于他们的专项领域。例如,Web 页面设计人员可以负责视图层,并独立于 Java 开发人员而工作,后者则可专注于实施控制器层和模型层。

 

Struts To top of page

Struts 是一种允许使用 MVC 设计模式构建动态 Web 应用程序的应用程序框架。它是一组合作的 Java 类、Servlet 和 JavaServer Page(JSP)标签库的集合,可基于它构建基于 Sun J2EE Model 2 体系结构的应用程序的 MVC 实施:

  • 控制器层是由 Servlet 实施的。
  • 视图是使用 JSP 实施的。
  • 模型层通常是使用 JavaBeans 或 Enterprise JavaBeans 实施的。

体系结构To top of page

图 2 显示了 MVC 体系结构在 Struts 中的实施以及客户端请求的处理流程。

图 2:Struts MVC 体系结构和请求处理流程

控制器组件

Struts 的主要控制器组件包括 Front Controller Servlet、ActionServlet 以及 ActionForm 类和 Action 类。

  • ActionServlet

ActionServlet 收到一个 HTTP 请求,在模型上调用所请求的操作并选择要显示的下一个视图。这是该框架的核心。ActionServlet 类的一个实例接收所有传入的请求。ActionServlet 使用来自该 HTTP 请求的相应字段设置 ActionForm 的状态,可选地,要求它进行自我验证并将其传递给所映射的操作。使用配置文件(struts-config.xml)将请求映射到操作。

  • ActionForm

ActionForm 类代表了表单数据。ActionServlet 实例自动使用输入表单的值填充其属性,并将其传递到所请求的操作。ActionForm 也用于存储来自模型的动态数据,以由视图显示。

  • 操作

Action 类包含调用模型层的逻辑。当由 ActionServlet 执行时,它调用模型对象来执行业务逻辑,然后指示 ActionServlet 控制器的下一个操作。

模型

Struts 不指定对该模型使用哪种技术。但是,最常见的情况是,模型对象是使用简单的 JavaBeans 或更强大的组件(例如 Enterprise JavaBeans)来实施的。

视图

视图通常是使用 JavaServer Page 来实施的,以利用随该框架提供的 JSP Custom Tag 库。要显示的动态数据是从 JavaBeans 中检索的,或从由控制器层创建的 ActionForm 类的实例中检索的。定制标签是访问这些数据的主要机制。

好处To top of page

Struts 是一种由强大的开发人员社区支持的开放式源代码框架,其标准由 Apache Software Foundation 的 Jakarta 项目管理。这是一个诱人的选择,因为它不特定于任何供应商,并且在许多开发工具中都支持。除了作为基于 MVC 的框架外,Struts 的其它好处包括:

  • Struts 是以 HTTP 为中心的,并隐藏了低级细节 HTTP 请求处理。
  • 它不确定于模型,并允许开发人员选择在模型层中使用哪种技术。
  • Struts 的可配置性很高。XML 配置文件用于控制应用程序、用户输入验证和错误处理的流程。
  • Struts 通过使用标准 Java ResourceBundles 来支持国际化/本地化。
  • Struts 提供的以下特性将大大增强可重用性:
    • 一组丰富的 JSP 定制标签库,以处理诸如常规 Bean 操作、条件和迭代逻辑以及 HTML 呈示之类的常见任务
    • 一个“平铺”子框架,允许创建可重用的用户界面模板以控制布局并提升共用的外观
    • 通过 Struts-Expression Language(EL)对 JSP 标准标签库(JSTL)的访问权,以实现其它代码重用

局限To top of page

Struts 的局限包括:

  • Struts 的开放式源代码性质意味着它的支持依赖于开发人员群体。
  • Struts 具有“JSP 思维定势”,即,难以对视图层使用其它技术。
  • Struts 不提供用户界面组件和事件处理模型,以允许构建丰富的 Web 用户界面。

 

JavaServer Faces To top of page

JavaServer Faces(JSF)是一种允许使用用户界面驱动方法构建 Java Web 应用程序的应用程序框架。该技术提供一种基础结构,以使用在服务器上运行的标准用户界面组件模型来构建 Web 应用程序。其目标是减轻 Web 应用程序的开发负担,方法是简化编程模型并提升面向用户界面的事件驱动 Web 开发。

体系结构To top of page

JSF 是一个基于 MVC 的应用程序框架。它提供一个丰富的体系结构,用以定义用户界面组件、在服务器上管理它们的状态并处理客户端生成的事件。它还支持验证用户输入和控制页面导航。图 3 显示了 JSF 体系结构的主要组件,并描绘了客户端请求的处理流程。

图 3:JSF 组件体系结构和页面请求处理流程

FacesServlet

FacesServlet 是对 JavaServer Faces 页面的所有请求的进入点。它初始化了该框架为控制页面生命周期而需要的资源,并随后调用该页面处理请求。它充当该应用程序的前端控制器。

JavaServer Faces 页面

JavaServer Faces 页面是一个 JSP 页面,它包含的 JavaServer Faces 标签用以表达其包含的所有用户界面组件。每个组件都声明其值与 Backing Bean 属性的关联,并指定它需要的任何事件监听程序、验证程序和转换程序。该框架将自动使某一组件的数据与其关联的 Backing Bean 中的边界属性同步。

用户界面组件树

JSF 页面中的用户界面组件在服务器上表示为一个组件树(也称为“视图”)。当框架处理一个请求时,即创建该树(对于初始页面请求)或从该树的已保存状态恢复(对于随后的页面请求)。

验证程序

验证程序用于验证用户输入。JSF 包含许多标准验证程序类,并支持创建定制的验证程序类。

Backing Bean

Backing Bean 是一个 JavaBean,它存储 JSF 页面用户界面组件的数据,并实施支持其行为的方法。这些方法通常包括执行事件处理、验证和导航控制的逻辑。Backing Bean 通常从模型对象调用方法来执行业务逻辑。JSF 允许您声明 Faces 配置文件(face-config.xml)中该页面使用的所有 Backing Bean,这样它们将自动在应用程序启动时由 Web 容器实例化(这些 Bean 被称为 Managed Bean)。该配置文件还指定了与 Backing Bean 中的导航控制逻辑协同工作的页面导航规则。

事件监听程序

事件监听程序是一个用户定义的类,旨在处理特定类型的组件生成事件。JSF 支持三种事件:更改值的事件(例如,用户更改了组件的值)、操作事件(例如,用户单击了按钮)和数据模型事件(用户选择了数据集中新的一行)。

呈示程序包

呈示程序包是一组针对特定客户端类型的呈示程序。呈示程序是生成适当输出以在特定客户端设备上显示用户界面组件的类。JSF 提供一个标准的 HTML 呈示程序包,它生成 HTML 以显示组件,并允许您针对其它客户端类型生成您自己的呈示程序包。

转换程序

转换程序用于将对象转换为字符串来显示,以及从字符串转换为对象进行处理。它也用于应用格式化和本地化选择。

好处To top of page

JSF 是一个通过 Java Community Process(JCP)开发的、基于标准的框架,并将作为将来发布的 Java 2 Enterprise Edition(J2EE)规范的一部分。同样,它确立了构建 Java 服务器端用户界面的官方标准。其主要特点包括一个简化的编程模型,该模型允许开发人员以较少的精力和灵活的体系结构来构建 Web 应用程序,这种体系结构使应用程序逻辑与表现明确分离(由于其 MVC 本质)。这些特点带来了以下好处:

  • 快速的应用程序开发

    JSF 支持通过其简化的编程模型快速开发 Web 应用程序。开发人员很容易将可重用的用户界面组件组合为一个页面,将它们与应用程序数据源相连接,并将客户端生成的事件传递给服务器端的事件处理程序。该框架处理自动同步组件状态,并全面支持 Web 编程任务,例如验证用户输入、执行业务逻辑和控制页面导航。同时,越来越多的供应商为以直观方式使用 JSF 构建 Web 用户界面提供工具支持,以进一步提高生产力。

  • 可维护性

    JSF 按用户界面组件级别将表现与行为清楚地分开,这就使关注的问题得以分离并细致地提高可维护性:

    o 页面设计人员可以专注于使用标签显示组件,而 Java 开发人员实施其行为。完成后,它们就可以快速使用 JSF 的简单编程模型链接这些部分。

    o 对组件表示的更改不会影响其行为。例如,您可以选择新的标签来显示组件,而不需要更改“幕后”代码。

  • 灵活性

    JSF 不限制您使用特定的表示方法或标记语言:

    o JSF 的灵活呈示模型允许组件独立于客户端设备。组件可以通过使用生成不同标记语言的呈示程序以非 HTML 方式显示。因此,同一组件逻辑可以使用不同的呈示程序对多个客户端类型重用。

    o JSF 提供一个 JSP 定制标签库以在 JSP 页面上表示组件,但也允许您使用除 JSP 之外的表示方法。这是可能的,因为 JSF 方法是直接在 Servlet API 的基础上分层的。

  • 可扩展性

    JSF 的用户界面组件模型可以扩展,以创建定制组件。这允许您创建完善的组件(例如树和菜单),并为您的 Web 应用程序组件更丰富、更为用户友好的用户界面。

 

局限To top of page

JSF 的局限包括:

  • 它是一种新方法,将随着时间而继续改进。
  • JSF 不具备用以改进一致外观并允许将一个页面划分为几部分来分别处理的任何布局管理特性。
  • 在没有工具支持的情况下,手工进行 JSF 开发是很困难的。当将 IDE 与可视设计工具配合使用时,其 RAD 好处才真正得以实现。

 

框架选择指南To top of page

作为一种最佳实践,您应使用一种符合 MVC 体系结构的应用程序框架。Struts 和 JSF 都符合 MVC 体系结构,因此都是很好的选择。但当将它们进行对比时,很明显,它们有着重叠的功能。例如,它们都提供对输入验证、请求处理和页面导航的支持。您如何在这两者之间选择呢?表 1 列出了重要的框架特性,并比较了 Struts 和 JSF 对它们的支持。您可以将它用作指南,基于您需要的特性和提供最大支持的框架作出决定。

 

  Struts JavaServer Faces
编程模型
  • 表单处理样式
  • 事件驱动样式
UI 组件和支持
  • Struts-HTML 标签库中提供的简单 UI 组件
  • 所提供的、对 ActionForm Bean 的数据绑定
  • 丰富的 UI 组件
  • 可以创建更多定制组件
  • 支持将数据绑定到 Backing Bean 或任何模型对象
  • 提供事件处理支持
客户端设备独立性
  • 不支持
  • 呈示程序包提供设备独立性
错误处理和验证
  • XML 文件(validation.xml)驱动的验证框架
  • 具有许多预定义的验证程序的验证框架
  • 可以创建定制验证程序
脚本编制
  • 以 Java Action 类编写的脚本
  • 脚本仅可访问表单数据
  • 以 Backing Bean、Model 类或 Event Listener 类编写的脚本
  • 脚本可以连接到事件
  • 脚本可以访问 UI 组件及其数据
页面流程
  • 完善、灵活的框架
  • 基于 XML 文件
  • 完善、灵活的框架
  • 在 XML 文件(faces-config.xml)中配置
会话和对象状态管理
  • 手动
  • 自动

表 1:Struts 和 JSF 的特性比较

还请注意,该决策不一定是非此即彼的选择。您也可以使用由 Apache 项目开发的 Struts-Faces 集成库将这两种技术组合起来(请参阅#resources -- This hyperlink in not present in this generated website资源)。此库允许您在 Web 用户界面中将 JSF 组件与 Struts 控制器组件、操作和业务逻辑一同使用。

从长期来看,建议对于新项目使用 JSF,并将现有的 Struts 项目迁移到 JSF。这样做的理由可以归纳如下:

  • JSF 给 Web 用户界面带来了丰富性,这是用户长期以来一直期待而 Struts 没有提供的。
  • JSF 的简单编程模型提供较高程度的抽象,这提高了生产力。它允许您根据用户界面组件和客户端事件进行思考,而不是 Struts 中的基本“表单和字段”处理。
  • JSF 为构建 Web 应用程序提供一个完整的解决方案,并很容易与诸如 Service Data Objects 之类的新技术集成(请参阅#complementary -- This hyperlink in not present in this generated website补充技术)。
  • 强大的集成开发环境(IDE),例如 RAD 6.0,现在也支持 JSF。
  • JSF 以后将包括在 J2EE 规范中,这将导致许多供应商提供广泛的工具支持。

 

补充技术To top of page

本节着眼于以下技术如何能集成到 Struts 或 JSF 框架中,以生成强大并且完整的端到端实施解决方案:Service Data Object(SDO)和 Enterprise JavaBeans(EJBs)。

关于 EJB 技术的描述,请参阅“指南:Enterprise JavaBean(EJB)”

 

Service Data Objects To top of page

Service Data Objects 是编程模型的一种规范,允许以统一、独立于数据源并且断开连接的方式访问后端数据的。该模型允许从任何类型的数据源(关系数据库、EJB 实体 Bean、Web 服务、XML 数据源等)检索数据,并统一表示为一种结构化数据图(DataGraph)。SDO 允许独立于任何后端连接或事务检索 DataGraph,从而规定断开连接的操作。它仍是一个通过 JCP 作为 Java Specification Request(JSR)235 提交的建议规范。

体系结构

SDO 体系结构使用统一的数据访问层(Data Mediator Service)从各种数据源将 DataGraph 返回到客户端。图 4 显示了 SDO 体系结构的组件。

图 4:SDO 体系结构

DataObject

DataObject 存储实际数据(例如,关系数据库中的原值或数据行)以及可能的、对其它 DataObject 的引用。可对它进行内部检查,以确定其类型、关系和约束。

DataGraph

DataGraph 存储一组 DataObject,通常表示体系结构中各组件之间传送的单元。它记录对数据的所有更改,包括新建、更改或删除的数据对象。

Data Mediator Service

Data Mediator Service 负责与数据源交互,以生成表示数据的 DataGraph。原数据表示法由这项可插服务转换为 SDO 图形表示法。该 Mediator 还负责将 DataGraph 中的更改重新应用于数据源。

 

框架适用性To top of page

SDO 技术承诺对工具和框架的方便集成。在 JSF 和其它 MVC 框架的环境中,可以考虑以下两个解决方案:

从 UI 组件绑定到 SDO(JSF)

在 JSF 框架中,因数据检索起见,Web 用户界面组件的值可以声明绑定到 SDO。例如,一个 Data Table 组件可以绑定到一个 SDO,以从后端数据源检索其值。这种组合使数据容易从 UI 组件进行连接,而不需要任何编程。图 5 显示了将 JSF UI 组件绑定到 SDO 所生成的体系结构。

图 5:将 SDO 与 JSF 配合使用

模型对象到 SDO(任何 MVC 框架)

MVC 框架的模型层可以使用 SDO 访问后端数据。图 6 显示了使用 SDO 访问使用 Entity EJB 保存的数据的模型客户端示例。该模型对象使用由 Stateless Session EJB façade 返回的 DataGraph。此 Session Bean façade 反过来从 Mediator 检索 DataGraph,该 Mediator 充当基于 Entity EJB 的永久机制的数据 façade。

图 6:将 SDO 与模型对象和 EJB 配合使用

 

资源To top of page

以下链接提供与本文档中讨论的应用程序框架和组件技术相关的其它信息:

Rational Unified Process   2003.06.15