我在控制器中有一个HashMap
:
HashMap<String, ArrayList<String> map = new HashMap<String, ArrayList<String>();
在JSP页面中,我想通过以下方式访问它:
<c:forEach var="list" items="${requestScope.list}">
<c:set var="testing" value="{requestScope.map}"></c:set>
<c:forEach var="anotherTesting" items="${testing['${list.item}']}">
<option><c:out value="${anotherTesting}"/></option>
</c:forEach>
</c:forEach>
其中list.item
是一个字符串,但它用于另一个进程,但我希望它用于访问HashMap
。
有没有办法连接JSTL? map.key
或map['key']
都可以。
答案 0 :(得分:3)
我想这简直就行了:
<c:forEach var="anotherTesting" items="${testing[list.item]}">
<option><c:out value="${anotherTesting}"/></option>
</c:forEach>
注意使用和不使用引号的区别:
${testing[list.item]}
相当于testing.get(list.getItem());
${testing['list.item']}
相当于testing.get("list.item");
。 一些注意事项:
除非在不同范围内存在与同名冲突,否则无需指定访问属性的范围。因此,"${requestScope.list}"
可以更改为${list}
,"${requestScope.map}"
可以更改为${map}
。
请为外循环的var
属性使用其他名称。可以是listItem
而不是list
。
无需将map
设置为其他变量。不需要<c:set...>
。您可以直接访问map
属性的属性。
因此,您的循环可以修改为:
<c:forEach var="listItem" items="${list}">
<c:forEach var="anotherTesting" items="${map[listItem.item]}">
<option><c:out value="${anotherTesting}"/></option>
</c:forEach>
</c:forEach>
答案 1 :(得分:0)
${...}
中的代码不是JSTL,而是Expression Language。你不需要cELo̶n̶c̶a̶t̶e̶n̶a̶t̶e̶筑巢EL ${}
表达式,只需简单地添加它。
知道这一点,表达式${testing['${list.item}']}
将是${testing[list.item]}
。
但是请注意,这不是您真正想要/需要的,除非testing
确实是Map<String, ArrayList<String>>
,否则您将获得意外结果。从上面的代码开始,假设requestScope.list
是List<Map<String, ArrayList<String>>>
,那么代码将是:
<c:forEach var="listItem" items="${list}">
<c:forEach var="innerString" items="${map[listItem.item]}">
<option><c:out value="${innerString}"/></option>
</c:forEach>
</c:forEach>
请注意,${list}
与${requestScope.list}
相同,假设没有list
属性,也没有页面,会话或应用范围,类似于${map}
。