【liferay】5、使用PortletURL进行跨portlet通信 liferay6.2
【问题】
1、当我们一个页面存在多一个portlet的时候,如在不同的portlet之间传参?
【解决办法】
1、在liferay官方有几种方式,比较复杂麻烦,不是太实用,这里不再赘述。
2、通过friendlyurl后缀中用?param1=111的方式可以传参,但是如果我们把友好url修改了,也需要修改代码,不是很方便
3、那么还有一种方式,我们可以使用PortletURL来进行传参数
案例展示:
目前右边没有显示任何值
这里使用了是一个弹出框,其实关键就是其中的url,如果是从定向那么就会直接显示到当前页面中, 这是两个不同的portlet
【实例操作】
首先我们需要2个portlet,新建2个portlet,iframe-demo和url-params
首先我们初始化ifream的页面
<%@page import="com.liferay.portal.kernel.portlet.LiferayWindowState" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %> <portlet:defineObjects />
<!-- 这个是用来定义一个参数 -->
<c:set var="basepath" value="${pageContext.request.contextPath }" />
<script type="text/javascript" src="${basepath }/js/jQuery/jquery-1.12.3.min.js"> </script> <!-- action是页面渲染之前跳转 -->
<portlet:actionURL var="iframeDemo" name="iframeDemo" windowState="<%=LiferayWindowState.POP_UP.toString() %>">
<portlet:param name="jspPage" value="/html/iframedemo/portletIframeDemo.jsp"/>
</portlet:actionURL> <!-- 这个是已经确定页面了,之后的跳转 -->
<portlet:renderURL var="render1" /> <!-- 跨portlet消息 plid为目标portlet所在的页面的id -->
<liferay-portlet:renderURL var="portletViewUrl" plid="${viewPild }" portletName="coudconfigportle_WAR_demoportlet" windowState="pop_up">
<liferay-portlet:param name="mvcPath" value="/html/coudconfigportle/view.jsp"/>
<liferay-portlet:param name="portletValue1" value="${portletValue1 }"/>
</liferay-portlet:renderURL> <style> .iframeDemoBox {
background:#dcdcdc;
height:100px;
width:500px;
} .leftDiv {
float:left;
width:200px;
} .right_box {
float:right;
height:100px;
width:250px;
} </style> <div class="iframeDemoBox">
<div class="leftDiv">
<ul>
<li><a href="javascript:iframeportlet()">portlet导航</a></li>
<li><a href="javascript:iframejsp()">jsp导航</a></li>
<li><a href="javascript:ajaxnav()">ajax导航</a></li>
</ul>
</div>
<div class="right_box">
<iframe id="demo_iframe" height="100px" width="250px" ></iframe>
</div>
</div>
<br>
<div>
<ul>
<li>portlet之间传值demo:<input id="betweenPortletPlid" type="button" class="btn-info" value="${demo }" /></li>
<li>portlet之间传值plid:<input id="betweenPortletPlid" type="button" class="btn-info" value="${viewPild }" /></li>
<li>portlet之间传值:<input id="betweenPortletValue" type="text" class="btn" /></li>
</ul> </div>
<br/> <input type="text" class="btn-info" value="${render1 }" size="100px"/> <br>
plid:${viewPild } <br/>
url:${portletViewUrl} <br/>
portletName=${portletName } <br/>
portletValue1=${portletValue1 }<br/> <br/>
urljava:${viewUrl} <br/>
<liferay-ui:icon image="view" url="${viewUrl}" useDialog="true" /><br/>
第二个使用标签进行设置url:<liferay-ui:icon image="view" url="${portletViewUrl}" useDialog="true" /><br/> <script> function iframeportlet(){
$('#demo_iframe').attr('src','${iframeDemo}');
}
function iframejsp(){
var url = '${basepath}/html/iframedemo/jspdemo.jsp';
$('#demo_iframe').attr('src',url);
} function ajaxnav(){
//演示环境,一个页面,所以先将IFrame元素移除
$('#right_box iframe').remove();
var url = '${basepath}/html/iframedemo/ajax.jsp';
$.get(url,function(data){
$('#right_box').html(data);
})
} function ajax1() {
window.location = "${render1}?betweenPortletValue=" + $("#betweenPortletValue").val();
} function openNew() {
//获取页面body!内容!的高度和宽度
var sHeight = document.documentElement.scrollHeight;
var sWidth = document.documentElement.scrollWidth;
//获取可视区域高度,宽度与页面内容的宽度一样
var wHeight = document.documentElement.clientHeight;
//创建遮罩层div并插入body
var oMask = document.createElement("div");
oMask.id = "mask";
oMask.style.height = sHeight + "px";
//宽度直接用100%在样式里
document.body.appendChild(oMask);
//创建登录层div并插入body
var oLogin = document.createElement("div");
oLogin.id = "login";
oLogin.innerHTML = "<div class='loginCon'><div id='close'></div></div>"
document.body.appendChild(oLogin);
//获取login的宽度和高度并设置偏移值
var dHeight = oLogin.offsetHeight;
var dWidth = oLogin.offsetWidth;
oLogin.style.left = (sWidth - dWidth) / 2 + "px";
oLogin.style.top = (wHeight - dHeight) / 2 + "px";
//获取关闭按钮
var oClose = document.getElementById("close");
oMask.onclick = oClose.onclick = function() {
document.body.removeChild(oMask);
document.body.removeChild(oLogin);
}
}
</script>
ifream后台代码
package com.xiaof.Iframe; import java.io.IOException; import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse; import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portlet.PortletURLFactoryUtil;
import com.liferay.util.bridges.mvc.MVCPortlet; /**
* Liferay中左右布局的示例
* iframe
*/
public class IframeDemo extends MVCPortlet { private final static String WAR = "_WAR_";
private static Log log = LogFactoryUtil.getLog(IframeDemo.class); @Override
public void doView(RenderRequest renderRequest,
RenderResponse renderResponse) throws IOException, PortletException {
// TODO Auto-generated method stub
//获取对应的portlet的plid
log.debug("测试");
ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
long viewPild = themeDisplay.getPlid();
// viewPild = PortalUtil.getPlidFromFriendlyURL(themeDisplay.getCompanyId(), "/web/xiaof/configportlet");
// renderRequest.setAttribute("viewPild", viewPild);
//portletName为目标Portlet的名称,这个名称的规则是固定的,以_WAR_分割,
//前面是portlet.xml里面的portletname,后面为当前portlet所在的工程名称,如果news-portlet,
//这里就是newsportlet,如果是CMS-portlet,这里就是CMSportlet。
//coudconfigportle_WAR_demoportlet urlparams_WAR_demoportlet
String portletName = "urlparams_WAR_demoportlet";
// renderRequest.setAttribute("portletName", portletName);
// renderRequest.setAttribute("portletValue1", "portletValue1"); PortletURL viewUrl = PortletURLFactoryUtil.create(renderRequest, portletName, viewPild, PortletRequest.RENDER_PHASE);
viewUrl.setParameter("portletValue1", "mytest11"); System.out.println("请求的url:" + viewUrl.toString()); renderRequest.setAttribute("viewUrl", viewUrl.toString()); super.doView(renderRequest, renderResponse);
} public void iframeDemo(ActionRequest actionRequest,ActionResponse actionResponse) {
actionRequest.setAttribute("demo", "这是portlet的iframe");
// UrlConfigLocalServiceUtil.
} }
注意,这个代码中的
plid是页面id,在layout表
接下来我们看看获取参数的portlet
UrlParamsPortlet
package com.xiaof.urlparam; import java.io.IOException;
import java.util.Enumeration; import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.servlet.http.HttpServletRequest; import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet; /**
* Portlet implementation class UrlParamsPortlet
*/
public class UrlParamsPortlet extends MVCPortlet { @Override
public void doView(RenderRequest renderRequest,
RenderResponse renderResponse) throws IOException, PortletException { //获取url参数 portletValue1 _coudconfigportle_WAR_demoportlet_portletValue1
String param1 = renderRequest.getParameter("portletValue1");
renderRequest.setAttribute("param1", param1); // Enumeration<String> enumerations = renderRequest.getAttributeNames();
// while(enumerations.hasMoreElements()) {
// String temp = enumerations.nextElement();
// System.out.println("Enumeration[" + temp + ":" + renderRequest.getAttribute(temp));
// } HttpServletRequest requestPortlet = PortalUtil.getHttpServletRequest(renderRequest);
String param2 = (String) requestPortlet.getParameter("portletValue1");
requestPortlet.setAttribute("param2", param2); //原生http
HttpServletRequest request = PortalUtil.getOriginalServletRequest(requestPortlet);
String param3 = (String) request.getParameter("portletValue1");
request.setAttribute("param3", param3);
System.out.println("UrlParamsPortlet:\nparam1:" + param1 + "\nparam2:" + param2 + "\nparam3:" + param3); super.doView(renderRequest, renderResponse);
} }
页面
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <portlet:defineObjects /> <h1>测试url传参数的portlet</h1>
参数:<br/>
<b>param1</b>:${param1 }<br/>
<b>param2</b>:${param2 }<br/>
<b>param3</b>:${param3 }<br/>
最后:代码sdk项目已经上传到码云,有兴趣的同学可以下载下来看看:https://gitee.com/cutterPpoint/liferay
【liferay】5、使用PortletURL进行跨portlet通信 liferay6.2的更多相关文章
- Android随笔之——跨进程通信(一) Activity篇
在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...
- html5 postMessage解决iframe跨协议跨域通信问题
a.html有个iframe载入b.com/login.html,当login完成时通知a.html页面登录完成并传递UserName 1.a.html 监听消息 window.addEventLis ...
- 通信服务器群集——跨服务器通信Demo(源码)
对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...
- 对iframe跨域通信的封装
github源码:https://github.com/boycy815/topProxy 为了偷懒所以依赖了Kissy:http://docs.kissyui.com/ 用法举例:需求是在http: ...
- JavaScript 跨域:window.postMessage 实现跨域通信
JavaScript 跨域方式实现方式有很多,之前,一篇文章中提到了 JSONP 形式实现跨域.本文将介绍 HTML5 新增的 api 实现跨域:window.postMessage . 1 othe ...
- 【JavsScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- 【JavaScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- WinForm实现跨进程通信的方法
public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...
- 使用 JSONP 实现跨域通信
简介 Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的 ...
随机推荐
- 2018.11.24 loj#111. 后缀排序(后缀数组)
传送门 后缀排序模板题. 终于会后缀数组了(然而只会倍增并不会DC3DC3DC3). 在这里列举几个数组的意思: sai:sa_i:sai:当前排名第iii的后缀的起始下标. rkirk_irki ...
- mybatis中文官网
http://www.mybatis.org/mybatis-3/zh/index.html
- vue-cli引入mui的步骤
不用npm安装了 1.mui官方GitHub下载mui所需文件 https://github.com/dcloudio/mui 把下载来的dist文件夹整个复制到static文件夹中 2.在index ...
- Educational Codeforces Round 51 F. The Shortest Statement(lca+最短路)
https://codeforces.com/contest/1051/problem/F 题意 给一个带权联通无向图,n个点,m条边,q个询问,询问两点之间的最短路 其中 m-n<=20,1& ...
- 已经安装了客户端,但是cmd输入sqlcmd报错:Sqlcmd:Error:Connection failure.SQL Native Client is not installed correctly
以前安装了sqlserver2008,没有卸载掉,后面又安装了sqlserver2014,所以系统环境变量中既有2008的环境变量的配置,又有2014的环境变量的配置,所以在终端输入sqlcmd时报错 ...
- IntelliJ IDEA 2017版 使用笔记(十二) 其他操作:IDEA 快捷键
其他操作 文件操作: 一.文件操作 新建文件ctrl+shift+n 二.复制当前文件 快捷键:F5 三.移动当前文件 快捷键 :F6 文 ...
- C++编译器详解(三)函数调用的区别:_cdecl以及_stdcall
1._stdcall是Pascal程序的缺省调用方式,通常用于Win32 API中,函数采用从右到左的压栈方式,自己在退出时清空堆栈.VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上&qu ...
- (广搜)Fire Game -- FZU -- 2150
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82828#problem/I Fire Game Time Limit:1000MS ...
- eclipse查看方法被那些代码调用open call hierarchy
当我们编写的代码量十分巨大,项目十分复杂的时候,想要查找某一个方法都被其他那些代码调用了是一件十分困难的事,然后Eclipse提供了十分方便的方法用于查看方法都被那些代码调用了. 方法一: 选中要查看 ...
- Curl工具的使用
Curl命令可以通过命令行的方式,执行Http请求.在Elasticsearch中有使用的场景,因此这里研究下如何在windows下执行curl命令. 工具下载 在官网处下载工具包:http:// ...