Spring WebFlow是一個(gè)全新的Web框架,她帶給我們一種全新且高度結構化的Web應用構建方法。讓我們來(lái)看看她的一些特性。
Spring框架正準備推出一種新的技術(shù)。在下一個(gè)版本中Spring將正式將Spring WebFlow整合進(jìn)來(lái)。Spring WebFlow是一個(gè)及其優(yōu)秀的Web開(kāi)發(fā)框架,用于在Web應用內部創(chuàng )建和配置可重用的Web流程。
熟悉Spring的人可能先入為主地以為Spring WeFlow和SpringMVC沒(méi)有什么區別。那就錯了。Spring MVC是一個(gè)輕量級的Web開(kāi)發(fā)框架,而Spring WebFlow 則提出一種全新的視角。她使得Web架構師們可以將精力集中在Web應用開(kāi)發(fā)的抽象層次上:Web流程的邏輯結構和Web事件條件的定義。此外,她還提出許多新的概念。
本文將回顧這一個(gè)新框架前的一些關(guān)鍵概念,用一個(gè)經(jīng)典的用戶(hù)登錄例子來(lái)分析流程標記語(yǔ)言的主要組成元素并向您解釋為什么WebFlow如此誘人。
Spring WebFlow 概念和組件作為一個(gè)Web框架,WebFlow無(wú)論在理論上還是在實(shí)際開(kāi)發(fā)上都有諸多優(yōu)點(diǎn)。深厚的軟件工程學(xué)架構保證了他的穩定性,同時(shí),其組件合理,易于理解,易于使用。
事實(shí)上,它更適合中大型應用的開(kāi)發(fā),因為它的組件模型專(zhuān)門(mén)針對架構重用,高效管理性和可配置性進(jìn)行了優(yōu)化。
用例研究
本文以一個(gè)常見(jiàn)的web應用流程作為示例,一個(gè)身份認證流程,講解它的一些代碼片斷。一個(gè)Web認證的全過(guò)程包括:登錄表單,注冊表單,認證action,注冊action,以及對這些action的結構修飾。這個(gè)例子用來(lái)展示那些修飾登錄表單的組件的配置。
自動(dòng)操作架構
Spring WebFlow以有限自動(dòng)機(Finite State machine)的概念為基礎。Web應用內部的用戶(hù)交互行為和事務(wù)被建模為一般的狀態(tài)機,這是一種非常流行的軟件工程建模方法。(見(jiàn)圖1)。自動(dòng)機為基礎的設計是一種很好的設計方法,同時(shí)正在越來(lái)越收到應用架構的青睞——因為它在對Web交互行為建模時(shí)顯得相對清晰且嚴謹。
WebFlow的核心組件
一個(gè)Spring WebFlow應用中包含一個(gè)或多個(gè)流程,通常每個(gè)流程包括執行Action的動(dòng)作狀態(tài)(ActionStates),顯示狀態(tài)(ViewStates),跳轉動(dòng)作(Transitions)。
流程
一個(gè)流程是一個(gè)預先定義好的用戶(hù)交互行為的集合,表示為一個(gè)由動(dòng)作狀態(tài)和顯示狀態(tài)構成的樹(shù),狀態(tài)之間通過(guò)跳轉聯(lián)系。
下面的登錄注冊是一個(gè)webflow的例子,包含了一些典型的構件,例如loginForm,ActionState,transition。這些構件通過(guò)一個(gè)XML文件描述:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE webflow PUBLIC "- //SPRING//DTD WEBFLOW//EN" "http://www.springframework. org/dtd/spring-webflow.dtd"> <webflow id="LoginSequence" start-state="loginForm"> <action-state id="loginForm"> <action bean="loginFormAction"/> <transition on="success" to="formView"/> </action-state> ... <view-state id="formView" view="enterCredentials"> <transition on="submit" to="bindAndValidateForm"/> </view-state> ... <end-state id="successView" view="displayMain"/>
這個(gè)流程以loginForm開(kāi)始,以"successView"結束(修飾主頁(yè)面"displayMain" 的組件。流程可以通過(guò)XML文檔配置,或者AbstractFlowBuilder的子類(lèi)。動(dòng)作狀態(tài)(ActionStates)ActionStates對用戶(hù)事件或其他事件進(jìn)行響應。ActionStates自身又可以包含其他可執行的Action和transition。下面的代碼配置了"loginForm"這個(gè)ActionState。 <action-state id="loginForm"> <action bean="loginFormAction"/> <transition on="success" to="formView"/> </action-state>
動(dòng)作(Actions)Action是ActionState可以連接,重用,聲明調用的最小單位。Action繼承自AbstractAction類(lèi),該類(lèi)實(shí)現了doExecuteAction方法。這個(gè)方法的參數:RequestContext,WebFlow(其中封裝了所有流程相關(guān)的數據)。loginForm動(dòng)作狀態(tài)通過(guò)Spring的自動(dòng)裝配特性調用LoginFormAction動(dòng)作。doExecuteAction方法被自動(dòng)調用,同時(shí)可以處理一些登錄準備,預先裝入等操作。 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初始化對顯示組件(jsp,tile等)的修飾操作。下面是一個(gè)ViewState的配置代碼: <view-state id="formView" view="enterCredentials"> <transition on="submit" to="bindAndValidateForm"/> </view-state>
當來(lái)自loginForm的ActionState返回一個(gè)"success"時(shí),這個(gè)ViewState將會(huì )被調用。它將修飾"enterCredentials"顯示組件(可以是一個(gè)常見(jiàn)的struts forward)。跳轉(Transition)和通常的狀態(tài)機一樣,WebFlow定義了狀態(tài)以及狀態(tài)之間跳轉動(dòng)作。這些跳轉動(dòng)作很類(lèi)似struts中的ActionForward。同樣是負責連接兩個(gè)狀態(tài)。后繼動(dòng)作(Continuation)后繼動(dòng)作(Continuation)允許你回退并重新開(kāi)始程序執行流程——從程序執行的角度來(lái)看是一個(gè)適時(shí)的逆流程。Continuation的概念最早來(lái)自編程語(yǔ)言,但是卻從來(lái)沒(méi)有被用于像Java,VB,C++這樣主流的編程語(yǔ)言中。WebFlow創(chuàng )造性地實(shí)現了continuation。由于continuation可以用來(lái)持久和重造任何一個(gè)流程狀態(tài),從而提供給你極大的自由。(T117)