You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay技术问题:如何在一个Portlet中条件渲染另一个Portlet?

问题解答

首先明确:portlet:renderURL这个方向不对,它的作用是生成当前Portlet的渲染请求URL,用来触发自身的Render阶段动作(比如刷新自身内容、分页跳转),没办法直接用来渲染另一个Portlet。

正确的做法是使用Liferay提供的<liferay-portlet:render>标签,它专门用于在JSP中嵌入渲染其他Portlet。具体实现步骤如下:

  1. 在你的Portlet后端逻辑中,从数据库获取标志位,将其存入请求属性或Model中(比如命名为showTargetPortlet)。

  2. 在JSP视图中,通过条件判断结合<liferay-portlet:render>标签渲染目标Portlet:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="liferay-portlet" uri="http://liferay.com/tld/portlet" %>

<%-- 根据标志位判断是否渲染目标Portlet --%>
<c:if test="${showTargetPortlet}">
    <%-- 替换成目标Portlet的portletId,即portlet.xml中定义的<portlet-name>值 --%>
    <liferay-portlet:render portletName="com_yourcompany_TargetPortlet">
        <%-- 可选:如果需要给目标Portlet传递参数,添加以下标签 --%>
        <portlet:param name="paramKey" value="paramValue" />
    </liferay-portlet:render>
</c:if>

关键注意点

  • 目标Portlet必须已部署到Liferay,且当前页面有权限访问该Portlet
  • portletName要使用目标Portlet的完整标识:如果是传统WAR包Portlet,就是portlet.xml里的<portlet-name>;如果是OSGi模块Portlet,格式通常为[Bundle-SymbolicName]_[Portlet-Name]
  • 若需要更灵活的渲染控制,也可以通过liferay-portlet:include结合生成的渲染URL实现,效果和上面的写法一致

内容的提问来源于stack exchange,提问作者Sumit Wadhwa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:57:14