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

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

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

因为图片实在太长,所以我没办法吧整个图片都截下来,这里只截取部分,对于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. <!-- initialize all the variables in the flowScope -->
  6. <on-start>
  7. <evaluate expression="envProvisionInitService.initialize(flowRequestContext)" />
  8. <!-- initialize the flowScope variable:gridList to render the grid list -->
  9. <!-- <evaluate expression="aerEnvGridService.listAppEnvRequests()"
  10. result="flowScope.gridListInfoJSONData" />
  11. -->
  12. <!--  initialize the flowScope variable: availableServices to be used in hostvip info -->
  13. <evaluate expression="defineHostVipService.listAvailableServices()"
  14. result="flowScope.availableServicesInfoJSONData" />
  15. <set name="flowScope.isViewAction" value="false" type="boolean" />
  16. </on-start>
  17. <view-state id="aerEnvList" >
  18. <on-render>
  19. <evaluate expression="aerEnvGridService.listAppEnvRequests()" result="flowScope.gridListInfoJSONData" />
  20. </on-render>
  21. <transition on="add" to="defineApp" />
  22. <transition on="confirm" to="aerRequestConfirm" >
  23. <!-- fetch the data from web service and ready for populating data -->
  24. <evaluate expression="aerEnvGridService.listEnvProvisionInfoByRequestId(requestParameters.requestId,flowRequestContext)"/>
  25. <set name="flowScope.isViewAction" value="true" type="boolean" />
  26. <set name="flowScope.requestId" value="requestParameters.requestId" type="string"/>
  27. </transition>
  28. <transition on="approve" to="aerEnvList">
  29. <evaluate expression="adminService.approve(requestParameters.requestId)" />
  30. </transition>
  31. <transition on="close" to="aerEnvList">
  32. <evaluate expression="adminService.close(requestParameters.requestId)" />
  33. </transition>
  34. <transition on="reject" to="aerEnvList">
  35. <evaluate expression="adminService.reject(requestParameters.requestId)" />
  36. </transition>
  37. <transition on="cmdb" to="aerEnvList">
  38. <evaluate expression="adminService.cmdb(requestParameters.requestId)" />
  39. </transition>
  40. </view-state>
  41. <view-state id="defineApp" >
  42. <transition on="next" to="defineProject">
  43. <evaluate expression="defineAppService.createAppInfo(requestParameters.appInfoJSONData)"
  44. result="flowScope.appInfo"  />
  45. <set name="flowScope.appInfoJSONData" value="requestParameters.appInfoJSONData" type="string"/>
  46. <set name="flowScope.hasAppInfoData" value="true" type="boolean"/>
  47. </transition>
  48. <transition on="cancel" to="aerEnvList" >
  49. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  50. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  51. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  52. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  53. </transition>
  54. </view-state>
  55. <view-state id="defineProject">
  56. <transition on="previous" to="defineApp"/>
  57. <transition on="next" to="defineHostVip">
  58. <evaluate expression="defineProjectService.createProjectInfo(requestParameters.projectInfoJSONData)"
  59. result="flowScope.projectInfo"  />
  60. <set name="flowScope.projectInfoJSONData" value="requestParameters.projectInfoJSONData" type="string"/>
  61. <set name="flowScope.hasProjectInfoData" value="true" type="boolean"/>
  62. </transition>
  63. <transition on="cancel" to="aerEnvList">
  64. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  65. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  66. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  67. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  68. </transition>
  69. </view-state>
  70. <view-state id="defineHostVip">
  71. <transition on="previous" to="defineProject"/>
  72. <transition on="next" to="defineDBService">
  73. <evaluate expression="defineHostVipService.createHostVipInfo(requestParameters.hostVipInfoJSONData, flowRequestContext)"
  74. result="flowScope.hostVipInfo"  />
  75. <set name="flowScope.hostVipInfoJSONData" value="requestParameters.hostVipInfoJSONData" type="string"/>
  76. <!-- additional set one field to pass the service list to next page(defineDBService.jsp) -->
  77. <set name="flowScope.hasHostVipInfoData" value="true" type="boolean"/>
  78. <set name="flowScope.services" value="requestParameters.services" type="string" />
  79. </transition>
  80. <transition on="cancel" to="aerEnvList">
  81. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  82. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  83. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  84. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  85. </transition>
  86. </view-state>
  87. <view-state id="defineDBService">
  88. <transition on="previous" to="defineHostVip"/>
  89. <transition on="next" to="aerRequestConfirm">
  90. <evaluate expression="defineDBSrvService.createDBServiceInfo(requestParameters.dbServiceInfoJSONData, flowRequestContext)"
  91. result="flowScope.dbServiceInfo"  />
  92. <set name="flowScope.dbServiceInfoJSONData" value="requestParameters.dbServiceInfoJSONData" type="string"/>
  93. <set name="flowScope.hasDbServiceInfoData" value="true" type="boolean"/>
  94. <set name="flowScope.isSubmitted" value="false" type="boolean"/>
  95. <set name="flowScope.isViewAction" value="false" type="boolean" />
  96. </transition>
  97. <transition on="cancel" to="aerEnvList">
  98. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  99. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  100. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  101. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  102. </transition>
  103. </view-state>
  104. <view-state id="aerRequestConfirm">
  105. <transition on="previous" to="defineDBService"/>
  106. <transition on="submit" to="aerRequestSummary">
  107. <evaluate expression="envProvisionRequestService.submitEnvProvisionRequest(flowRequestContext)"
  108. result="flowScope.submitResult"  />
  109. </transition>
  110. <!--
  111. <transition on="submit" to="aerRequestSummary"/>
  112. -->
  113. <transition on="cancel" to="aerEnvList">
  114. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  115. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  116. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  117. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  118. </transition>
  119. <transition on="adminSubmit" to="aerRequestSummary">
  120. <evaluate expression="envProvisionRequestService.updateEnvProvisionRequest(flowRequestContext)"
  121. result="flowScope.submitResult"  />
  122. <set name="flowScope.isViewAction" value="false" type="boolean" />
  123. </transition>
  124. <!--
  125. <transition on="submit" to="aerRequestSummary"/>
  126. -->
  127. <transition on="adminCancel" to="aerEnvList">
  128. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  129. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  130. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  131. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  132. <set name="flowScope.isViewAction" value="false" type="boolean" />
  133. </transition>
  134. <transition on="noAdminOK" to="aerEnvList">
  135. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  136. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  137. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  138. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  139. <set name="flowScope.isViewAction" value="false" type="boolean" />
  140. </transition>
  141. <!--add 4 event to distingush different partin the request confirmation page-->
  142. <transition on="editApplicationInfo" to="defineApp"/>
  143. <transition on="editProjectInfo"  to="defineProject"/>
  144. <transition on="editHostVipInfo"  to="defineHostVip"/>
  145. <transition on="editDBServiceInfo"  to="defineDBService"/>
  146. </view-state>
  147. <view-state id="aerRequestSummary">
  148. <transition on="ok" to="aerEnvList">
  149. <evaluate expression="defineAppService.removeAppInfo(flowRequestContext)" />
  150. <evaluate expression="defineProjectService.removeProjectInfo(flowRequestContext)" />
  151. <evaluate expression="defineHostVipService.removeHostVipInfo(flowRequestContext)" />
  152. <evaluate expression="defineDBSrvService.removeDBServiceInfo(flowRequestContext)"/>
  153. </transition>
  154. </view-state>
  155. <end-state id="finish"/>
  156. </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.

本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1138856,如需转载请自行联系原作者

MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 5相关推荐

  1. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 1

    春节前我曾经为一个项目做架构,作为公司机密我无法透露这个项目的背景,但是它的实现技术主要是如下: 前端: ext-js (这个作为富客户端的javascript框架还是有极强的竞争力的,因为比较炫) ...

  2. 深入解析Spring MVC与Web Flow

    深入解析Spring MVC与Web Flow 诚邀加入图灵俱乐部:http://groups.csdn.net/Turingbooks "本书为Spring社区弥补了一大空白." ...

  3. intellij选择困难症Spring Batch/Data JPA/Integration/MVC/Security/Web Flow/Web Services到底选哪个?

    新建工程碰到这么个东西... um...首先想说这些并不是非选不可的,只是根据你的需要,一些初始化的工程结构模板,让你减少点工作量而已. 选项 作用 Spring Batch   Data Data ...

  4. portlet java_[Java] 使用 Spring 2 Portlet MVC 框架构建 Portlet 应用

    Spring 除了支持传统的基于 Servlet 的 Web 开发之外,也支持 JSR 168 Portlet 的开发.Spring Portlet MVC 框架尽可能多地继承了 Spring Ser ...

  5. Portlet MVC框架

    Portlet MVC框架 16.1. 介绍 Spring不仅支持传统(基于Servlet)的Web开发,也支持JSR-168 Portlet开发. Portlet MVC框架尽可能多地采用Web M ...

  6. python 框架和 spring mvc_整合WebSphere Portal 7和Spring 3.0 Portlet MVC(下)

    在<整合WebSphere Portal 7和Spring 3.0 Portlet MVC(上)>中,笔者指导你通过设置Spring 3.0 Portlet MVC框架,使它与运行在Web ...

  7. Spring Security MVC登录注销示例教程

    Spring Security MVC登录注销示例教程 今天我们将了解Spring Security Login Example.在阅读这篇文章之前,请先阅读我在"Spring 4 Secu ...

  8. Spring Web Flow实例教程

    目录: 参考文献 购物车用例 什么情况下可以使用 Spring Web Flow? 配置 Spring Web MVC 配置 Spring Web Flow 2.0 的基础 在购物车示例应用中配置 S ...

  9. Spring Web Flow 2.0 入门详解

    目录: 参考文献 购物车用例 什么情况下可以使用 Spring Web Flow? 配置 Spring Web MVC 配置 Spring Web Flow 2.0 的基础 在购物车示例应用中配置 S ...

最新文章

  1. iOS_25彩票_幸运转盘
  2. Cell子刊:源自微生物群的醋酸盐能够在健康和疾病期间促进大脑先天免疫系统的代谢适应性...
  3. 我看过的SDN方面的好文章
  4. ITTC数据挖掘平台介绍(四) 框架改进和新功能
  5. C语言多线程教程(pthread)(线程创建pthread_t,指定线程run方法pthread_create,加mutex锁,解锁,伪共享 false sharing【假共享】)
  6. spring boot 跨域请求_SpringBoot 系列教程 web 篇之自定义请求匹配条件 RequestCondition...
  7. Counting Bits
  8. 展望 | 2020年人工智能八大趋势
  9. php 数组 构造为树,从PHP中的平面数组构建树
  10. 机器学习实战8-Apriori算法
  11. IT人:如何预防久坐伤身?
  12. h2事务与mysql_H2数据库事务提交失败
  13. 怎么找网页源文件位置_html网页源代码是什么 如何查看网页源代码经验篇
  14. wenz ces123
  15. 海康视频转码 - 标准mp4格式(java)
  16. exFAT硬盘写保护修复远程登录提示到期
  17. Google 展示广告
  18. 【杀毒】-记一次挖矿病毒sysdrr杀毒
  19. 生命的枯榮竟是如此慘厲
  20. Java趣味编程(二)

热门文章

  1. 产品策略研究期的数据分析与挖掘
  2. [LeetCode]题解(python):013-Roman to Integer
  3. page_index--template.html(0)源码
  4. wince mysql吗_wince的数据库操作
  5. python实现ks算法_Python实现Dijkstra算法
  6. iOS 11开发教程(十四)iOS11应用代码添加视图
  7. Xamarin XAML语言教程基本页面ContentPage占用面积
  8. 分享Kali Linux 2016.2第49周镜像文件
  9. Kali Linux 2016.2初体验使用总结
  10. mycat是什么_MYCAT学习2