很抱歉标题冗长,但这是一个冗长的问题。我正在尝试与各种 CMS 进行交互,但我的自定义标签生成的 HTML 除了保存在 JSTL 变量中之外,还会输出到页面。我什至不知道我想要实现的目标是否可行。
<%-- promo.tag --%>
<%@ tag display-name="PromoMap Lookup Tag" body-content="empty" %>
<%@ attribute name="id" required="true" description="" %>
<%@ attribute name="elName" required="true" description="" %>
<%@ taglib uri="/dspTaglib" prefix="dsp" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<dsp:importbean bean="/promo/PromoMapLookup"/>
<dsp:droplet name="PromoMapLookup">
<dsp:param name="id" value="${id}"/>
<dsp:param name="elementName" value="${elName}"/>
<dsp:oparam name="output">
<c:set var="html"><dsp:valueof param="promo.html" valueishtml="true"/></c:set>
<c:set var="html" value="${fn:trim(html)}"/>
<c:if test="${not fn:endsWith(html, '-->') and not empty html}">
${html}
</c:if>
</dsp:oparam>
<dsp:oparam name="empty">
<%-- Nothing retrieved for promo slot id --%>
</dsp:oparam>
</dsp:droplet>
...然后调用页面在所有 html 之上进行这样的调用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib tagdir="/WEB-INF/tags" prefix="pro" %>
<c:set var="masthead"><pro:promo id="287" elName="promo" /></c:set>
...some html...
${masthead}
该elName
属性是内部的,所以不用担心。因此,PromoMapLookup
吐出的 html 被保存到变量中,但是c:set
除了我稍后在页面中引用变量的位置之外,它还呈现在调用标记的页面上。结果是页面上两个位置的 html 相同。我觉得这与编译/渲染的顺序有关,但我无法弄清楚。有任何想法吗?