【问题标题】:JSF simultaneous ajax callsJSF 同时进行 ajax 调用
【发布时间】:2026-01-29 10:45:02
【问题描述】:

是否可以使用 JSF 进行将同时执行的 ajax 调用(在开始新的调用之前不等待之前的调用完成)?

【问题讨论】:

    标签: ajax jsf


    【解决方案1】:

    不,它们是按规范明确排队的,没有任何例外。见JSF 2 specification的第13.3.2章:

    13.3.2 Ajax 请求队列

    所有的 Ajax 请求必须先放入客户端请求队列,然后再发送到客户端 服务器确保 Ajax 请求按照发送顺序进行处理。一直在队列中等待的请求 最长的是要发送的下一个请求。发送请求后,Ajax 请求回调函数必须移除该请求 从队列中(也称为出队)。如果请求成功完成,则必须将其从队列中删除。如果 发生错误,必须通知客户端,但仍必须从队列中删除请求,以便下一个请求 可以发送。必须发送下一个请求(队列中最早的请求)。参考jsf.ajax.request 关于 Ajax 请求队列的更多细节的 JavaScript 文档。

    这样做是为了确保服务器端视图范围 bean 的线程安全。

    【讨论】:

    • 谢谢。是否可以使用一些 javascript 访问此队列并找到解决方法?我想要一些事件立即生成一个 ajax 请求?如果有办法从队列中删除,和/或取消正在执行的请求,那对我有用。
    • 不通过标准 API。至少,公共 JS API 中没有任何内容:javaserverfaces.java.net/nonav/docs/2.0/jsdocs/symbols/… 要么解决您在 ajax 请求/响应处理中的最大性能瓶颈,要么只是不经常发送 ajax 请求,或者重新发明 JSF Ajax API。
    • RichFaces 和 MyFaces 都支持管理 Ajax 请求队列(RichFaces 中的<a4j:queue>,MyFaces 中使用 jsf.js)。这可能会对您有所帮助。
    【解决方案2】:

    为了防止页面或某些表单的所谓 View-State 出现问题,AJAX 请求被序列化。

    JSF-Extensions (https://www.intersult.com/wiki/page/JSF%20Ext) 让您可以选择并行化 AJAX 请求。只需将 JavaScript 变量 jsf.ajaxQueue 设置为默认值 1 以外的另一个值。但是,如果您不手动锁定来自同一表单内的重复请求或同一区域的渲染,则会出现错误。

    这是您激活并行请求的方式:

    <script type="text/javascript">
        if (jsf)
            jsf.ajaxQueue = 2;
    </script>
    

    例如,您可以使用 并行化页面服务器上的呈现。大多数应用程序不需要并行请求,因为它们在严格序列化时运行良好。

    【讨论】: