使用f:ajax等待数据完成处理,然后更新

时间:2013-04-29 22:41:06

标签: java jsf java-ee

我在使用JSF,AJAX和JavaScript进行网格划分时遇到了困难。这就是我想要做的事情:

当用户提交表单时,会将其定向到新页面。页面最初检查他们的提交是否已被处理,如果没有,则显示进度条(参见Twitter Bootstrap)。然后,我使用f:ajax来检查它是否已完成处理。调用 waitForProcessing 方法;它只是等待,直到处理设置为true然后返回true。此时,f:ajax应调用JavaScript将进度条设置为不可见,然后更新页面。这是代码:

<ui:define name="content">

        <c:choose>
            <c:when test="#{not submission.isIsProcessed}">
                <f:ajax onevent="setVisibility('processing-dialog', 'none'); setVisibility('processing-backdrop', 'none');" listener="#{submission.waitForProcessing}" status="success" />

                <div class="modal-backdrop fade in" id="processing-backdrop"></div>
                <div id="processing-dialog" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false" style="display: block;">
                    <div class="modal-header">
                        <h3 id="myModalLabel">One sec...</h3>
                    </div>
                    <div class="modal-body">
                        <p>We are compiling and running your code!</p>
                        <div class="progress progress-striped active">
                            <div class="bar" style="width: 40%;"></div>
                        </div>
                    </div>
                </div>
            </c:when>
        </c:choose>
.......
.......

这里有很多事情没有用。首先,f:ajax抛出异常,因为显然f:ajax只能嵌套在某些组件中。有一个更好的方法吗?目标是显示进度条,直到后端处理完成。这个处理可能需要几分钟,这就是为什么我要经历麻烦而不是让网页自己加载,直到数据准备就绪。

1 个答案:

答案 0 :(得分:0)

您的问题是 f:ajax 只执行一次。如果要多次执行相同的ajax调用,则应使用 poll 组件,该组件仅在框架中可用作PrimeFaces,RichFaces等。 RichFaces的组件完全按照您的描述工作(它在内部使用轮询)。您可以在此处查看:RichFaces Progress Bar

相关问题