流控制文件很简单,就是根元素是,然后用来代表一个一个的页面,用来代表从一个状态到另外一个状态的跳转,如果有动作要执行就会加在其中。

对于一个普通的java工程师,一般不需要超过1小时就可以熟知这个文件的编写方法,可查阅相关文档。

对于我们的flow,大体上如下所示:

 

MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 5_第1张图片

因为图片实在太长,所以我没办法吧整个图片都截下来,这里只截取部分,对于flow定义的xml文件,我完整列在这里,可以供读者参考:

 

   
   
   
   
  1. xml version="1.0" encoding="UTF-8"?> 
  2. <flow xmlns="http://www.springframework.org/schema/webflow" 
  3.       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4.       xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"> 
  5.      
  6.      
  7.      
  8.     <on-start> 
  9.         <evaluate expression="envProvisionInitService.initialize(flowRequestContext)" /> 
  10.          
  11.          
  12.          
  13.         <evaluate expression="defineHostVipService.listAvailableServices()" 
  14.                    result="flowScope.availableServicesInfoJSONData" /> 
  15.                     
  16.         <set name="flowScope.isViewAction" value="false" type="boolean" /> 
  17.                     
  18.     on-start> 
  19.      
  20.     <view-state id="aerEnvList" > 
  21.      
  22.         <on-render> 
  23.           <evaluate expression="aerEnvGridService.listAppEnvRequests()" result="flowScope.gridListInfoJSONData" /> 
  24.         on-render> 
  25.          
  26.         <transition on="add" to="defineApp" /> 
  27.         <transition on="confirm" to="aerRequestConfirm" > 
  28.              
  29.             <evaluate expression="aerEnvGridService.listEnvProvisionInfoByRequestId(requestParameters.requestId,flowRequestContext)"/> 
  30.             <set name="flowScope.isViewAction" value="true" type="boolean" /> 
  31.             <set name="flowScope.requestId" value="requestParameters.requestId" type="string"/> 
  32.         transition> 
  33.         <transition on="approve" to="aerEnvList"> 
  34.             <evaluate expression="adminService.approve(requestParameters.requestId)" /> 
  35.         transition> 
  36.         <transition on="close" to="aerEnvList"> 
  37.             <evaluate expression="adminService.close(requestParameters.requestId)" /> 
  38.         transition> 
  39.         <transition on="reject" to="aerEnvList"> 
  40.             <evaluate expression="adminService.reject(requestParameters.requestId)" /> 
  41.         transition> 
  42.         <transition on="cmdb" to="aerEnvList"> 
  43.             <evaluate expression="adminService.cmdb(requestParameters.requestId)" /> 
  44.         transition> 
  45.     view-state> 
  46.  
  47.     <view-state id="defineApp" >          
  48.      
  49.         <transition on="next" to="defineProject"> 
  50.           <evaluate expression="defineAppService.createAppInfo(requestParameters.appInfoJSONData)" 
  51.                    result="flowScope.appInfo"  /> 
  52.           <set name="flowScope.appInfoJSONData" value="requestParameters.appInfoJSONData" type="string"/> 
  53.           <set name="flowScope.hasAppInfoData" value="true" type="boolean"/> 
  54.         transition> 
  55.         <transition on="cancel" to="aerEnvList" > 
  56.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  57.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  58.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  59.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  60.         transition> 
  61.     view-state> 
  62.      
  63.     <view-state id="defineProject"> 
  64.         <transition on="previous" to="defineApp"/> 
  65.          
  66.         <transition on="next" to="defineHostVip">      
  67.             <evaluate expression="defineProjectService.createProjectInfo(requestParameters.projectInfoJSONData)" 
  68.                       result="flowScope.projectInfo"  /> 
  69.             <set name="flowScope.projectInfoJSONData" value="requestParameters.projectInfoJSONData" type="string"/> 
  70.             <set name="flowScope.hasProjectInfoData" value="true" type="boolean"/> 
  71.         transition> 
  72.         <transition on="cancel" to="aerEnvList"> 
  73.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  74.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  75.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  76.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  77.         transition> 
  78.     view-state> 
  79.      
  80.     <view-state id="defineHostVip"> 
  81.         <transition on="previous" to="defineProject"/> 
  82.  
  83.         <transition on="next" to="defineDBService"> 
  84.             <evaluate expression="defineHostVipService.createHostVipInfo(requestParameters.hostVipInfoJSONData, flowRequestContext)" 
  85.                       result="flowScope.hostVipInfo"  /> 
  86.             <set name="flowScope.hostVipInfoJSONData" value="requestParameters.hostVipInfoJSONData" type="string"/> 
  87.              
  88.             <set name="flowScope.hasHostVipInfoData" value="true" type="boolean"/> 
  89.             <set name="flowScope.services" value="requestParameters.services" type="string" /> 
  90.         transition> 
  91.         <transition on="cancel" to="aerEnvList"> 
  92.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  93.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  94.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  95.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  96.         transition> 
  97.     view-state> 
  98.      
  99.     <view-state id="defineDBService"> 
  100.         <transition on="previous" to="defineHostVip"/> 
  101.      
  102.         <transition on="next" to="aerRequestConfirm"> 
  103.             <evaluate expression="defineDBSrvService.createDBServiceInfo(requestParameters.dbServiceInfoJSONData, flowRequestContext)" 
  104.                       result="flowScope.dbServiceInfo"  /> 
  105.             <set name="flowScope.dbServiceInfoJSONData" value="requestParameters.dbServiceInfoJSONData" type="string"/> 
  106.             <set name="flowScope.hasDbServiceInfoData" value="true" type="boolean"/> 
  107.             <set name="flowScope.isSubmitted" value="false" type="boolean"/> 
  108.             <set name="flowScope.isViewAction" value="false" type="boolean" /> 
  109.         transition> 
  110.         <transition on="cancel" to="aerEnvList"> 
  111.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  112.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  113.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  114.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  115.         transition> 
  116.     view-state> 
  117.      
  118.     <view-state id="aerRequestConfirm"> 
  119.         <transition on="previous" to="defineDBService"/> 
  120.         <transition on="submit" to="aerRequestSummary">       
  121.             <evaluate expression="envProvisionRequestService.submitEnvProvisionRequest(flowRequestContext)" 
  122.                       result="flowScope.submitResult"  /> 
  123.         transition> 
  124.          
  125.          
  126.         <transition on="cancel" to="aerEnvList"> 
  127.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  128.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  129.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  130.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  131.         transition> 
  132.          
  133.         <transition on="adminSubmit" to="aerRequestSummary">          
  134.             <evaluate expression="envProvisionRequestService.updateEnvProvisionRequest(flowRequestContext)" 
  135.                       result="flowScope.submitResult"  /> 
  136.             <set name="flowScope.isViewAction" value="false" type="boolean" /> 
  137.  
  138.         transition> 
  139.          
  140.          
  141.         <transition on="adminCancel" to="aerEnvList"> 
  142.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  143.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  144.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  145.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  146.             <set name="flowScope.isViewAction" value="false" type="boolean" /> 
  147.         transition> 
  148.          
  149.          
  150.         <transition on="noAdminOK" to="aerEnvList"> 
  151.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  152.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  153.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  154.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  155.             <set name="flowScope.isViewAction" value="false" type="boolean" /> 
  156.         transition> 
  157.          
  158.          
  159.          
  160.          
  161.         <transition on="editApplicationInfo" to="defineApp"/> 
  162.         <transition on="editProjectInfo"  to="defineProject"/> 
  163.         <transition on="editHostVipInfo"  to="defineHostVip"/> 
  164.         <transition on="editDBServiceInfo"  to="defineDBService"/> 
  165.     view-state> 
  166.      
  167.     <view-state id="aerRequestSummary"> 
  168.         <transition on="ok" to="aerEnvList"> 
  169.             <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" /> 
  170.             <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" /> 
  171.             <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" /> 
  172.             <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/> 
  173.         transition> 
  174.     view-state> 
  175.      
  176.     <end-state id="finish"/> 
  177.              
  178. flow> 

这里,因为我们在这系列的第二篇文章中已经提及到,我们开启了包扫描机制,所以这些Spring的Bean在应用上下文创建的时候就已经实例化了,所以在这个流定义文件中可以轻松的使用这些bean.

 

 其实在做架构的时候,我曾和我们团队其他开发者讨论到为什么我们用spring web flow,其实这种页面跳转我们也可以不用web flow做,最后采用web flow的架构是基于以下几个原因:

众所周知,一般web应用的scope有 request,session,application,因为在很多配置页面上都有数据,并且这些数据都要共享,还比较大(那些传递的vo动辄100+字段)而且业务流程也比较复杂,而且这些数据还是有状态的,所以我们无法放在request scope上,而如果放在session scope上,又会加重系统的内存负担,所以我们需要一种介于request,session范围之间的scope,而spring web flow刚好提供了flow scope来精确的满足我们的需求,所以我们使用spring web flow.