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 1.2 分开的 Sun Facelets jar 的情况下使用 JSF 2 依赖成为可能。

在 Spring Web Flow 2.2 中,您可以期待利用核心 JSF 2 功能和 JSF 2 组件库。组件库的更多信息将在本文后面介绍。首先,这里将概述新功能。

JSF 2 Ajax 请求

JSF 2 定义了用于处理 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 后端 beanAdvance 到下一页。为确保渲染发生在没有客户端重定向(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 相同的 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 使用约定简化导航规则,添加条件导航,并提供视图、flash 和自定义作用域。您会发现 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 在 JSF 2 示例中发布,其中包含 PrimeFaces 组件,演示了 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 社区所有即将举行的活动。

查看所有