现在讨论flow页面上的动作如何关联到flow定义文件中的transition.

因为我们这个应用是liferay portlet 应用,和绝大多数portlet一样,页面上的action,一般都会使用一个portlet action url 来标识。

比如,我们想要在defineApp 这个view-state,当点击"Next" 按钮时,要触发到一个flow 的transition:

首先,我们定义一个portlet action url:

  1. <portlet:actionURL var="nextStep">
  2. <portlet:param name="execution" value="${flowExecutionKey}" />
  3. <portlet:param name="_eventId" value="next" />
  4. </portlet:actionURL>

这里可以看到,我们要用若干个参数来定义这个actionURL,因为要给spring web flow使用,所以有一个必不可少的参数是execution,它的值永远是 ${flowExecutionKey} ,我们并不需要具体研究这个值是干嘛的,它是用spring web flow框架提供的,就是表明获取flow执行的key,因为这个页面属于某个特定的flow的view-state,所以这个值是唯一的,并且和flow有关

第二个参数_eventId也是必不可少的,它用于表示flow执行的事件Id,这个事件Id会被对应到状态的<transition>on属性,表明基于某个事件来进行transition.

当然了,除去execution _eventId之外,还可以有任意多个普通参数,这些普通参数都用<portlet:param>的名字-值对来表示,也作为transition的参数,这些参数可选的,和业务需求有关。

然后,我们就去看flow定义文件,因为当前页面是defineApp.jsp,所以我们找到了defineApp这个view-state,看它的transition:

  1. <view-state id="defineApp" >
  2. <transition on="next" to="defineProject">
  3. <evaluate expression="defineAppService.createAppInfo(requestParameters.appInfoJSONData)"
  4. result="flowScope.appInfo"  />
  5. <set name="flowScope.appInfoJSONData" value="requestParameters.appInfoJSONData" type="string"/>
  6. <set name="flowScope.hasAppInfoData" value="true" type="boolean"/>
  7. </transition>
  8. ...
  9. </view-state>

从这里可以看出,我们有个元素叫<transition>并且属性为on,这个on 刚好匹配这个页面上actionURL传递过来的_eventId, 而to 则表示了页面跳转到的目标页面,所以这里可以看出,当触发这个action URL时候,flow会从当前的defineApp.jsp跳转到defineProject.jsp

哦,不,等下,跳转不是白跳的,肯定会有些数据的交互和保存,所以这里可以看到2个子元素,一个是<evaluate>,这个元素表示执行某个方法,因为我们已经初始化了defineAppService这个bean,所以它会调用相应的方法,并且吧结果存到流的flowScope域上,同时,它还存放了其他2个变量到flowScope上,于是这些变量在flow跳转的任何地方都是可用的。

最后,我们就要吧这个页面上的portlet actionURL绑定到页面元素上了,因为这个action的触发总是用户与页面的交互事件来触发的:

我们的前端用的是ext-js,所以,我们先定义了一个ext-js的button,然后渲染到defineApp.jsp上:

  1. items:[
  2. {
  3. xtype:'button',
  4. name:'btnCancel',
  5. margin:'0 10 0 0',
  6. width:100,
  7. text:'Cancel'
  8. },
  9.                       xtype:'button', 
  10.                       name:'btnNextInDefineApp', 
  11.                       width:100, 
  12.                       text:'Next' 
  13.                   } 
  14. ]

在控制器里面我们定义了这个事件触发:

  1. this.control({
  2. 'button[name=btnNextInDefineApp]':{
  3. click:function(btn){
  4. var form = btn.up('[name=sbumitform]');
  5. if(form.getForm().isValid()){
  6. var paraObj = form.getValues();
  7. var appInfoJSONData = {};
  8. for(var index in paraObj){
  9. if(index !='title' && index !='url'){
  10. appInfoJSONData[index] = paraObj[index];
  11. }
  12. }
  13. var titleArr = paraObj.title;
  14. var urlArr =paraObj.url;
  15. var docInfos = [];
  16. if(Ext.isArray(titleArr)&&Ext.isArray(urlArr)){
  17. Ext.each(titleArr,function(val,i){
  18. var _doc = {title:val,url:urlArr[i]};
  19. docInfos.push(_doc);
  20. });
  21. }else{
  22. docInfos.push({title:titleArr,url:urlArr});
  23. }
  24. appInfoJSONData.docInfos = docInfos;
  25. var url = nextStep+'&_envprovisioningportlet_WAR_envprovisioningportlet_appInfoJSONData=' +Ext.encode(appInfoJSONData);
  26. window.location.href = url;
  27. }
  28. }
  29. },

这里我们可以看到,当点击btnNextInDefineApp这个按钮时候,它会提交所有的数据到url为var url = nextStep+'&_envprovisioningportlet_WAR_envprovisioningportlet_appInfoJSONData=' +Ext.encode(appInfoJSONData);

而这个url的起始值为变量名nextStep ,它刚好匹配我们一开始的portlet action url 我们给它分配的var的名字:

  1. <portlet:actionURL var="nextStep">
  2. ...
  3. </portlet:actionURL>

所以现在当用户点击按钮,我们就携带了数据,然后流就可以处理相应的数据了。

我们携带的数据的名字叫appInfoJSONData ,见拼接的url,所以,在flow里面就可以从requestParameters里面获取相应的值并且进行业务计算了(见我加粗部分):

  1. <evaluate expression="defineAppService.createAppInfo(requestParameters.appInfoJSONData)"
  2. result="flowScope.appInfo"  />
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1138922,如需转载请自行联系原作者

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

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

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

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

    流控制文件很简单,就是根元素是<view>,然后用<view-state>来代表一个一个的页面,用<transition>来代表从一个状态到另外一个状态的跳转,如果 ...

  3. 深入解析Spring MVC与Web Flow

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

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

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

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

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

  6. Portlet MVC框架

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

  7. 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 ...

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

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

  9. Spring Web Flow实例教程

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

  10. Spring Web Flow 2.0 入门详解

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

最新文章

  1. QIIME 2教程. 27语义类型Semantic(2020.11)
  2. Sublime使用的插件和快捷键
  3. Vue -- 配合iView实现省市二级联动
  4. 追踪JVM中的本地内存
  5. php分目录存放session,phpsession实现多级目录存放实现代码,phpsession_PHP教程
  6. mysql 删除过期日志_【转】对mysql日志进行操作的总结包括 启用,过期自动删除 等...
  7. debian php mysql 安装_在 Debian 下安装 Apache,MySQL,PHP
  8. 【C++ Primer | 15】面试问题
  9. java 反射 单例类_利用反射机制破坏单例模式
  10. 7-37 整数分解为若干项之和 (20 分)(dfs)
  11. 论PHP框架设计模式及MVC的缺陷
  12. 源码编译搭建LAMP环境
  13. 怎样正确的理解和解决 ORA-01843:not a valid month
  14. python3中filter、map、reduce、apply、zip函数用法总结
  15. 编程成长日记——折半查找
  16. python 多重类继承__init__
  17. 机器学习之朴素贝叶斯分类算法
  18. 领导驾驶舱在企业中逐渐占领地位
  19. 面对物联网安全隐患高墙,熵核科技如何实现突围
  20. 本题要求递归实现一个计算X的N次方 (n≥1)的函数。

热门文章

  1. Foreach In(C#)
  2. 100篇文献-万字总结 || 强化学习求解车间调度
  3. 高级GIS-1.提取纯净像元
  4. day11--Matplotlib--柱形图与盒图
  5. arcpy 实现列举目录下的要素类与描述矢量数据要素类
  6. 逐像元地表反射率计算(GF4)
  7. 遥感基础编程语言IDL介绍
  8. 实习成长之路——设计模式实战一:充血模型DDD与贫血模型MVC的区别?如何利用DDD开发一个虚拟钱包系统?
  9. molloc/free和new/delete的区别
  10. Hibernate检索方式简单总结