проблема с итерацией по java.util.Map с использованием "JSF" ИЛИ TAGS JSTL - PullRequest
2 голосов
/ 22 сентября 2009

Я использую Richfaces JSF и хочу перебрать Map<Object,Object>. Я вижу много примеров на форумах Sun и других сайтах, но в моем случае это не работает. Вот мой код XHTML:

<c:forEach items="#{order.customOptions}" var="option">
    <h:outputText value="this text does not print" />
    <h:outputText value="#{option.value.name}" />
    <h:outputText value="#{option.value.key}" />
</c:forEach>

Объект "order" имеет тип Order. "CustomOptios" имеет тип Map<CustomOption,CustomOptionValue>. Когда я создаю предупреждение Javascript для печати «# {order.customeOptions}», его содержимое корректно, но оно даже не входит в c:forEach loop.

Обновление 1: : я попробовал список, но он не работает. Я использовал список и получил ответ на других страницах. Я также использую a4j:poll и некоторые другие компоненты ajax, есть ли с ними проблемы?

<c:forEach items="#{order.food.cusomableOptions}" var="option">
    <h:outputText value="this text does not print" />
    <h:outputText value="#{option.title}" />
</c:forEach>

Обновление 2: Вот вывод <h:outputText value="#{order.customOptions}" />:

{model.CustomOption@be8464=model.CustomOptionValue@14e8ac9, 
 model.CustomOption@1ea0c8b=model.CustomOptionValue@78f4, 
 model.CustomOption@24389c=model.CustomOptionValue@3f0bc0, 
 model.CustomOption@a765c=model.CustomOptionValue@3b34ca, 
 model.CustomOption@95868c=model.CustomOptionValue@199de59}

Обновление 3: когда я использую его вне rich:column, оно работает, но когда я использую его в тегах rich:dataTable и rich:column, он не работает:

<rich:column>
    <f:facet name="header">
        <h:outputText value="xf" />
    </f:facet>
    <c:forEach items="#{order.customOptions}" var="option">
        <p><h:outputText value="option : #{option.key.title}" /></p>
    </c:forEach>
</rich:column>

Ответы [ 7 ]

4 голосов
/ 22 сентября 2009

Этот блог может быть полезен, поскольку при использовании тегов JSTL в JSF возникают некоторые проблемы.

3 голосов
/ 27 октября 2010

Если мне нужно перебрать карту, я использую вспомогательный класс (например, Entry), как показано ниже:

public class Entry {
    private String value;
    private String key;

    public Entry(String value, String key) {
        super();
        this.value = value;
        this.key = key;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

и метод преобразования карты в Список:

private List<Entry> mapToList(Map<String,String> map) {
    List<Entry> list = new ArrayList<Entry>();
    for(String key: map.keySet()) {
        list.add(new Entry(key, map.get(key)));
    }
    return list;        
}

XHTML:

<ui:repeat var="entry" value="#{bean.list}" varStatus="i">
    <div>#{entry.key} : #{entry.value}</div>
</ui:repeat>

Может быть, это поможет Вам ... или, может, нет;)

1 голос
/ 31 марта 2010

JSTL и JSF не работают вместе синхронно, как вы могли бы интуитивно ожидать от упорядочения в исходном коде. Грубо говоря, JSTL сначала обрабатывает всю страницу сверху вниз, а затем передает сгенерированный вывод (таким образом, без любых тегов JSTL, но с его сгенерированным выводом) в JSF, который, в свою очередь, обрабатывает всю страницу из снова сверху вниз.

JSF UIData компоненты, такие как h:dataTable и rich:dataTable, еще не сгенерировали ни одной строки в момент запуска JSTL, что предупреждает, что вы не увидите ничего из c:forEach внутри столбца.

Чтобы это исправить, вам лучше использовать предоставляемые JSF итерирующие компоненты, такие как RichFaces 'a4j:repeat, Facelets' ui:repeat или Tomahawk's t:dataList. Все они делают меньше или больше так же, как JSTL c:forEach.

Для остатка тегов JSTL, only taglib functions полезен в JSF, все другие теги-библиотеки лишние в среде JSF, так как они либо предоставляют те же функциональные возможности из поле (ярлыки ядра и формата JSTL), или оно просто не соответствует идеологии MVC (ярлыки тегов sql и xml JSTL).

1 голос
/ 22 сентября 2009

Если цикл даже не введен, это означает, что карта просто пуста.

Вы можете диагностировать это, поставив что-то вроде

<h:outputText value="map size: #{order.customOptions.size()}" />

перед тегами цикла, но вам действительно нужно настроить IDE, например, eclipse или Netbeans, и запустить свой код внутри него, чтобы вы могли использовать настоящий отладчик - вы сможете гораздо легче определить проблему так быстрее.

0 голосов
/ 24 сентября 2009

Вы должны использовать эквивалентный тег JSF. Вы пробовали <a4j:repeat/>?

0 голосов
/ 23 сентября 2009

Просто преобразуйте вашу MAP в ArrayList и используйте h: dataTable, и ваша проблема должна быть решена.

0 голосов
/ 22 сентября 2009

Возможно, вам не следует смешивать теги JSTL: core и теги JSF: h.

Привет.

...