2009-03-06 4 views
1

Внутри вложенного foreach доступ к одной и той же переменной возвращает разные значения. Это происходит, когда страница перезагружается, а не при первой загрузке.Проблема JSF JSTL с вложенным forEach

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    (...) 
    xmlns:c="http://java.sun.com/jstl/core" 
    xmlns:h="http://java.sun.com/jsf/html"> 

    (...) 

    <c:forEach items="#{controller.availableTransitions}" var="transition"> 
    <c:forEach items="#{transition.availableTransitions}" var="transitionItem"> 
     <h:outputText value="1_#{transitionItem.name} 2_#{transitionItem.name}" /> 
     3_#{transitionItem.name} 4_#{transitionItem.name} 
    </c:forEach> 
    </c:forEach> 
</ui:composition> 

После перезагрузки страницы, transitionItem.Name возвращает правильное значение для 3 и 4, а также различные значения для 1 и 2. Может быть, проблема интеграции JSF-JSTL?

+1

Как правило, вложенная Foreach петли в JSP/JSF говорит мне, что контроллер или полученный объект не тянет достаточно веса своего собственного - вы можете рассмотреть вопрос рефакторинга так нужен только один цикл по каждому элементу , – MetroidFan2002

+0

Это действительно рабочее решение. (Только заметил ваш комментарий прямо сейчас, все еще привыкший к сайту!) – noup

ответ

0

Нашли обходной путь, избавляясь от внутреннего контура Foreach, таким образом, возвращая линейный список от контроллера.

3

Я вижу, что вы используете Facelets.

Может быть, вы можете попробовать заменить вашу <c:forEach> на <ui:repeat> ...

код станет тогда:

<ui:composition 
    xmlns="http://www.w3.org/1999/xhtml" 
    (...) 
    xmlns:c="http://java.sun.com/jstl/core" 
    xmlns:h="http://java.sun.com/jsf/html"> 

    (...) 

    <ui:repeat value="#{controller.availableTransitions}" var="transition"> 
    <ui:repeat value="#{transition.availableTransitions}" var="transitionItem"> 
     <h:outputText value="1_#{transitionItem.name} 2_#{transitionItem.name}" /> 
     3_#{transitionItem.name} 4_#{transitionItem.name} 
    </ui:repeat> 
    </ui:repeat> 
</ui:composition> 
+0

Я пробовал это, но результат тот же. – noup

2

В общем, я пытаюсь использовать ui: повторяю большую часть времени. Когда у меня возникли проблемы с: set, я нашел этот блог, который был очень полезен и может также применяться в вашем случае.

http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets