Spring Web Flow 2.2.0.M1 发布

工程 | Rossen Stoyanchev | 2010年8月5日 | ...

我很高兴地宣布 Spring Web Flow 2.2 的第一个里程碑版本现已开放下载。该版本也可以通过 Maven 里程碑仓库获取,地址是http://maven.springframework.org/milestone。与 Spring Web Flow 2.1 一样,此版本需要 JDK 1.5、Spring 3 和 Spring Security 3。

此版本的主要重点是通过扩展支持的JSF 2 功能列表来满足 JSF 用户的需求。不久前,Web Flow 2.1 使得使用 JSF 2 依赖成为可能,而无需今天 JSF 1.2 中常用的独立 Sun Facelets jar 包。

在 Spring Web Flow 2.2 中,您可以期待利用核心 JSF 2 功能和 JSF 2 组件库。有关组件库的更多信息将在本文后续部分介绍。首先,以下是新功能概览。

JSF 2 Ajax 请求

JSF 2 定义了用于处理 Ajax 请求的客户端和服务器端设施。您可以使用 <f:ajax> 标签为组件添加 Ajax 行为,如下所示:


<h:commandButton value="More Results" action="next">
    <f:ajax render="@form" />
</h:commandButton>

按下上述按钮时,将向服务器发送 Ajax 请求,这将导致部分请求处理、渲染以及对该按钮所属表单的更新。

<f:ajax> 标签还支持其他属性,例如用于指定客户端事件(blur、mouseover 等)的“event”属性,以及用于指定应包含在请求处理生命周期的执行阶段的组件的“execute”属性。<f:ajax> 标签可以嵌套在其他标签内或包围其他标签。还提供 JavaScript API。有关更多详细信息和示例,请参阅 JSF 2 规范的第 10.4.1.1 节和第 14 章。

如果您是 Web Flow 2 用户,您会发现处理上述请求的方式与今天一样熟悉


<view-state id="reviewHotels">
    <transition on="next">
        <evaluate expression="searchCriteria.nextPage()" />
    </transition>
</view-state>

“next”上的转换没有目标视图状态。这将使我们停留在当前视图中,同时将 SearchCriteria backing bean推进到下一页。为了确保渲染发生在没有客户端重定向(POST-redirect-GET 模式)的情况下,您需要配置 Web Flow 以便能够识别 JSF 2 Ajax 请求


<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
    <property name="flowExecutor" ref="flowExecutor" />
    <property name="ajaxHandler">
        <bean class="org.springframework.faces.webflow.JsfAjaxHandler"/>
    </property>
</bean>

2.2.0.M1 版本中的 booking-faces 示例在整个过程中使用了 <f:ajax /> 标签,包括搜索结果分页和基于 Ajax 的表单验证等用例。

JSF 2 资源请求

JSF 2 引入了 ResourceHandler API,用于提供相对于 Web 应用程序根目录(在 /resources/** 下)或类路径(在 META-INF/resources/** 下)打包的资源(图像、.js、.css 文件)。JSF 组件库可以通过 API 或 @ResourceDependency 注解透明地添加资源。此外,您还可以在视图中添加 <outputScript> 标签。

JSF 渲染资源 URL 的方式使其指向同一个 Servlet,如下所示:/myApp/myServlet/javax.faces.resources/

请注意,位于 servlet 映射之后的“/javax.faces.resources”段。这是区分它为 JSF 资源请求的关键。

在 Web Flow 中,JSF 资源 URL 指向 Spring MVC DispatcherServlet。为了处理此类请求,提供了一个新的 Spring MVC HttpRequestHandler,用于将资源请求委托给 JSF 2 资源处理机制。以下是配置此处理程序所需的配置。最终版本将简化此配置。


<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings" value="/javax.faces.resource/**=jsfResourceHandler"/>
</bean>

<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

<bean id="jsfResourceHandler" class="org.springframework.faces.webflow.FacesJsfResourceRequestHandler"/>

2.2.0.M1 版本中的 booking-faces 示例包含了必要的配置。

部分状态保存

部分状态保存可以说是 JSF 2 中最重要的变化之一(仅限 Facelets)。它的工作方式是,部分状态保存算法不是为每个视图存储整个组件树状态,而是始终将树恢复到其初始状态,然后只应用并跟踪已更改的部分。这种推理是,组件树的变化可能小于整个组件树状态,因此内存使用量更少。

在 Web Flow 中,JSF 组件树状态始终存储在视图范围的 Web Flow 变量中,而不是直接存储在 HTTP session 中。不幸的是,要在 JSF 1.2 中实现这一点,Web Flow 必须接管整个状态保存算法。这就是为什么部分状态在 Web Flow 2.1 中无法直接工作,并且必须通过 web.xml 中的“javax.faces.PARTIAL_STATE_SAVING”上下文参数来禁用。

JSF 2 状态保存的总体改进使得委托给标准的 JSF StateManager 实现并插入自定义的 ResponseStateManager 以仅覆盖实际读取和写入组件状态的部分成为可能。这就是 Web Flow 2.2 为提供部分状态保存支持所做的工作。

此更改已在 Mojarra 上进行了测试,特别是 Mojarra 2.0.3 版本(推荐版本)。如果您暂时使用 Apache MyFaces JSF 2 实现,则需要继续使用“javax.faces.PARTIAL_STATE_SAVING”参数来禁用部分状态保存。不幸的是,在 MyFaces 中定制状态读取和写入的位置并不那么简单,因此需要更多时间。

每个请求一个 FacesContext

部分状态保存的更改之一要求确保在单个流程请求的持续时间内使用单个 FacesContext 实例。这对于 JSF 用户来说可能是一个受欢迎的改变,正如您在 JIRA 中的一些评论所证明的那样。为了避免在 FacesContext 上出现 NullPointerException,您需要添加此 FlowExecutionListener


<webflow:flow-executor id="flowExecutor">
    <webflow:flow-execution-listeners>
        <webflow:listener ref="facesContextListener" />
    </webflow:flow-execution-listeners>
</webflow:flow-executor>

<bean id="facesContextListener" class="org.springframework.faces.webflow.FlowFacesContextLifecycleListener"/>

无论使用哪个 JSF 版本,都需要这样做。

更多 JSF 2 功能

唯一不受支持的功能是 Web Flow 提供核心价值的功能,包括导航和范围。JSF 2 使用约定来简化导航规则,添加条件导航,并提供视图、闪存和自定义范围。您会发现 Web Flow 在这两个领域继续提供重要的价值。

视图参数是另一个不受支持的功能。Web Flow 确实提供了一种访问请求参数并将其绑定到作用域 Bean 的字段的方法。但是,如果您有任何好的用例,请务必向我们提供反馈。

任何其他未提及的功能(复合组件、JSR-303 验证、系统事件等)预计都可以工作。关于复合组件,以下 Mojarra 的问题可能会影响您。如果是,请为此投票。

JSF 2 组件库

除了 JSF 集成之外,Spring Web Flow 目前还附带了一个小型组件库。Spring Faces 组件库基于 Dojo JavaScript 工具包构建,并以渐进增强风格提供 Ajax 行为、资源处理和客户端验证。其中大部分与 JSF 2 提供的内容重叠。因此,我们面临两种选择:要么扩展对 JSF 2 的支持以包含 Spring Faces 组件库,要么与 JSF 社区流行的其他组件库紧密集成。我们认为后一种选择将为您提供更多的价值。

在此,我很高兴地宣布,我们正在与PrimeFaces背后的团队密切合作,为您带来与其组件库的紧密集成。PrimeFaces 是第一个支持 JSF 2 的组件库,并且人气正在迅速上升。与 Spring Faces 非常相似,它基于客户端 JavaScript 工具包 (jQuery) 构建,并且拥有令人印象深刻的组件数组,每天都在增长。如果您还没有查看 PrimeFaces 组件演示,请务必查看。

因此,您可以期待 Spring Web Flow 2.2 发布时会包含展示有效使用 Web Flow、JSF 2 和一流 JSF 2 组件库的 JSF 2 示例(带有 PrimeFaces 组件)。

结论

Web Flow 2.2 将是第一个支持核心 JSF 2 功能并与 PrimeFaces 组件库紧密集成的版本。如果您是 JSF 用户,我希望您会觉得这是一个令人兴奋的进步。要尝试此版本,请下载它,运行更新后的 booking-faces 示例,并向我们提供反馈。您可以期待本月底发布一个候选版本,与 PrimeFaces 2.2 版本同步。

与此同时,Web Flow 3 的工作正在继续,朝着第一个里程碑前进。Web Flow 3 的核心特性是 Java 流程定义。在 2.2 分支中完成的 JSF 工作将融入 3.0 分支。

获取 Spring 时事通讯

订阅 Spring 时事通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 通过一个简单的订阅,提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部