循环后会话变量未更新 - JSF

发布于 2024-12-26 09:56:06 字数 656 浏览 0 评论 0原文

我是 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>

I'm new to JSF and facelets. I was wondering why am I not getting the expected result? I'm using JSF 1.2, with facelets 1.1.14. I'm expecting that the session variable 'indx' to hold the total number of grandchildren after the loop.

Instead its always 0. What am I doing wrong? Here is my code...

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨小墨 2025-01-02 09:56:06

JSF 标记和 JSTL 标记并不像您期望的编码那样同步运行。长话短说:JSF2 Facelets 中的 JSTL...有意义吗?

以不同的方式解决您的特定问题。如何做到这一点取决于具体的功能需求。如果我正确理解您只是想计算所有可用的子项,那么您需要 而不是

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

JSF tags and JSTL tags does not run in sync as you'd expect from the coding. Long story short: JSTL in JSF2 Facelets... makes sense?

You have to solve your particular problem differently. How to do that depends on the concrete functional requirement. If I understand you correctly that you just want to count all available children, then you need <c:forEach> instead of <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> 

or to delegate the job to a session scoped backing bean and provide a getter to return the count.

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;
}
那伤。 2025-01-02 09:56:06

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

你不能这样做。

你到底想做什么?

Taglibs ui and c have not the same life cycle.

You can't do this.

What do you want to do exactly ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文