爱心技术专栏专题

SpringWebFlow:重用与抽象框架解析之一

摘录:java基础 来源:java基础 加入时间:2007年03月10日
摘要:
SpringWebFlow:重用与抽象框架解析之一

Spring WebFlow是一个全新的Web框架,她带给我们一种全新且高度结构化的Web应用构建方法。让我们来看看她的一些特性。

Spring框架正准备推出一种新的技术。在下一个版本中Sprin

SpringWebFlow:重用与抽象框架解析之一

站点:爱心种子小博士 关键字:SpringWebFlow:重用与抽象框

   
SpringWebFlow:重用与抽象框架解析之一
Spring WebFlow是一个全新的Web框架,她带给我们一种全新且高度结构化的Web应用构建方法。让我们来看看她的一些特性。

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文件描述:

<?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"/>


这个流程以loginForm开始,以"successView"结束(修饰主页面"displayMain" 的组件。流程可以通过XML文档配置,或者AbstractFlowBuilder的子类。

动作状态(ActionStates)

ActionStates对用户事件或其他事件进行响应。ActionStates自身又可以包含其他可执行的Action和transition。下面的代码配置了"loginForm"这个ActionState。

<action-state id="loginForm">
        <action bean="loginFormAction"/>
        <transition on="success" to="formView"/>
    </action-state>


动作(Actions)

Action是ActionState可以连接,重用,声明调用的最小单位。Action继承自AbstractAction类,该类实现了doExecuteAction方法。这个方法的参数:RequestContext,WebFlow(其中封装了所有流程相关的数据)。

loginForm动作状态通过Spring的自动装配特性调用LoginFormAction动作。doExecute

Action方法被自动调用,同时可以处理一些登录准备,预先装入等操作。

public LoginFormAction extends AbstractAction
{ 

 protected Event doExecuteAction
 (RequestContext context)  
 throws Exception
 { 
  //perform some login specific setup operations 
  ... 

 }//end method 

}//end class


显示状态(ViewState)

ViewState初始化对显示组件(jsp,tile等)的修饰操作。下面是一个ViewState的配置代码:

<view-state id="formView" 
view="enterCredentials">
        <transition on="submit"
		to="bindAndValidateForm"/>
    </view-state>


当来自loginForm的ActionState返回一个"success"时,这个ViewState将会被调用。它将修饰"enterCredentials"显示组件(可以是一个常见的struts forward)。

跳转(Transition)

和通常的状态机一样,WebFlow定义了状态以及状态之间跳转动作。这些跳转动作很类似struts中的ActionForward。同样是负责连接两个状态。

后继动作(Continuation)

后继动作(Continuation)允许你回退并重新开始程序执行流程——从程序执行的角度来看是一个适时的逆流程。Continuation的概念最早来自编程语言,但是却从来没有被用于像Java,VB,C++这样主流的编程语言中。WebFlow创造性地实现了continuation。由于continuation可以用来持久和重造任何一个流程状态,从而提供给你极大的自由。