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

时间:2012-12-20 17:38:02

标签: jsf richfaces jsf-1.2 ajax4jsf

如何在服务器端添加所有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>

1 个答案:

答案 0 :(得分:0)

虽然JSF2很容易将oneother标准化,但在RichFaces 3.x Ajax4jsf中这并不是一件容易的事。 Ajax响应由org.ajax4jsf.Filter处理,后者又从BaseXmlFilter中扩展。所有的ajax响应编写代码都在那里。它不是以这样的方式抽象的,它允许轻松添加自定义标签/脚本。你基本上需要复制'n'paste'n'修改它。这不值得努力。

更简单的方法是自动ajax渲染一些包含JS flavor中所需变量的<script>,以便可以将bean属性指定为全局JS变量。

<a4j:outputPanel ajaxRendered="true">
    <script type="text/javascript">
        var parameters = <h:outputText value="#{bean.paramsAsJson}" />;
    </script>
</a4j:outputPanel>

ajaxRendered="true"确保在每个ajax请求中自动重新呈现它,这样您就不需要将其ID显式添加到某些A4J组件的reRender属性中)

其中getParamsAsJson()只返回有效JSON格式的Java字符串,如{ foo: "foo", bar: "bar" }。这样你就可以使用

A4J.AJAX.finishRequest = function(request) {
    if (!request._oncomplete_aborted) {
       jQuery(document).trigger('onAutofocus', parameters);
    }
    originalFinishRequest(request);
};

(注意request.options.parameters基本上包含客户端在触发ajax请求时发送的请求参数,而不是服务器端在返回ajax响应时设置的变量,所以它是在第一个地方已经错了看)

此外,我不完全确定你为什么要覆盖A4J.AJAX.finishRequest而不是使用<a4j:status onstop="...">而不是使用<a4j:status onstop="jQuery(document).trigger('onAutofocus', parameters)" /> ,但假设你只是不知道它,这就是你如何使用相反:

{{1}}