循环后,会话变量没有更新 - JSF

时间:2012-01-10 15:49:18

标签: jsf loops facelets

我是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 个答案:

答案 0 :(得分:1)

JSF标记和JSTL标记不会像编码所期望的那样同步运行。长话短说:JSTL in JSF2 Facelets... makes sense?

您必须以不同方式解决您的特定问题。如何做到这一点取决于具体的功能要求。如果我理解你只是想要计算所有可用的孩子,那么你需要<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> 

或将作业委托给会话范围的辅助bean,并提供一个getter来返回计数。

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;
}

答案 1 :(得分:0)

Taglibs ui和c的生命周期不同。

你不能这样做。

你想做什么?