領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多我很高興地宣佈 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 請求的客戶端和伺服器端設施。您可以使用 <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 引入了 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 例項。這對於 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 版本,都需要這樣做。
唯一不受支援的功能是 Web Flow 提供核心價值的功能,包括導航和範圍。JSF 2 使用約定來簡化導航規則,新增條件導航,並提供檢視、快閃記憶體和自定義範圍。您會發現 Web Flow 在這兩個領域繼續提供重要的價值。
檢視引數是另一個不受支援的功能。Web Flow 確實提供了一種訪問請求引數並將其繫結到作用域 Bean 的欄位的方法。但是,如果您有任何好的用例,請務必向我們提供反饋。
任何其他未提及的功能(複合元件、JSR-303 驗證、系統事件等)預計都可以工作。關於複合元件,以下 Mojarra 的問題可能會影響您。如果是,請為此投票。
除了 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 分支。