很抱歉这个详细的标题,但这是一个冗长的问题。我正在尝试与各种类型的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。我觉得这与编译/渲染的顺序有关,但我无法弄明白。有什么想法吗?
答案 0 :(得分:0)
所以我最终解决了这个问题。问题是我使用<dsp:valueof>
标签来检索promo.html(promo是对带有字段“html”的表的引用)。我将代码更改为<dsp:getvalueof param="promo.html" var="html"/>
并删除了周围的<c:set>
代码后,一切顺利。
getvalueof DSP标签允许将值直接存储到JSTL变量中,而valueof标记输出该值(即使它也通过<c:set>
标签捕获到JSTL变量中。