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

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