2014-01-22 39 views
0

我已經看到了很多像這樣的問題,但並不完全一樣。不同之處在於這是一個外鍵問題。有一個小部件集合foo,它有一個typeId。然後是包含typeId和typeName的類型的散列表。當過小部件的集合迭代,我們希望基於widget的TYPEID到顯示的typeName:如何從JSTL中的hashmap得到一個值

的Java

Map<String, String> typeMap = new HashMap<Integer, String>(); 
typeMap.put("1", "One"); 
typeMap.put("2", "Two"); 
typeMap.put("3", "Three"); 

List<Foo> fooList = generateFooList(); 

其中foo有一個方法字符串getTypeId()返回的值「1」 ,「2」或「3」以及String getName()。

JSTL

<table border="1"> 
    <tr><th>Key</th><th>value</th><th>Key Class</th></tr> 
    <c:forEach var="foo" items="${fooList}" varStatus="status"> 
     <tr>  
      <td>${foo.name}</td> 
      <td>${foo.typeId}</td> 
<!-- In the following four lines of code, the idea is to use the typeId 
    from the current foo to 'get' the name of the type from the typeMap. 
    All the example I have seen are always iterating over the map itself, 
    which is NOT the case here. --> 
      <td>${typeMap['foo.typeId']}</td> 
      <td>${typeMap[foo.typeId]}</td> 
      <td>${typeMap['foo.typeId'].value}</td> 
      <td>${typeMap[foo.typeId].value}</td> 
      <td>${typeMap['1']}}</td> 
     </tr> 
    </c:forEach> 
</table> 

使用類型表總是空的,最後一個不顯示「一」前4列。我甚至跑那麼遠,到TYPEID設置成這樣:

<c:set var="typeId" value="${foo.typeId}"/> 

並取代所有foo.typeId用簡單TYPEID,我也得到同樣的效果。在這種情況下,我可以更改地圖,我不能更改foo。 foo的ID是一個字符串,不能更改爲Long。我已經嘗試將hashmap的密鑰設置爲Long,並且沒有任何效果。有什麼想法嗎?

回答

0

我真的覺得該片段

<td>${typeMap['foo.typeId'].value}</td> 

應該工作。

因爲它沒有。試試這個:

<td>${typeMap[\'foo.typeId\'].value}</td> 

作爲最後一個資源,你可以迭代列表和散列表。 然後比較散列表的「鍵」和列表位置。 然後,只有當它們相等時纔打印行。

我知道這不是最好的,只是一種解決方法。

+0

我很欣賞這個回覆,但我認爲通訊可能會出現故障。目標不是遍歷HashMap(typeMap),而是遍歷單獨的列表(fooList)。在迭代列表的一行時,使用typeId(整個外鍵概念)在typeMap中查找字符串值。在我提供的示例中,第5個和第6個​​正在使用值屬性:typeMap [foo.typeId] .value和typeMap ['foo.typeId']。值 –

+0

明白了...我會盡力找到一些東西。但我認爲​​$ {typeMap [foo.typeId] .value}應該已經工作了! – edubriguenti