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 用户的需求,通过扩展支持的 JSF 2 功能 列表。不久前,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 支持 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 会话中。不幸的是,为了在 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 发布时包含使用 PrimeFaces 组件的 JSF 2 示例,这些示例演示了 Web Flow、JSF 2 和一流的 JSF 2 组件库的有效使用。

结论

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 社区中所有即将举行的活动。

查看全部