【问题】

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的更多相关文章

  1. Android随笔之——跨进程通信(一) Activity篇

    在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...

  2. html5 postMessage解决iframe跨协议跨域通信问题

    a.html有个iframe载入b.com/login.html,当login完成时通知a.html页面登录完成并传递UserName 1.a.html 监听消息 window.addEventLis ...

  3. 通信服务器群集——跨服务器通信Demo(源码)

    对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...

  4. 对iframe跨域通信的封装

    github源码:https://github.com/boycy815/topProxy 为了偷懒所以依赖了Kissy:http://docs.kissyui.com/ 用法举例:需求是在http: ...

  5. JavaScript 跨域:window.postMessage 实现跨域通信

    JavaScript 跨域方式实现方式有很多,之前,一篇文章中提到了 JSONP 形式实现跨域.本文将介绍 HTML5 新增的 api 实现跨域:window.postMessage . 1 othe ...

  6. 【JavsScript】父子页面之间跨域通信的方法

    由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...

  7. 【JavaScript】父子页面之间跨域通信的方法

    由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...

  8. WinForm实现跨进程通信的方法

    public class WinMessageHelper { private struct COPYDATASTRUCT { public IntPtr dwData; public int cbD ...

  9. 使用 JSONP 实现跨域通信

    简介 Asynchronous JavaScript and XML (Ajax) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术.Ajax 允许在不干扰 Web 应用程序的 ...

随机推荐

  1. gj12-2 协程和异步io

    12.3 epoll+回调+事件循环方式url import socket from urllib.parse import urlparse # 使用非阻塞io完成http请求 def get_ur ...

  2. excel2007VBA绘图2

    '--------------------------------------------------------Module1------------------------------------ ...

  3. maven学习之一:maven安装

    1.下载maven: 地址:https://maven.apache.org/ 点击download后; 解压: 解压后放在d:\develop目录下 下面我们去配置环境变量,找到计算机,右键,找到属 ...

  4. Mybatis-Plus 实战完整学习笔记(四)------全局参数配置

    一.全局配置设置 (1)全局配置Id自动生成 <!--定义mybatisplus全局配置--> <bean id="globalConfig" class=&qu ...

  5. 学以致用十七-----shell脚本之比较数字和字符串及if else

    非常需要注意的是shell脚本对空格要求非常严格, 如: 比较字符串   (不能用于比较字符串) 以上这种写法会报错 因此比较字符串不用 单中括号 [ ] -----------------有误 而是 ...

  6. .net 打开Excel文档并转为DataTable

    /// <summary> /// 打开Excel文档并转为DataTable /// </summary> /// <returns></returns&g ...

  7. js格式化文件大小, 输出成带单位的字符串工具

    /** * 格式化文件大小, 输出成带单位的字符串 * @method formatSize * @grammar formatSize( size ) => String * @grammar ...

  8. oss 上传文件夹-cloud2-泽优软件

    说明: 1. 修复同时上传多个文件夹崩溃的问题. 2. 修复阿里云(OSS)特殊文件名称无法上传的问题. 3. 文件夹MD5提供配置项(默认关闭).

  9. 使用Kotlin&Anko, 扔掉XML开发Android应用

    尝鲜使用Kotlin写了一段时间Android.说大幅度的减少了Java代码一点不夸张.用Java的时候动不动就new一个OnClickListener()匿名类,动不动就类型转换的地方都可以省下很多 ...

  10. (转)设置VMWARE通过桥接方式使用主机无线网卡上网

    转自:http://www.cnblogs.com/liongis/p/3265458.html 环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6 ...