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

简介:

 

现在讨论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.      
  3.         <transition on="next" to="defineProject"> 
  4.           <evaluate expression="defineAppService.createAppInfo(requestParameters.appInfoJSONData)" 
  5.                    result="flowScope.appInfo"  /> 
  6.           <set name="flowScope.appInfoJSONData" value="requestParameters.appInfoJSONData" type="string"/> 
  7.           <set name="flowScope.hasAppInfoData" value="true" type="boolean"/> 
  8.         </transition> 
  9.         
  10. ...
  11.  
  12.     </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.                          
  25.                         appInfoJSONData.docInfos = docInfos; 
  26.                          
  27.                         var url = nextStep+'&_envprovisioningportlet_WAR_envprovisioningportlet_appInfoJSONData=' +Ext.encode(appInfoJSONData); 
  28.                         window.location.href = url; 
  29.                     } 
  30.                      
  31.                 } 
  32.             }, 

这里我们可以看到,当点击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,如需转载请自行联系原作者

目录
相关文章
|
6天前
|
缓存 Kubernetes Java
阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战
SAE 事件中心通过智能诊断显示通知与用户连接起来,SAE WEB 百毫秒弹性实例给事件中心带来了新的实时性、海量数据和高吞吐的挑战,本篇将带您了解 SAE 整体事件中心的架构和挑战。
|
11天前
|
运维 安全 网络安全
Web安全-企业网络架构
Web安全-企业网络架构
16 1
|
1月前
|
前端开发 安全 JavaScript
构建高效Web应用:前后端分离架构的实践
【9月更文挑战第4天】在数字时代,Web应用已成为企业与用户互动的主要平台。本文将介绍如何通过前后端分离的架构设计来构建高效的Web应用,探讨该架构的优势,并分享实现过程中的关键步骤和注意事项。文章旨在为开发者提供一种清晰、高效的开发模式,帮助其在快速变化的市场环境中保持竞争力。
|
1月前
|
前端开发 安全 Java
技术进阶:使用Spring MVC构建适应未来的响应式Web应用
【9月更文挑战第2天】随着移动设备的普及,响应式设计至关重要。Spring MVC作为强大的Java Web框架,助力开发者创建适应多屏的应用。本文推荐使用Thymeleaf整合视图,通过简洁的HTML代码提高前端灵活性;采用`@ResponseBody`与`Callable`实现异步处理,优化应用响应速度;运用`@ControllerAdvice`统一异常管理,保持代码整洁;借助Jackson简化JSON处理;利用Spring Security增强安全性;并强调测试的重要性。遵循这些实践,将大幅提升开发效率和应用质量。
54 7
|
1月前
|
设计模式 存储 SQL
在web框架中实现解释器架构
【9月更文挑战第3天】解释器架构风格基于解释器设计模式,通过将问题建模为特定语言或指令集并逐条解析执行。然而,解释器风格也可能面临性能问题和扩展性限制。
25 1
|
2月前
|
Java Spring Maven
Struts 2遇见Spring:这个组合如何颠覆你的Web开发?
【8月更文挑战第31天】在现代Web开发中,Struts 2与Spring的结合使用能显著增强应用的模块化和可维护性。本文将介绍如何整合这两个框架,并提供代码示例。首先,在`pom.xml`中添加Struts 2和Spring的依赖,然后在`struts.xml`中配置Struts 2以识别Spring插件。接着,在Spring配置文件中定义bean,并在Struts 2的Action类中使用`@Autowired`注解进行自动注入。
30 0
|
2月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
67 0
|
2月前
|
Java Spring
🔥JSF 与 Spring 强强联手:打造高效、灵活的 Web 应用新标杆!💪 你还不知道吗?
【8月更文挑战第31天】JavaServer Faces(JSF)与 Spring 框架是常用的 Java Web 技术。本文介绍如何整合两者,发挥各自优势,构建高效灵活的 Web 应用。首先通过 `web.xml` 和 `ContextLoaderListener` 配置 Spring 上下文,在 `applicationContext.xml` 定义 Bean。接着使用 `@Autowired` 将 Spring 管理的 Bean 注入到 JSF 管理的 Bean 中。
37 0
|
2月前
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
58 0
|
2月前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
31 0

推荐镜像

更多
下一篇
无影云桌面