spring webflow示例

发布时间:2013-01-25 08:08:34

spring webflow示例非规范要点说明文档
    本文档着重说明示例中struts与webflow整合的关键点。
1. 配置文件说明:
  1.1 web.xml
  webflow基于spring框架,此处使用一般spring与struts整合方式,引入spring框架
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/webflow-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

  1.2 struts-config.xml
  formbean使用SpringBindingActionForm
      <form-bean name="actionForm" type="org.springframework.web.struts.SpringBindingActionForm"/>
  global-forwards提供给webflow跳转关系
  action-mapping使用保证struts说明,类型使用FlowAction
  <action path="/flowAction" 
          name="actionForm" 
      scope="request" 
      type="org.springframework.webflow.executor.struts.FlowAction"/>

  1.3 webflow-context.xml(spring配置文件)
      <bean id="actionForm" class="...Action" />指定action的class文件

  注册webflow
      <flow:executor id="flowExecutor" registry-ref="flowRegistry"/>
    
    <!-- Creates the registry of flow definitions for this application -->
    <flow:registry id="flowRegistry">
        <flow:location path="/WEB-INF/gateway.xml"/>
    </flow:registry>

  1.4 gateway.xml(webflow配置文件)
  流程
      <start-state idref="xxx" />    <!-- 表明webflow的开始-->

      <view-state id="" view=""><!-- view="" 指向struts配置文件global-forwad -->
          <render-actions>
            <action bean="tvgwformAction" method="setupForm" /> <!-- setupForm对应action中构造方法-->
        </render-actions>
        <transition on="pay" to="processChooseFormSubmit" /> <!-- on="XXX" 接收页面提交的_eventId_XXX-->
        <transition on="cancel" to="cancel" />         <!-- to="XXX" 需对应跳转view-state或action-state的id-->
      </view-state>      
    
      <action-state id="processChooseFormSubmit">
        <action bean="tvgwformAction" method="bindAndValidate" /> <!-- bindAndValidate对应strust的validator-->
        <transition on="success" to="queryAccount" />
        <transition on="error" to="simupay" />        <!-- success&error 对应action方法的result返回值-->
      </action-state>   

      <action-state id="queryAccount">
        <action bean="tvgwformAction" method="queryAccount" />  <!--method对应action方法 -->
        <transition on="success" to="gwForm" />
        <transition on="error" to="error" />
      </action-state>

      <end-state id="resultForm" view="result" />    <!-- 表明webflow的结束-->

2. action类说明
  2.1 action类继承自org.springframework.webflow.action.FormAction
  
  2.2 构造方法需要设置以下参数
    public TvGatewayFormAction(){
        setFormObjectName("tvGateway");    //设置使用formbean的名字
        setFormObjectClass(TvGateway.class);    //设置使用formbean的类
        setFormObjectScope(ScopeType.FLOW);        //设置生命周期
        setValidator(new TvGatewayValidator());    //设置验证方法
    }

    !注意:在验证方法中提供supports方法,注入formBean类
        public boolean supports(Class clazz) {
            return clazz.equals(BirthDate.class);
        }

  2.3 action向页面传递对象
  可以使用context.getRequestScope().put(...)和context.getRequestScope().put(...)两种(实现struts request.setAttribute功能)
  使用context.getRequestScope().put(...),如果对象传递目的地是end-state,页面可以接收到对象的值,如果传递目的地是view-state则不能接收到
  原因:在swf 1.0中缺省alwaysRedirectOnPause开启,意味着,view在重定向之后总是会被收回,也就是说,request会在下一个请求到来时被刷新;
    因此,使用context.getRequestScope().put(String, object)代替

  2.4 view-state to action-state
  为保证action中getFormObject(context)可取得页面提交数据,在webflow配置文件中每次从view-state跳转到action-state都必须
  先调用validator的bindAndValidate,主要目的是使用validator中的support将formBean对象“注入”,从而保证formBean对象在整个flow流程中的一致性。

3. Jsp页面说明
  3.1 页面显示action传递的对象可以采用<bean:write name.../> 或 ${XXX.xx }两种方法

  3.2 webflow响应页面跳转是根据页面提交的_eventId_XXX对应的XXX确定的,
      由于机顶盒界面不使用链接或点击事件做提交,使用javascript响应键盘事件,用js函数处理提交,为区分不同事件产生不同跳转,采用如下方法:
    在javascript中创建html页面元素的方法
    在页面设置一个不可见元素
    <span id="_eventId"/>
    在javascript脚本中添加需要创建的元素
    document.getElementById("_eventId").innerHTML=<...>;
    <...>可如所示 <input type=\"hidden\" name=\"_eventId_cancel\" value=\"Abandon\"/>(临时生成不同_eventId_XXX)