我见过很多像这样的问题,但并不完全正确。区别在于这是一个外键问题。有一个小部件的集合,foo,有一个typeId。然后是一个包含typeId和typeName的类型的hashmap。迭代小部件集合时,我们希望根据小部件的typeId显示typeName:
爪哇
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有一个方法String 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>
使用typeMap的前4列始终为空,最后一列显示“One”。我甚至将typeId设置为:
<c:set var="typeId" value="${foo.typeId}"/>
用简单的typeId替换了所有的foo.typeId,我得到了同样的效果。在这种情况下我可以改变地图,我无法改变foo。 foo的ID是一个String,不能更改为Long。我已经尝试将hashmap的密钥设为Long并且也没有任何影响。有什么想法吗?
答案 0 :(得分:0)
我真的认为片段
<td>${typeMap['foo.typeId'].value}</td>
应该工作。
既然没有。试试这个:
<td>${typeMap[\'foo.typeId\'].value}</td>
作为最后一个资源,您可以迭代列表和hashmap。 并将hashmap的“键”与列表位置进行比较。 然后你只在它们相等的时候打印它。
我知道这不是最好的,只是一种解决方法。