2013-10-01 75 views
1

我有一個控制器中的HashMap串聯JSTL

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']都可以。

回答

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> 
0

中的代碼${...}不是JSTL但Expression Language。你不需要嵌套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}類似。