Spring框架正準備推出一種新的技術。在下一個版本中Spring將正式將Spring WebFlow整合進來。Spring WebFlow是一個及其優秀的Web開發框架,用于在Web應用內部創建和配置可重用的Web流程。
熟悉Spring的人可能先入為主地以為Spring WeFlow和SpringMVC沒有什么區別。那就錯了。Spring MVC是一個輕量級的Web開發框架,而Spring WebFlow 則提出一種全新的視角。她使得Web架構師們可以將精力集中在Web應用開發的抽象層次上:Web流程的邏輯結構和Web事件條件的定義。此外,她還提出許多新的概念。
本文將回顧這一個新框架前的一些關鍵概念,用一個經典的用戶登錄例子來分析流程標記語言的主要組成元素并向您解釋為什么WebFlow如此誘人。
Spring WebFlow 概念和組件作為一個Web框架,WebFlow無論在理論上還是在實際開發上都有諸多優點。深厚的軟件工程學架構保證了他的穩定性,同時,其組件合理,易于理解,易于使用。
事實上,它更適合中大型應用的開發,因為它的組件模型專門針對架構重用,高效管理性和可配置性進行了優化。
用例研究
本文以一個常見的web應用流程作為示例,一個身份認證流程,講解它的一些代碼片斷。一個Web認證的全過程包括:登錄表單,注冊表單,認證action,注冊action,以及對這些action的結構修飾。這個例子用來展示那些修飾登錄表單的組件的配置。
自動操作架構
Spring WebFlow以有限自動機(Finite State machine)的概念為基礎。Web應用內部的用戶交互行為和事務被建模為一般的狀態機,這是一種非常流行的軟件工程建模方法。(見圖1)。自動機為基礎的設計是一種很好的設計方法,同時正在越來越收到應用架構的青睞——因為它在對Web交互行為建模時顯得相對清晰且嚴謹。

WebFlow的核心組件
一個Spring WebFlow應用中包含一個或多個流程,通常每個流程包括執行Action的動作狀態(ActionStates),顯示狀態(ViewStates),跳轉動作(Transitions)。
流程
一個流程是一個預先定義好的用戶交互行為的集合,表示為一個由動作狀態和顯示狀態構成的樹,狀態之間通過跳轉聯系。
下面的登錄注冊是一個webflow的例子,包含了一些典型的構件,例如loginForm,ActionState,transition。這些構件通過一個XML文件描述:
|
這個流程以loginForm開始,以"successView"結束(修飾主頁面"displayMain" 的組件。流程可以通過XML文檔配置,或者AbstractFlowBuilder的子類。
動作狀態(ActionStates)
ActionStates對用戶事件或其他事件進行響應。ActionStates自身又可以包含其他可執行的Action和transition。下面的代碼配置了"loginForm"這個ActionState。
動作(Actions)
Action是ActionState可以連接,重用,聲明調用的最小單位。Action繼承自AbstractAction類,該類實現了doExecuteAction方法。這個方法的參數:RequestContext,WebFlow(其中封裝了所有流程相關的數據)。
loginForm動作狀態通過Spring的自動裝配特性調用LoginFormAction動作。doExecute
Action方法被自動調用,同時可以處理一些登錄準備,預先裝入等操作。
|
顯示狀態(ViewState)
ViewState初始化對顯示組件(jsp,tile等)的修飾操作。下面是一個ViewState的配置代碼:
當來自loginForm的ActionState返回一個"success"時,這個ViewState將會被調用。它將修飾"enterCredentials"顯示組件(可以是一個常見的struts forward)。
跳轉(Transition)
和通常的狀態機一樣,WebFlow定義了狀態以及狀態之間跳轉動作。這些跳轉動作很類似struts中的ActionForward。同樣是負責連接兩個狀態。
后繼動作(Continuation)
后繼動作(Continuation)允許你回退并重新開始程序執行流程——從程序執行的角度來看是一個適時的逆流程。Continuation的概念最早來自編程語言,但是卻從來沒有被用于像Java,VB,C++這樣主流的編程語言中。WebFlow創造性地實現了continuation。由于continuation可以用來持久和重造任何一個流程狀態,從而提供給你極大的自由。
重用
WebFlow中的流程定義,如登錄流程,有針對性地被結構化以便重用。他們定義封裝了自己的生命周期。這些定義可以很容易的用支持Spring的其他Web組件配置重用。架構師應該識別出并定義通用的流程,如登錄,搜索等以便今后的重用。
此外,Action如果正確的設計與Spring的結合,也可以被重用。他們可以同時被不同流程的action state使用。這些重用,既有應用級的又有流程級的,增強了維護性和代碼可讀性。
與Struts結合
WebFlow與struts的結合部分地通過標準的Spring類和org.springframework.web.struts包中的一些配置。要與WebFlow相關概念(Action,ActionFlow)結合只需要注冊WebFlow規格的struts action,并像普通的WebFlow action一樣使用。
下面的配置代碼來自struts-config.xml,描述了Struts的Action如何配置成流程的入口。注意WebFlow規格的Action類(org.springframework.web.flow.struts.FlowAction)和屬性"flowId",它們將Action與登陸流程連接起來。例子中的登錄流程在Spring的應用上下文(ApplicationContext)中作為一個loginFlow的bean管理。你還需要將這個流程注冊為一個由Spring管理的bean。
|
在這個例子中還用到了Spring中的RequestProcessor(org.springframework.web.struts.BindingRequestProcessor),是Spring的自動綁定form和bean。這一特性避免再去寫單獨的ActionForm對象。
|
同時,它還要求一個使用工具類來自動綁定Web表單中的值到一個對象。
|
WebFlow的預發布現在可以下載,其中包含一個樣例應用("birthdate"),詳細描述了這個整合過程。
如果你正在著手建立一個Web應用,Spring是一個非常不錯的選擇。Spring MVC非常容易上手并且可以很方便的同其他組件整合。另一方面,即將出現的Spring WebFlow將提供給你各種復雜的新特性。使你能夠開發出高度重用和結構化的Web應用。如果你在開發的是一個大規模的企業應用,這一點是很重要的。這也是為什么struts如此流行。
總的來說,J2EE Web框架目前處在一種群雄逐鹿的狀態,沒有一個領導者。Struts是最流行的,但是它的主架構師也是主要的開發者已經拋棄了它。被稱為Struts取代者的JSF目前還沒有獲得足夠的影響力。而同時,其他的框架正在慢慢開始流行。
你也許會問,"我應該選擇哪個?"Spring WebFlow出現可以讓你以后再去考慮這個問題。WebFlow允許你在不需要較大改動的情況下方便的切換框架。
像前面說過的,Spring WebFlow是一個抽象的框架,可以讓你只專注于業務流程和重用。無論是Struts,JSF還是Spring MVC都可以作為它的業務流程實現。因此,你也就不需要馬上作出上面說的那個選擇了。