Способ вызова портлета внутри портлета предложенный в первом посте не работает в Liferay 5.2.3, который идет в бандле с Tomcat 6. Использовать PortletBagPool для получения портального ServletContext бесполезно, т.к. в версии 5.2.3 PortletBagPool не содержить встроенные портлеты.
Получить портальный ServletContext можно получить из аттрибутов ServletRequest - оказывается он передается с ключом WebKeys.CTX. Кроме того PortalUtil в API 5.2.3 немного отличается:
Получить портальный ServletContext можно получить из аттрибутов ServletRequest - оказывается он передается с ключом WebKeys.CTX. Кроме того PortalUtil в API 5.2.3 немного отличается:
public static String renderPortlet(final PortletRequest request, final PortletResponse response, final String portletId, final String queryString) {
String result = "Error occured while running portlet";
try {
// Get servlet request / response
HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request);
HttpServletResponse servletResponse = PortalUtil.getHttpServletResponse(response);
HttpServletRequest portalServletRequest = PortalUtil.getOriginalServletRequest(servletRequest);
// Get theme display
final ThemeDisplay themeDisplay = (ThemeDisplay) servletRequest.getAttribute(WebKeys.THEME_DISPLAY);
// Backup current state
PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
PortletDisplay portletDisplayClone = new PortletDisplay();
portletDisplay.copyTo(portletDisplayClone);
final Map requestAttributeBackup = new HashMap();
for (final String key : Collections.list((Enumeration) servletRequest.getAttributeNames())) {
requestAttributeBackup.put(key, servletRequest.getAttribute(key));
}
// Render the portlet as a runtime portlet
try {
StringBuilder sb = new StringBuilder();
com.liferay.portal.model.Portlet portlet = PortletLocalServiceUtil.getPortletById(PortalUtil.getCompanyId(request), portletId);
servletRequest.setAttribute(WebKeys.RENDER_PORTLET_RESOURCE, Boolean.TRUE);
ServletContext ctx = (ServletContext) portalServletRequest.getAttribute(WebKeys.CTX);
PortalUtil.renderPortlet(sb, ctx, servletRequest, servletResponse, portlet, queryString);
result = sb.toString();
} finally {
// Restore the state
portletDisplay.copyFrom(portletDisplayClone);
portletDisplayClone.recycle();
for (final String key : Collections.list((Enumeration) servletRequest.getAttributeNames())) {
if (!requestAttributeBackup.containsKey(key)) {
servletRequest.removeAttribute(key);
}
}
for (final Map.Entry entry : requestAttributeBackup.entrySet()) {
servletRequest.setAttribute(entry.getKey(), entry.getValue());
}
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return result;
}
Комментариев нет:
Отправить комментарий