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 社群所有即將舉行的活動。

檢視所有