一尘不染

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

jsp

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

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

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

Item: 1
Item: 2
Item: 3

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

谢谢!


阅读 251

收藏
2020-06-10

共1个答案

一尘不染

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

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

在这个例子中

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

标签items属性的类型为Object,因此该属性设置为scriptlet的结果— array new Object[] { 1, 2, 3 }

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