0

很抱歉标题冗长,但这是一个冗长的问题。我正在尝试与各种 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 相同。我觉得这与编译/渲染的顺序有关,但我无法弄清楚。有任何想法吗?

4

1 回答 1

0

所以我最终解决了这个问题。问题是我使用<dsp:valueof>标签来检索 promo.html(promo 是对带有字段“html”的表的引用)。一旦我将标签更改为<dsp:getvalueof param="promo.html" var="html"/>并删除了周围的<c:set>标签,一切都解决了。

getvalueof DSP 标记允许将值直接存储到 JSTL 变量中,而 valueof 标记就地输出值(即使它也通过<c:set>标记捕获到 JSTL 变量中。

于 2013-04-24T04:46:52.440 回答