scriptlet如何将数组传递给JSTL标记?

时间:2014-12-29 06:08:28

标签: jsp jstl scriptlet

我认为<%= %>在JSTL 1 的上下文中使用时应该计算为字符串。但在下面的代码中似乎并非如此:

<c:forEach var="item" items="<%= new Object[] { 1, 2, 3 } %>">
Item: ${item}
</c:forEach>

令我惊讶的是,<c:forEach>标记实际上遍历了scriptlet中的数组:

Item: 1
Item: 2
Item: 3

有人可以解释一下这种行为吗?

谢谢!

参考

  1. test attribute in JSTL <c:if> tag

1 个答案:

答案 0 :(得分:0)

在阅读之后回答我自己的问题。

简而言之,我对JSP标记属性的评估方式错了。如果使用scriptlet设置属性 1 的值,则直接使用其返回值而不是转换为字符串来设置属性的值。 (如果类型不匹配,EL会执行类型强制以尝试使其工作。如果失败,则会引发异常。)

在示例中

<c:forEach var="item" items="<%= new Object[] { 1, 2, 3 } %>">

标记的items属性类型为Object,因此该属性设置为scriptlet的结果 - 数组new Object[] { 1, 2, 3 }

  1. 请注意,您不能将scriptlet与文字字符串结合使用来设置属性。也就是说,您可能认为<c:forEach items="abc<%= "def" %>" var="c">将执行scriptlet并评估为字符串abcdef。但相反,它会将items的属性值设置为字符串abc<%= "def" %>