Spring Web Flow 2.0.0.RC1 发布了,增加了对 Ajax、JSF 和安全的集成

阅读数:1050 2008 年 4 月 23 日 00:07

InfoQ 与 Spring Web 团队的 Keith Donald 和 Jeremy Grelle 就 Web Flow 2.0.0.RC1 的发布进行了交流,这是 Web Flow 下一个主要版本的第一个产品发布候选。Web Flow 是对 Spring MVC 的一个扩展,用来在 Web 应用程序中实现流程

Web Flow 2.0 中有什么新特性?

Web Flow 2 中有很多重要的新特性,例如:

改良的 Ajax

首先,Web Flow 2 引入了 Ajax 事件处理能力。你只需像处理任何其它 Web Flow 事件一样来处理 Ajax 事件就可以了,在处理事件之后,你的流程可以请求刷新 UI 的特定片断或部分。你可以在我们的 Spring Travel 例子中看到对这种局部刷新的支持(当页面返回到查询结果表时,或者在 UI 上显示验证错误信息时都可以看到这种局部刷新)。

我们在对 Ajax 的支持上比较有意思的一点是,当客户端 Javascript 不可用时,我们进行了适当的处理。试着访问一下 Spring Travel 应用,并将 Javascript 关掉。这个应用程序依然能够工作。

因此我们的 Ajax 支持实际上包含了两个部分:Web Flow 结合服务器端来检测可以使用 Ajax 的客户端并根据请求进行局部展现;客户端,用于提交 Ajax 请求并将响应片断与页面联系起来。我们所提供的客户端叫做“Spring Javascript”,这是 Web Flow 分发包中的新模块,建立在 Dojo 1.1 之上,对 Ajax 及改进增强等等提供了一个干净、一致的 API。

与 Spring MVC 更深度集成

Spring MVC 和 Web Flow 是互补的:Spring MVC 是 Web 应用开发的基础平台,而 Web Flow 是一个 Controller 扩展,用来实现流程(也就是会话——conversations),它是跨多个请求的有状态的用户交互。

因此 Web Flow 2 加深了与流行的 Spring MVC 平台的集成。现在,在无状态 Spring MVC @Controllers 中调用 Flows 更加容易了,而且对于 Flow 的产出,现在也可以更方便地映射到 Controller 上。在充满“mvc”风味的 Spring Travel 参考应用中可以看到这一点,其中混合使用了 @Controller 和 flow。在参考应用中,网站的“shop”或搜索部分使用的是无状态的 @Controllers 来实现的,提供了完整的可书签化(bookmarkability)能力,订房功能使用的是有状态的 Web Flow,为每个窗口隔离了订房应用交易。配合得非常好。

重构并扩展了 JSF 集成

在 Web Flow 还是版本 1 的时候,你可能已经在“传统”JSF 应用里使用了 Web Flow,其中 JSF 的 FacesServlet 处于控制地位,Web Flow 试图通过使用 PhaseListener 和 NavigationHandler 来找到自己合适的位置。这对我们来说是一项艰巨的集成任务,而且曝露了不少难以解决的微妙问题,比如异常处理、并发性、安全性、以及持久性上下文管理。

在 Web Flow 2 中, JSF 和 Spring Web 之间的关系颠倒过来了。实际上,用控制反转来理解这一变化是最好的方式。现在,不是 Spring 去适应 JSF 了,而是 JSF 来适应 Spring,在我们熟悉的 Spring MVC DispatcherServlet 内使用 Spring MVC 和 Web Flow 扩展点来实现这一点。基本上,我们吸收了 JSF 的长处,即它的 UI 组件模型,并把它作为一种表现层技术带入到 Spring MVC 和 Web Flow Controller 模型中。这一集成方法立竿见影的好处是你可以重用所有现存 Spring MVC 基础架构,包括:你的 URL mappings、异常处理策略、Spring 安全性策略,而且你可以结合 JSF 组件快速构建 UI。这种方式可你让有机会使用所有当今可找到的 JSF 组件库,其使用方式对于有 Web MVC 概念背景的开发者来说非常自然。

人们可能会认为如果使用这么独特的集成方法,肯定会有些限制。但是到目前为止我们还没有发现。我们已经成功证明你可以在 Spring Web 环境下运行所有主流 JSF 组件库。另外,我们也建立了自己的称为“Spring Faces”的小组件库,其使用 Spring Javascript 提供了一套用于声明客户端校验和 Ajax Facelet 的标签。Spring Travel 参考应用的 faces flavor 展示了这一组件库的实际使用。

Spring 安全集成

Web Flow 2 引入了对 flow 的安全性支持。只需简单地注解一个 flow、state 或 transition 为“安全的”,SecurityFlowExecutionListener 就会确保当前用户具备启动 flow、进入 step 或发起 event 的权限。

更简单的流程定义语言

在 Web Flow 2 中你还将发现,用于定义 flow 的核心语言更加简单了。例如,对我们的 Spring Travel 参考应用来说,基于 Web Flow 1 的版本由大约 200 行流程相关的应用程序代码组成,这些代码分别位于 6 个不同的部件中。在最新的 2.0.0 RC1 版本中,其集成了更多功能,流程相关代码只有 93 行,分布在 2 个部件中,代码量减少了约 50%,需维护的文件数减少了 4 个。你可以自己去比较一下版本1 的中flow 版本2 中的等同配置

新的模块特性

我们也已将流程的概念扩展为一个“可重用、自包含的应用程序控制器模块”。现在,在默认情况下,一个流程和所有其所依赖的资源(如 views、messages 和 helpers)被打包在一起。按领域职责组织代码是最佳实践,在 Web Flow 2 中我们正尽力简化其使用。你可以从这个例子中看到这一点:在booking 目录里,流程用于支持国际化的views 和message bundles 被打包在一起。

这一版本的原则是什么?

我要说这一版本的主要原则就是易用。Web Flow 1 是一个拥有许多特性的成熟框架,但是 Web Flow 2 走得更远,它使用全面简化的流程定义语言使一些常见任务更加容易实现。集成是主旋律,我们提供了与 JSF、Spring Security、Unified EL、Spring Javascript、以及 Rich Faces 最好的集成。正如前面所提及的,我们与 Spring MVC 的集成也已经做了改进,我认为,Web Flow 2 重申了 Spring MVC 作为 Spring web 应用基础平台的重要地位,在其基础上可以插入其它扩展功能。

从 1.0 迁移到 2.0 有什么值得期待的重要变化?

对流程定义语言的简化是人们可以期待的。为了帮助用户从 1.0 升级到 2.0,我们在发行版中包含了一个 WebFlowUpgrader 工具,它可以自动把版本 1 的流程转换为新的版本 2 的语法。

至于完整的变化列表,我推荐所有 1.0 用户去查阅新的 reference guide 以及 2.0 的参考应用,参考应用展示了最佳实践。我们将保证我们的社区能尽可能愉快地升级到 2.0。

Spring Web Flow 有哪些支持工具?

Web Flow 定义工具是基于 XML 的,因此,你所需的首要工具是一个好的、schema 感知的 XML 编辑器。Web Flow 一般将应用程序行为委派给了 Java 领域模型和服务层,因此你需要一个好的 Java IDE。在此基础上, Spring IDE 项目提供了一个极好的 Eclipse 插件,允许你可视化配置 Spring Web 应用,而且还包含一个图形化的 Web Flow 编辑器。Spring IDE 团队现在正在专注于 Web Flow 2 配套软件的工作。Christian Dupuis,Spring IDE 和最近宣布的 SpringSource Tools Suite 的领导人,已经计划在五月份推出一个新的 Web Flow 2 配套软件。

SpringSource Tool Suite 为开发 Spring Web 应用提供了一个完整的集成开发环境,包括对 flow 的支持。我们的团队已经编撰了几个面向任务的教程和运行时错误分析,并作为该套件beta 版的一部分一起发布,将来我们还要提供更多内容。还有,最近宣布的 SpringSource Application Management Suite 将在其即将发布的 1.0.0.RC2 中为 Web Flow 执行引擎提供运行时可视化能力。

Wdb Flow 开发未来的焦点,2.1 版本的目标是什么?

对于 2.1 我已经有许多计划。声明模型校验是一个时髦的话题,我们将在 2.1 版中包含它。2.0 里,我们已经对回传(postback)提供了自动检测和调用模型校验器的支持,因此基础已经是现成的了。下一步是让校验约束能够针对模型进行声明,并且这些约束在客户端和服务器端都被强制要求。

我想你还能在 2.1 版本中看到我们使用脚本语言来定义控制流程的探索。构建在 Web Flow 2 引擎之上的 Grails,已经展示了基于Groovy 的流程定义语言是可行的,我们正在与Graeme 一起合作,将其GroovyFlowBuilder 合并回Web Flow。另外,我认为我们有机会将流程定义语言拓展到我所称的“站点定义语言”,这样你可以以声明的方式定义整个网站宏观结构,网站中的一些元素是流程。这一想法的灵感来自Jesse James Garrett 的 Visual Vocabulary ,我认为在这一领域有很多有趣的工作可以去做。

我们也在努力确保现在发生在 Web Flow 2 中的革新内容能够在有意义的前提下回归到 Spring 框架本身。比如,我们正在谋求把所有 Web Flow 和 Spring Faces 的 Ajax 特性带给那些使用 JSP 和 Tiles 的已有 Spring MVC 应用程序开发者。

查看英文原文: Spring Web Flow 2.0.0.RC1 Released; Adds Ajax, JSF, and Security Integration

评论

发布