Jsf 从服务器端Java设置的A4J AJAX处理程序参数

Jsf 从服务器端Java设置的A4J AJAX处理程序参数,jsf,richfaces,jsf-1.2,ajax4jsf,Jsf,Richfaces,Jsf 1.2,Ajax4jsf,如何在服务器端添加在所有ajax响应中发送的内容,以便添加自己的参数 我已经扩展了richfaces JavaScriptA4J.AJAX.finishRequest,以触发自定义事件,并希望从服务器向其传递参数: var originalFinishRequest = A4J.AJAX.finishRequest; A4J.AJAX.finishRequest = function(request) { var parameters = request.options.paramet

如何在服务器端添加在所有ajax响应中发送的内容,以便添加自己的参数

我已经扩展了richfaces JavaScript
A4J.AJAX.finishRequest
,以触发自定义事件,并希望从服务器向其传递参数:

var originalFinishRequest = A4J.AJAX.finishRequest;

A4J.AJAX.finishRequest = function(request) {
    var parameters = request.options.parameters;
    if (!request._oncomplete_aborted) {

       jQuery(document).trigger('onAutofocus',parameters);
    }
    originalFinishRequest(request);
};
另一种方式是,服务器端对A4J.AJAX.Submit调用的响应是什么?我如何包装自己的代码


我的解决方案

根据BalusC的回答,这就是我最后在主模板中添加的内容:

<a4j:outputPanel ajaxRendered="true">
  <c:if test="#{not empty flowScope.autofocusSelectors}">
    <script>
      document.autofocusSelectors = #{flowScope.autofocusSelectors};
      console.log("BASE TEMPLATE: autofocus: (#{flowScope.autofocusSelectors})");
    </script>
  </c:if>
  <script>
    console.log("BASE TEMPLATE AJAX RENDER")
    //NB: autofocusSelectors not always set, and not only reason to autofocus
    jQuery(document).trigger('onAutofocus');
  </script>
</a4j:outputPanel>

document.autofocuselectors=#{flowScope.autofocuselectors};
log(“基本模板:自动聚焦:(#{flowScope.autofocuselectors})”;
log(“基本模板AJAX呈现”)
//注意:自动对焦选择项不总是设置的,这不是自动对焦的唯一原因
jQuery(document.trigger('onAutofocus');

虽然这在JSF2中很容易实现,而JSF2标准化了and,但在RichFaces 3.x Ajax4jsf中这并不是一件小事。Ajax响应由
org.ajax4jsf.Filter
处理,后者又从其他方面扩展。所有ajax响应编写代码都在这里。它的抽象方式不允许轻松添加自定义标记/脚本。你基本上需要复制、粘贴、修改它。这根本不值得努力

一种更简单的方法是自动ajax呈现包含JS风格中所需变量的部分
,以便可以将bean属性指定为全局JS变量

<a4j:outputPanel ajaxRendered="true">
    <script type="text/javascript">
        var parameters = <h:outputText value="#{bean.paramsAsJson}" />;
    </script>
</a4j:outputPanel>
(请注意,
request.options.parameters
基本上包含在触发ajax请求时由客户端发送的请求参数,而不是服务器端在返回ajax响应时设置的变量,因此首先查看它是错误的)

此外,我不太清楚为什么要这样重写
A4J.AJAX.finishRequest
,而不是使用
,但假设您只是不知道,下面是您可以如何使用它:

<a4j:status onstop="jQuery(document).trigger('onAutofocus', parameters)" />


我试图用额外的服务器端参数扩展
request.options.parameters
,因为这似乎比使用全局JS变量更整洁,因为我不想在任何地方插入脚本。我不知道ajaxRendered技术,但是如果我能够在我的基本模板中使用它,它看起来是一个很好的解决方案。
request.options.parameters
表示在发送ajax请求之前已经填充的HTTP请求参数映射。从服务器端来看,这绝对是不可变的。我知道
a4j:status onstop
,但它已经在代码中用于其他事情,我相信它只能定义一次。我还希望避免在每个页面上添加标签。考虑使用FACELET而不是JSP,那么您可以有一个主模板。但是,ala,在这样一个遗留应用上付出的努力可能是不值得的。可能是因为我是一个前端开发人员,试图让服务器端的东西让我的生活更轻松,所以我不知道richfaces我应该(现在)了解,但我不确定我是如何给人留下我没有使用facelets的印象的。
<a4j:status onstop="jQuery(document).trigger('onAutofocus', parameters)" />