Liferay portlet异步刷新,分为两种情况。
一、刷新自已
1.在liferay-portlet.xml,文件中增加<render-weight>0</render-weight>
2.增加下面代码:此代码可以获得一个portlet的refreshURL
public static String getPortletRefreshURL(ThemeDisplay themeDisplay,
HttpServletRequest request, String portletId, long plid){
StringBuilder url = new StringBuilder();
try {
String doAsUserId = themeDisplay.getDoAsUserId();
LayoutTypePortlet layoutTypePortlet = themeDisplay.getLayoutTypePortlet();
UnicodeProperties properties =
layoutTypePortlet.getLayout().getTypeSettingsProperties();
String columnId = "";
int columnPos = 0;
Portlet portlet = null;
int columnCount = 0;
for(String key : properties.keySet()){
if(properties.get(key).indexOf(portletId) != -1)
columnId = key;
}
List<Portlet> portlets = layoutTypePortlet.getAllPortlets(columnId);
for(Portlet portlet1 : portlets){
//修改此处可以支持<instanceable>true</instanceable>的portlet
if(portlet1.getPortletId().equals(portletId)){
portlet = portlet1;
break;
}else
columnPos++;
}
columnCount = portlets.size();
url.append(themeDisplay.getPathMain());
url.append("/portal/render_portlet");
url.append("?p_l_id=");
url.append(plid);
url.append("&p_p_id=");
url.append(portletId);
url.append("&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=");
url.append(columnId);
url.append("&p_p_col_pos=");
url.append(columnPos);
url.append("&p_p_col_count=");
url.append(columnCount);
//PortletLocalServiceUtil.getPortletById(companyId, portletId)
if (portlet.isStatic()) {
url.append("&p_p_static=1");
if (portlet.isStaticStart()) {
url.append("&p_p_static_start=1");
}
}
if (Validator.isNotNull(doAsUserId)) {
url.append("&doAsUserId=");
url.append(doAsUserId);
}
url.append("¤tURL=");
url.append(HttpUtil.encodeURL(PortalUtil.getCurrentURL(request)));
String ppid = ParamUtil.getString(request, "p_p_id");
if (ppid.equals(portletId)) {
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String)enu.nextElement();
if (!PortalUtil.isReservedParameter(name)) {
String[] values = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
url.append(StringPool.AMPERSAND);
url.append(name);
url.append(StringPool.EQUAL);
url.append(HttpUtil.encodeURL(values[i]));
}
}
}
Map renderParameters = RenderParametersPool.get(request, plid, ppid);
Iterator itr = renderParameters.keySet().iterator();
while (itr.hasNext()) {
String name = (String)itr.next();
String[] values = (String[])renderParameters.get(name);
for (int i = 0; i < values.length; i++) {
url.append(StringPool.AMPERSAND);
url.append(name);
url.append(StringPool.EQUAL);
url.append(HttpUtil.encodeURL(values[i]));
}
}
}
} catch (SystemException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return url.toString();
}
3.在jsp中,增加下面javascript
<script type="text/javascript"> function <portalet:namespace/>refresh() { var ns = '<%= PortalUtil.getPortletNamespace(PortalUtil.getPortletId(request)) %>'; var url = '<%=PortletKernelUtil.getPortletRefreshURL(themeDisplay,request,PortalUtil.getPortletId(request),plid)%& gt;'; var portlet = jQuery('#p_p_id'+ns)[0]; portlet.refreshURL = url; portlet.id = '<%=PortalUtil.getPortletId(request)%>'; Liferay.Portlet.refresh(portlet); } </script>
4.在需要刷新的地方调用javascript <portalet:namespace/>refresh即可
二、A调用B
第1、2、4步同上面,唯一区别的是第3步
getPortletRefreshURL第三个参数需要传入B的portletId,
<portalet:namespace/>refresh中ns的值要改成B的namespace即可。
以下备注一定要读:
注:这里所提出的A调用B方案仅支持<instanceable>false</instanceable>的portlet,因为instanceable=false,portletId就是固定的值,这样namespace就可以确定(namespace="_"+portletId+"_"),而instanceable=true的portletId是会在后面加上自动生的四位识别码,这个是随机的无法确定。如果你一定想支持instanceable=true的portlet,你需要进行扩展,在代码里有注释的地方,进行扩展,反回一个Map<portletId, portletRefreshURL>,然后通过map循环调用js代码即可。