是否可以在 liferay 中创建没有请求对象的渲染 URL?

Is it possible in liferay to create a render URL without a request object?

我知道如何在我有 PortletRequest 时创建渲染 url 但如果我没有呢? 类似于:

PortletURLFactoryUtil.create(portletRequest, portletId, plid, lifecycle)

但没有 portletRequest。

在Liferay中,javax.portlet.PortletURL是由com.liferay.portlet.PortletURLImpl实现的。 PortletURLImpl 的每个构造函数都期望 PortletRequestHttpServletRequest 作为参数。

所以,严格来说,使用 Liferay Java API,没有请求对象是不可能创建 portlet url。

如果您不想将请求对象作为参数传递给您的代码,您总是可以以某种方式将其隐藏起来。例如portlet:renderURLJSP标签没有请求参数,但是从当前javax.servlet.jsp.PageContext.

获取请求对象

同样,您的 Java 代码可以使用某种 portlet / servlet 过滤器,将请求对象存储在 ThreadLocal 或其他线程绑定存储中,并在请求处理期间将其保存在那里。

无论如何,portlet url 非常需要处理请求,所以我认为没有理由打扰。

答案是可以。 在javaScript

function(event) {
    var portletURL = Liferay.PortletURL.createRenderURL();
    portletURL.setParameter('groupId', '<%= scopeGroupId %>');
    portletURL.setParameter('struts_action', '/journal/select_document_library');
    portletURL.setPlid('<%= controlPanelPlid %>');
    portletURL.setPortletId('15');
    portletURL.setWindowState('pop_up');
    Liferay.Util.openWindow(
        {
            id: '<portlet:namespace />selectDocumentLibrary',
            uri: portletURL.toString()
        }
    );
}

转到 Creating Portlet URLs in JavaScript

或在 Jsp 页面中作为

<%@ taglib uri="http://liferay.com/tld/portlet" prefix="liferay-portlet" %>
<liferay-portlet:renderURL var="openPortletURL" copyCurrentRenderParameters="true" portletMode="<%=LiferayPortletMode.VIEW.toString() %>" 
  windowState="<%=LiferayWindowState.NORMAL.toString()%>">
  <liferay-portlet:param name="param" value="This is from Liferay TAG"/>
</liferay-portlet:renderURL>

<a href="${openPortletURL}">Render Url created by Liferay TAG in JSP</a>

转到Creating Render Url using liferay-portal