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

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