连接JSTL

时间:2013-10-01 06:10:24

标签: java jsp jstl el

我在控制器中有一个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.keymap['key']都可以。

2 个答案:

答案 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.listList<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}