Проблемы, повторяющиеся в HashMap с JSF, MyFaces и Facelets - PullRequest
3 голосов
/ 12 мая 2009

У меня возникли проблемы с зацикливанием HashMap для вывода его значений на экран. Может ли кто-нибудь перепроверить мой код, чтобы увидеть, что я делаю не так. Кажется, я не могу найти что-то не так, но должно быть что-то.

В сервлете я добавляю к запросу следующее:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
req.setAttribute(facetField.getName(), facetValues);

В одном случае "facetField.getName ()" оценивается как "дисциплина". Итак, на моей странице у меня есть следующее:

<ui:repeat value="${requestScope.discipline}" var="item">
  <li>Item: <c:out value="${item}"/>, Key: <c:out value="${item.key}"/>, Value: <c:out value="${item.item}"/></li>
</ui:repeat>

Цикл запускается один раз, но все выходы пустые?!? Я бы, по крайней мере, ожидал что-то в элементе, если бы он прошел через цикл один раз. Проверка всплывающего окна отладки для Facelets, дисциплина есть и на петле. Печать его на экране приводит к чему-то, что для меня выглядит как карта (я сократил вывод):

{300=0, 1600=0, 200=0, ... , 2200=0}

Я также пытался использовать c: forEach, но получаю те же результаты. Так у кого-нибудь есть идеи, где я ошибаюсь?

Спасибо за любой вклад, Lee

Ответы [ 3 ]

12 голосов
/ 07 июня 2012

с поддержкой el 2.2 вы можете перебирать карты, как показано ниже.

<ui:repeat value="#{myBean.stats.keySet().toArray()}" var="x">
    <h:outputText value="#{myBean.stats.get(x)}" /><br />
</ui:repeat>
10 голосов
/ 18 августа 2010

<ui:repeat> принимает только List или DataModel, но не Sets или Maps. Это на дорожной карте для JSF 2.1.

1 голос
/ 12 мая 2009

Три вещи происходят со мной:

1

Документация для пользовательского интерфейса: repeat не говорит об этом (она только говорит List ), но я вижу, что UIRepeat использует DataModel в качестве модели (в манера h: dataTable). Карта не будет автоматически переноситься с типом DataModel - тип неявно поддерживается. Вам нужно будет либо сделать значение экземпляром вашей собственной реализации DataModel , либо предоставить их как неявно поддерживаемый тип (например, java.util.List ).

2.

Я не уверен, к чему вы хотите привязать эти значения:

${item}
${item.key}
${item.item}

Если вы измените «дисциплину» на тип Список

>
, вы можете связать ключ и значение свойства:

${item.key}
${item.value}

Вы можете создать свой список так:

Map<String, String> facetValues = new HashMap<String, String>();
// Filling the map
List<Map.Entry<String, String>> discipline
        = new ArrayList<Map.Entry<String, String>>(facetValues.entrySet());

3.

В FAQ по предлагается , что теги JSTL оцениваются только во время создания дерева компонентов. Мне неясно, будет ли использование c: out в качестве дочернего элемента ui: repeat работать правильно. Возможно, вам придется использовать h: outputText вместо этого. (Конечно, я могу ошибаться - я не пробовал.)


В сервлете я добавляю следующее к запросу

Это звучит как странный способ поместить что-то в область запроса в JSF, но я верю, что вы знаете, что делаете!

...