JSP / JSTL:将集合传递给自定义标记

时间:2011-06-10 00:37:06

标签: jsp jstl jsp-tags custom-tag

我正在尝试实现一个自定义JSP标记,该标记接受Collection个对象作为属性,并将它们输出为JSON格式的数组(Collection中的每个对象提供{{1}返回该对象的JSON格式表示的方法。我的标签实现如下:

getJsonString()

...我希望能够通过以下方式使用它:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="objects" required="true" rtexprvalue="true" %>
<c:set var="output" value="" />
<c:forEach var="obj" items="${objects}">
    <c:if test="${! empty showComma}">
        <c:set var="output" value="${output}, " /> 
    </c:if>
    <c:set var="output" value="${output}${obj.jsonString}" />
    <c:set var="showComma" value="yes" />
</c:forEach>
[${output}]

但是,当我尝试使用标记时,我得到一个堆栈跟踪说:

<myTaglib:jsonArray objects="${myCollection}" />

所以它抱怨javax.el.PropertyNotFoundException: Property 'jsonString' not found on type java.lang.String 表达式,但我肯定没有传递${obj.jsonString}个字符串。此外,如果我将其更改为Collection,我会看到输出正确的对象类型,如果我将自定义标记的代码复制/粘贴到我想要使用它的JSP中,它可以正常工作,所以我'我真的不确定这里发生了什么。

我认为我将${obj}传递给自定义标记存在一些问题,但我无法弄清楚它是什么。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

我找到了解决方案,我需要将type="java.util.Collection"添加到属性声明中,如:

<%@ attribute name="objects" required="true" rtexprvalue="true" type="java.util.Collection" %>

......我本以为Java会足够聪明,可以自己解决这个问题,但显然不是。