Ui: repeat не работает с Map
У меня есть Map
ключа/значений, который я инициализирую в @PostConstruct
следующим образом:
Map<String, String> myMap;
@PostConstruct
public void init() {
myMap=new LinkedHashMap<String, String>();
myMap.put("myKey","myValue");
}
public Map<String, String> getMyMap() {
return myMap;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
Когда я пытаюсь перебрать эту карту с помощью <ui:repeat>
, как показано ниже, и я установил точку останова на получателе для Карты, я заметил, что она не вызвана, и поэтому ничего не печатается:
<ice:panelGroup>
<ui:repeat items="#{myBean.myMap}" var="entry" varStatus="loop">
<input type="checkbox" name="myCheckBoxes" value="#{entry.value}" />
<span class="#{fn:contains(entry.value,'g') ? 'bold-style' : ''}">#{entry.key}</span>
</ui:repeat>
</ice:panelGroup>
Но при замене кода выше <c:foreach>
все работает нормально, и список печатается, как ожидалось, любые идеи, почему я получаю такое поведение?
Ответы
Ответ 1
К сожалению, UIData
и UIRepeat
не поддерживают итерацию по карте в JSF.
Если это вас беспокоит (я думаю, это так), проголосуйте за следующую проблему и, если возможно, оставьте комментарий, который объяснит, как вы к этому относитесь:
http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-479
В то же время вы можете выполнять итерацию по карте с помощью небольшого вспомогательного кода:
/**
* Converts a Map to a List filled with its entries. This is needed since
* very few if any JSF iteration components are able to iterate over a map.
*/
public static <T, S> List<Map.Entry<T, S>> mapToList(Map<T, S> map) {
if (map == null) {
return null;
}
List<Map.Entry<T, S>> list = new ArrayList<Map.Entry<T, S>>();
list.addAll(map.entrySet());
return list;
}
Затем определите функцию EL в файле *-taglib.xml
следующим образом:
<namespace>http://example.com/util</namespace>
<function>
<function-name>mapToList</function-name>
<function-class>com.example.SomeClass</function-class>
<function-signature>java.util.List mapToList(java.util.Map)</function-signature>
</function>
И, наконец, используйте его на Facelet следующим образом:
<html xmlns:util="http://example.com/util">
<ui:repeat value="#{util:mapToList(someDate)}" var="entry" >
Key = #{entry.key} Value = #{entry.value} <br/>
</ui:repeat>
Ответ 2
<a4j:repeat value="#{myBean.myMap.entrySet().toArray()}" var="_entry">
<h:outputText value="#{_entry.key}"/><br/>
<h:outputText value="#{_entry.value}"/>
</a4j:repeat>
также использовать с <ui:repeat>
Ответ 3
Кажется, для меня работает на JSF 1.2, надеюсь, что это кому-то помогает...
<h:panelGroup>
<ul>
<ui:repeat value="#{myBean.myMap.keySet().toArray()}" var="key">
<li>key:#{key}</li>
<li>value:#{myBean.myMap[key]}</li>
</ui:repeat>
</ul>
</h:panelGroup>
Ответ 4
с поддержкой el 2.2 вы можете перебирать карты, как показано ниже.
<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
<h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>