Переменная сеанса не обновляется после цикла - JSF - PullRequest
0 голосов
/ 10 января 2012

Я новичок в JSF и Facelets. Мне было интересно, почему я не получаю ожидаемый результат? Я использую JSF 1.2, с facelets 1.1.14. Я ожидаю, что переменная сеанса 'indx' будет содержать общее количество внуков после цикла.

Вместо этого всегда 0. Что я делаю не так? Вот мой код ...

<h:form>
    <c:set var="indx" value="0" scope="session"></c:set>
    <ui:repeat value="#{grandparentholder.grandparents}" var="grandparent">
        <ui:repeat value="#{grandparent.parents}" var="parent">
             <ui:repeat value="#{parent.child}" var="child">
                 <c:set var="indx" value="#{indx+1}" scope="session"></c:set>
             </ui:repeat>
         </ui:repeat>
     </ui:repeat>
</h:form>

Ответы [ 2 ]

1 голос
/ 10 января 2012

JSF-теги и JSTL-теги не работают синхронно, как вы ожидаете от кодирования.Короче говоря: JSTL в JSF2 Facelets ... имеет смысл?

Вы должны решить свою конкретную проблему по-другому.Как это сделать, зависит от конкретных функциональных требований.Если я вас правильно понимаю, что вы просто хотите сосчитать всех доступных дочерних элементов, тогда вам нужно <c:forEach> вместо <ui:repeat>

<c:set var="indx" value="0" scope="session" />
<c:forEach items="#{grandparentholder.grandparents}" var="grandparent">
    <c:forEach items="#{grandparent.parents}" var="parent">
         <c:forEach items="#{parent.child}" var="child">
             <c:set var="indx" value="#{indx+1}" scope="session" />
         </c:forEach>
     </c:forEach>
 </c:forEach> 

или делегировать задание бину поддержки сеанса с заданной областью и предоставить получательчтобы вернуть счет.

private int indx;

public void init() {
    int indx = 0;

    for (Grandparent grandparent : grandparents) {
        for (Parent parent : grandparent.getParents()) {
            for (Child child : parent.getChild()) { // getChildren()??
                indx++;
            }
        }
    }

    this.indx = indx;
}

public int getIndx() {
    return indx;
}
0 голосов
/ 10 января 2012

Taglibs ui и c имеют разный жизненный цикл.

Вы не можете сделать это.

Что именно вы хотите сделать?

...