在Liferay中重新加载页面期间添加portlet实例

在Liferay中重新加载页面期间添加portlet实例,liferay,Liferay,我试图在点击链接时在liferay中添加一个新的IFrame portlet。我通过一些问题实现了这一目标 首先,我使用liferay sdk创建了一个portlet,并自定义了默认的view.jsp: 已将portlet.xml更改为 com.liferay.util.bridges.mvc.MVCPortlet 到 test.LinksPortlet 我在LinksPortlet中实现了以下代码: public void呈现(RenderRequest,RenderRespo

我试图在点击链接时在liferay中添加一个新的IFrame portlet。我通过一些问题实现了这一目标

首先,我使用liferay sdk创建了一个portlet,并自定义了默认的
view.jsp






已将portlet.xml更改为

com.liferay.util.bridges.mvc.MVCPortlet

test.LinksPortlet
我在
LinksPortlet
中实现了以下代码:

public void呈现(RenderRequest,RenderResponse响应)抛出PortletException,java.io.IOException{
日志(“LinksPortlet:render”);
试一试{
主题显示主题显示=(主题显示)request.getAttribute(com.liferay.portal.kernel.util.WebKeys.THEME\u DISPLAY);
LayoutTypePortlet LayoutTypePortlet=主题显示。getLayoutTypePortlet();
List portletList=layoutTypePortlet.getPortlets();
for(Portlet p:portletList){
log(p.getPortletId());
对数(p);
日志(p.getDisplayName());
log(p.getInitParams());
}
字符串c=request.getParameter(“clink”);
对数(c);
如果(c!=null&(c.equals(“g”)| | c.equals(“y”)| | c.equals(“d”)| | c.equals(“w”)){
String portletId=layoutTypePortlet.addPortletId(Long.parseLong(request.getRemoteUser())、PortletKeys.IFRAME、“column-2”、-1);
日志(“portletId:+portletId”);
long companyId=themeDisplay.getCompanyId();
long ownerId=PortletKeys.PREFS\u OWNER\u ID\u默认值;
int ownerType=PortletKeys.PREFS\u OWNER\u TYPE\u布局;
Layout Layout=themeDisplay.getLayout();
PortletPreferences prefs=PortletPreferencesLocalServiceUtil.getPreferences(companyId、ownerId、ownerType、layout.getPlid()、portletId);
语言环境=新语言环境(“英语”、“美国”);
setValue(“portlet设置使用自定义标题”,“true”);
如果(c等于(“g”)){
prefs.setValue(“src”http://www.google.com");
prefs.setValue(“portlet设置标题-”+LocaleUtil.toLanguageId(locale),“谷歌”);
}
如果(c等于(“y”)){
prefs.setValue(“src”http://www.yahoo.com");
prefs.setValue(“portlet设置标题-”+LocaleUtil.toLanguageId(locale),“Yahoo”);
}
否则,如果(c等于(“d”)){
prefs.setValue(“src”http://www.dailytech.com");
prefs.setValue(“portlet设置标题-”+LocaleUtil.toLanguageId(locale),“每日技术”);
}
如果(c等于(“w”)){
prefs.setValue(“src”http://www.wired.com");
prefs.setValue(“portlet设置标题-”+LocaleUtil.toLanguageId(locale),“有线”);
}
PortletPreferencesLocalServiceUtil.updatePreferences(ownerId、ownerType、layout.getPlid()、portletId、prefs);
portletList=layoutTypePortlet.getPortlets();
for(Portlet p:portletList){
if(p.getPortletId().equals(portletId)){
打破
}
}
LayoutLocalServiceUtil.updateLayout(layout.getGroupId(),layout.isPrivateAyout(),layout.getLayoutId(),layout.getTypeSettings());
}
}
捕获(例外e){
日志(“LinksPortlet:doView:Exception”);
e、 printStackTrace();
}
super.render(请求、响应);
}
上述实现的问题是,页面重新加载后,新portlet出现在屏幕上:

出现此问题的原因是新portlet是在布局呈现开始后添加的。是否可以自定义或添加一个钩子来执行我在页面/布局加载期间执行的操作。我遇到了liferay的源代码LayoutAction.java,其中添加了portlet。有没有办法添加一个post钩子来添加portlet而不修改liferay的源代码

我正在使用Liferay 6.0.5


提前感谢。

找到了问题的解决方案

我已经将代码从render方法移动到processAction,并使用
标记创建链接