JSTL c:为ATG存储库查找设置自定义JSP标记

时间:2013-03-14 23:12:27

标签: jsp jstl

很抱歉这个详细的标题,但这是一个冗长的问题。我正在尝试与各种类型的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。我觉得这与编译/渲染的顺序有关,但我无法弄明白。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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