2014-01-22 4 views
0

Я видел много таких вопросов, но не совсем. Разница в том, что это проблема внешнего ключа. Существует коллекция виджетов, foo, которая имеет типId. Затем есть hashmap типов, которые содержат как typeId, так и typeName. Когда итерация коллекции виджетов, мы хотим, чтобы отобразить TYPENAME на основе TypeID виджета:Как получить значение из hashmap в JSTL

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" вместе с строкой 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 колонки, которые используют TypeMap всегда пусты, последняя делает дисплей 'One'. Я даже пойти так далеко, чтобы установить TypeID в этом:

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

И заменить все foo.typeId с просто TypeID, и я получаю тот же эффект. В этом случае я могу изменить карту, я не могу изменить foo. Идентификатор foo является строкой, которая не может быть изменена на Long. Я попытался сделать ключ hashmap длинным, и это тоже не имеет никакого эффекта. Есть предположения?

ответ

0

Я действительно думаю, что фрагмент

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

Должно работать.

Так как это не так. Попробуйте следующее:

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

В качестве последнего ресурса вы можете перебирать список и хэш-карту. И сравните «ключи» хэш-карты с позицией списка. Затем вы печатаете линию только тогда, когда они равны.

Я знаю, что это не лучшее, просто обходной путь.

+0

Я ценю ответ, но я думаю, что может произойти сбой в сообщениях. Цель состоит в том, чтобы не перебирать HashMap (typeMap), а отдельный список (fooList). Итерируя по одной строке списка, typeId (вся концепция внешнего ключа) используется для поиска строкового значения в типеMap. В приведенном примере 5-й и 6-й используют свойство value: typeMap [foo.typeId] .value и typeMap ['foo.typeId']. Значение –

+0

Получил ... Я постараюсь что-то найти. Но я думаю, что должно было работать $ {typeMap [foo.typeId] .value}! – edubriguenti

Смежные вопросы