驱赶浮躁

« Previous day (三月 16, 2006) | Main | Next day (三月 18, 2006) »

http://blog.matrix.org.cn/zhenggc/date/20060317 星期五 2006年03月17日

Spring Web Flow Quick Start 翻译

Quick Start

Added by Keith Donald, last edited by Keith Donald on Mar 15, 2006  (view change)

原文地址http://opensource2.atlassian.com/confluence/spring/display/WEBFLOW/Quick+Start

这个Quick Start是帮住你快速开始使用Spring Web Flow 1.0

这个文档假定你已经下载了一份Spring Web Flow 1.0 EA 和 the Spring Framework,以及你有基本的了解Spring,HTML和JSP/JSTL。另外的,熟悉有限状态机和UML状态图。

下面使用一个简单的例子一步步示范实现你的第一个FLOW

1、确保spring-webflow-1.0.jar 和 spring-binding-1.0.jar 在你的Classpath下,当然你也需要Spring FrameWork1.2.7或者以后版本的核心包,当然可以为了方便而使用all-in-one的spring.jar在你的ClassPath下。

2、设计你的第一个FLOW,为了这个Quick Start,假定一个简单的流程,明确这个Flow必须

  • 开始,显示一个form view在浏览器上
  • 提交时候(“submit”事件),绑定输入数据到backing form object以及验证正确性。如果有错误发生 ,返回到form view,如果所有都合适,执行一个submit action。

      (如果你熟悉Spring MVC,上面的就等价于SimpleFormController的流程)

3、创建你的工作流定义,这里展示如何在xml中定义流程

myFlow.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE flow PUBLIC "-//SPRING//DTD WEBFLOW 1.0//EN"
       "http://www.springframework.org/dtd/spring-webflow-1.0.dtd">

<flow start-state="displayForm">

    <view-state id="displayForm" view="form">
        <entry-actions>
            <action bean="formAction" method="setupForm"/>
        </entry-actions>
        <transition on="submit" to="processSubmit">
            <action bean="formAction" method="bindAndValidate"/>
        </transition>
    </view-state>

    <action-state id="processSubmit">
        <action bean="formAction" method="processSubmit"/>
        <transition on="success" to="finish"/>
    </action-state>

    <end-state id="finish" view="success"/>

</flow>

4、创建你的第一个flow action,这里展示在上面提及的包含form setup,bing和validate已经submitlogic的formAction。

MyFormAction.java
public class MyFormAction extends FormAction {
    public MyFormAction() {
        setFormObjectClass(FormObject.class);
    }

    private static class FormObject implements Serializable {
        private String data;

        public void String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }
    }

    /**
     * A "submit" hook: an action execute method, called after
     * binding and validation.
     */
    public Event processSubmit(RequestContext context) throws Exception {
        FormObject formObject = (FormObject)getFormObject(context);
        // do submit logic
        return success();
    }

}

5、使用Spring Application Context配置你的第一个webflow ,在这里你选择使用XmlFlowRegistryFactoryBean,去创建一个注册来包含从上面的xml资源创建流程,已经配置你的formaction。

dispatcher-servlet.xml
<bean id="flowRegistry" class="org.springframework.webflow.registry.XmlFlowRegistryFactoryBean">
   <property name="flowLocations" value="/WEB-INF/flows/myflow.xml"/>
</bean>

<bean id="formAction" class="example.MyFormAction"/>

6、使用你喜欢的web framework完成webflow,如果你使用spring mvc,定义一个FlowController

dispatcher-servlet.xml
<bean name="/myApp.htm" class="org.springframework.webflow.executor.mvc.FlowController">
    <property name="flowLocator" ref="flowRegistry"/>
</bean>

上面定义/myApp.html这个URL和上面定义的flowController的对应关系。一个Controller就可以管理执行所有的在一个webapp中定义flow,flow执行的时候是一个叫做_flowId的参数来开始一个新的flow

7、创建那些参与这个flow的views (aka pages)  

form.jsp
<html>
<head>
   <title>My Form</title>
</head>
<body>
<p>
   <table>
   <form action="myApp.htm">
       <tr>
           <td>Field:</td>
           <td><input type="text" name="data" size="25"/></td>
       </tr>
       <tr>
           <td colspan="2" align="right">
               <input name="_eventId_submit" type="submit">
               <input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}">
           </td>
       </tr>
   </form>
   </table>
</p>
</body>
</html>

注意:flows是有状态的,所以,一个页面参与一个flow必须提交一个 _flowExecutionKey 参数给服务器来区别那个流程是客户端参与的,另外,一个流程必须提交一个叫_eventId的参数给服务器表示那个event发生当客户端某个事件发生的时候,比如“submit”是submit按钮被按下的时候发生的事件。

8、最后,访问这个流程,在这个案例中,我们可以简单的使用/myApp.htm?_flowId=myFlow 这个url来访问。当我们访问这个,在服务端将创建一个新的“myflow”FlowExecution,并且转换到他的start-state,然后,以下的一些处理将可能发生

   1、view form被展示

   2、用户点击提交按钮,一个有'submit'信号的事件发生,完成客户端操作

   3、服务端接收到“submit”事件,执行MyFlowAction中bingAndValidate方法,然后返回一个结果(比如:success,或者error)

   4、这个操作的结果触发另一个转变,比如回到“displayForm”在错误发生的时候,或者在成功的时候提交表单

   5、processSubmit状态触发在MyFlowAction中的processSubmit方法,然后返回结果

   6、如果这个submit成功结束,这个流程结束,显示最后的成功view

正如你所见,一个flow完全的在上面定义。Action实现全部执行命令已经逻辑在请求发生的时候,返回一个合理的结果给flow展示。

终于完成了这个Quick Start,一个简单的介绍Spring Web Flow系统,一个好的地方去学习更多的关于Spring Web Flow是reference文档和支持论坛。另外的一个方法是多看看例子,就在分发包的spring-webflow-samples文件夹,可以查看readme.txt,那里介绍如何编译和配置这些例子程序

终于完成了我自己的第一个翻译的文章,呵呵,大家不要见笑,我知道有很多都是我乱写的地方,只是想给自己看完后留个纪念,当然存在一些我理解错误的地方,请大家参照原文凑合者看

powered by @_@/blog.matrix


Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.