我认为<%= %>在JSTL 1的上下文中使用时应该计算为字符串。但这在下面的代码中似乎并非如此:
<%= %>
<c:forEach var="item" items="<%= new Object[] { 1, 2, 3 } %>"> Item: ${item} </c:forEach>
令我惊讶的是,<c:forEach>标记实际上遍历了脚本内的数组:
<c:forEach>
Item: 1 Item: 2 Item: 3
有人可以解释这种行为吗?
谢谢!
阅读后回答我自己的问题。
简而言之,我对如何评估JSP标记属性是错误的。如果使用scriptlet设置属性1的值,则直接使用其返回值(而不是转换为字符串)来设置属性的值。(如果类型不匹配,则EL会执行类型强制转换以使其起作用。如果失败,则会引发异常。)
在这个例子中
<c:forEach var="item" items="<%= new Object[] { 1, 2, 3 } %>">
标签items属性的类型为Object,因此该属性设置为scriptlet的结果— array new Object[] { 1, 2, 3 }。
items
Object
new Object[] { 1, 2, 3 }
<c:forEach items="abc<%= "def" %>" var="c">
abcdef
abc<%= "def" %>