我在Java中有Map
,其中包含另一个Map
,如下所示:
Map<String, Map<String, Object>> myMap = ...
我知道这不是一种传递数据的理想方式,但是为了测试它比充实只用于将数据推送到JSTL的类更容易。
话虽如此,我们无法在第二级Map
中获取值:
${ myMap[someString1][someString2] != null }
加载页面时会导致编译错误:
org.apache.jasper.JasperException: /mypage.jsp (line: 142, column: 9) "${ myMap[someString1][someString2] != null }" contains invalid expression(s): javax.el.ELException: Failed to parse the expression [${ myMap[someString1][someString2] != null }]
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42)
奇怪,它在运行Tomcat 6.0.29的计算机上运行正常,在运行7.0.26的计算机上运行失败。
编辑:在两种情况下,网络应用都使用JSTL-1.2。
答案 0 :(得分:0)
原来是一个facepalm答案。我更改了变量名称以模糊代码的目的,认为它会使事情更容易理解,当它实际掩盖了问题时。
原始代码:
<c:forEach items="${someobject.items}" var="interface">
...
${ myMap[interface][someString2] != null }
...
</c:forEach>
请注意forEach
循环的变量名称 - interface
当然是一个保留的Java关键字,但堆栈跟踪并没有很好地引起人们对此的注意。
将变量名称更改为interfaze
或其他任何内容可以解决问题。