1

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']做。

4

2 回答 2

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>
于 2013-10-01T06:17:49.687 回答
0

中的代码${...}不是 JSTL 而是Expression Language。您不需要 c̶o̶n̶c̶a̶t̶e̶n̶a̶t̶e̶ 嵌套 EL${}表达式,只需将其添加干净即可。

知道了这一点,表达式${testing['${list.item}']}将是${testing[list.item]}

请注意,这不是您真正想要/需要的,除非testing确实是 a Map<String, ArrayList<String>>,否则您会得到意想不到的结果。从上面的代码中,假设requestScope.list是 a 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}

于 2013-10-01T06:19:35.390 回答