亲爱的 Spring 社区:
我很高兴地宣布 Spring Web Flow Preview 4 (PR4) 已发布。此版本使 Spring Web Flow 与 Spring 1.2.2+ 版本保持一致。
这将是 Web Flow 的最后一个预览版;下一个版本将是 1.0 RC1。下载请访问:http://sourceforge.net/project/showfiles.php?group_id=73357&package_id=148517
注意:PR3 和 PR4 之间有一些不兼容的更改。其中包括根包名从 org.springframework.web.flow 重命名为 org.springframework.webflow,这表明 Web Flow 作为一个独立模块值得拥有一个顶级包。 有关完整的更改列表,请在此访问变更日志:http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Change+Log
致 WebFlow Portlet 用户特别注意:PR4 不包含 Portlet MVC 集成。 Portlet MVC 用户需要等待几周后的 Web Flow RC1 版本,届时 Portlet MVC 将集成到 Spring 1.3 中一起发布。对于由此造成的短期不便,我们深表歉意:预计在接下来的几周内,将恢复更好的 Portlet MVC 集成和示例应用程序。
此 PR4 版本包含许多新的和值得注意的增强功能。其中一些如下
状态进入动作
任何 State 类型的任何实例都可以配置一个进入动作,该动作将在进入该状态时执行。 这有助于实现通用的状态设置逻辑。例如,ViewState 可以设置一个进入动作来执行任意的预渲染逻辑。此类预渲染逻辑可以加载参考数据来填充表单下拉列表。 作为复合状态进入动作的一部分,任意数量的动作可以按顺序执行
<view-state id="displayCriteria" view="searchCriteria">
<entry>
<action bean="searchFormAction" method="setupForm"/>
<action bean="searchFormAction" method="setupReferenceData"/>
</entry>
<transition on="search" to="executeSearch">
<action bean="searchFormAction" method="bindAndValidate"/>
</transition>
</view-state>
TransitionableState 退出动作
任何 TransitionableState 类型的任何实例都可以配置一个退出动作,该动作将在退出该状态时执行。这有助于实现通用的状态清理逻辑。 可以再次指定多个动作,它们将自动封装在 CompositeAction 中。
<action-state id="executeSearch">
<action bean="searchAction"/>
<transition on="success" to="displayResults"/>
<exit>
<action bean="auditAction" method="logResults"/>
</exit>
</action-state>
Flow Execution Listener 标准
在 PR4 之前,没有简单的方法可以为一个流程定义集指定哪些监听器应该观察启动的流程执行。 新的 FlowExecutionListenerCriteria 提供了一种可插拔策略,可以根据每个请求计算给定 Flow 定义的执行所适用的监听器集合。
<bean id="flowExecutionManager"
class="org.springframework.webflow.execution.servlet.ServletFlowExecutionManager">
<property name="listenerMap">
<map>
<entry value="*">
<key>
<list>
<bean class="example.Listener1"/>
<bean class="example.Listener2"/>
</list>
</key>
</entry>
<entry value="sampleFlowA">
<key>
<list>
<bean class="example.Listener3"/>
</list>
</key>
</entry>
</map>
</property>
...
</bean>
上述 Spring 配置将 Listener 1 和 2 附加到所有流程 (*) 的执行中,而 Listener 3 仅附加到 "sampleFlowA"。
显著增强的表达式语言支持
此版本的一个真正优势是新的 Spring 数据绑定模块持续取得进展。 spring-binding 中包含一个表达式解析和评估抽象,它与强大的类型转换设施无缝集成。 这两者结合使用,可以将表示一个或多个表达式(例如 “Announcement: ${org} ${product} ${release} is out!”)的任意字符串转换为可评估的表达式,利用任何表达式语言,默认使用 OGNL。 Spring Web Flow 在多个地方利用了这套机制,包括重定向表达式、转换表达式和属性映射表达式
- 例如,对于针对请求上下文进行评估的重定向表达式
redirect:/${sourceEvent.parameters.url}?attribute1=${flowScope.foo}&attribute
2=${requestScope.bar}"
- 用于驱动动态状态转换决策的转换表达式
<transition on="${result == 'success' && ${flowScope.selectedItinerary.price} > 500.0" to="requireCreditCheck"/>
- 用于映射两个源之间属性的属性映射表达式
<subflow-state id="browseDetails" flow="detailFlow">
<attribute-mapper>
<input value="${sourceEvent.parameters.id}" as="someBean.id" from="string" to="long"/>
</attribute-mapper>
...
</subflow-state>
增强的属性映射器类型转换支持
输入和输出映射元素的“from”和“to”属性可用于指定类型转换规则。 因此,定义
<input value="${sourceEvent.parameters.id}" as="someBean.id" from="string" to="long"/>
表示
将 ${sourceEvent.parameters.id} 的值从字符串转换为 long,并将 long 结果设置到 someBean.id。
基于会话的 TransactionSynchronizer 策略
PR4 中新增了一个 TransactionSynchronizer,它在 HTTP 会话范围的存储中管理一个事务令牌。 这非常适合处理利用 continuations 并需要防止重复应用事务发生的流程。
新的便捷动作实现
webflow.action 包现在包含几个新的动作实现,包括:CompositeAction、DelegatingAction 和 GuardedAction。
启用 JMX 的流程执行统计
sellitem 示例现在演示了使用 JMX 管理协议收集所有 Web Flow 的全局统计信息,并使用任何 JMX 客户端(例如 JDK 1.5 的 JConsole)监控这些统计信息的能力。 未来的 web flow 版本将增强此能力,以实现基于每个流程执行的管理和监控。
简化并改进了 Struts 集成
PR4 大大简化了 Struts 1.x 集成,并与 Spring 1.2.2 引入 SpringBindingActionForm 保持一致。 不再需要特殊的 FlowActionMapping,因为所有 webflow 特定的配置现在都由 Spring 管理。 请参阅 birthdate 示例应用程序以获取具体示例。
其他
改进了 javadoc、错误消息和日志记录
大幅改进的构建系统,提供“一步式”示例应用程序构建/部署
Erwin 和我必须感谢 Colin Sampaleanu 构建了一个非常棒的构建系统,用于管理整个开发和发布过程。 当您下载 PR4 时,会发现构建和部署示例应用程序以及 Spring Web Flow 的任何组件(例如项目本身或绑定模块)都变得简单易行,并且具有细致的自动 jar 文件管理功能。 这个“通用构建”系统基于 Ant 1.6.x 并利用 Ivy 进行 jar 依赖管理--
这些只是此版本的部分新功能。 有关完整的更改列表,请参阅 http://opensource.atlassian.com/confluence/spring/display/WEBFLOW/Change+Log
一如既往,我们非常重视您的反馈意见。 预计 Web Flow 1.0 RC1 将于 7 月底发布,并集成 Portlet MVC 和 JSF。
祝好,
Keith Donald
Erwin Vervaet