关于jsf 2:如何避免ajax请求中的preRenderView方法调用?

How to avoid preRenderView method call in ajax request?

我需要在页面加载时调用 backing bean 中的方法。我使用

实现了它

1
<f:event listener="#{managedBean.onLoad}" type="preRenderView">

但是,每当在页面中发出 ajax 请求时,就会再次调用该方法。我的要求中不需要它。如何避免在 ajax 请求中调用该方法?


preRenderView 事件只是在渲染视图之前在每个请求上调用。 ajax 请求也是呈现视图的请求。所以这种行为是完全可以预料的。

你基本上有两个选择:

  • @ViewScoped bean 上的 @PostConstruct 方法替换它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @ManagedBean
    @ViewScoped
    public class ManagedBean {

        @PostConstruct
        public void onLoad() {
            // ...
        }

    }

    只有在第一次构造 bean 时才会调用它。只要您在回发、ajax 与否之间与同一个视图交互,视图范围的 bean 实例就会存在。

  • 如果当前请求是 ajax 请求,请在侦听器方法内部执行检查。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @ManagedBean
    // Any scope.
    public class ManagedBean {

        public void onLoad() {
            if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) {
                return; // Skip ajax requests.
            }

            // ...
        }

    }

    或者,如果您真的对跳过回发而不是专门的 ajax 请求感兴趣,那么请改为这样做:

    1
    2
    3
            if (FacesContext.getCurrentInstance().isPostback()) {
                return; // Skip postback requests.
            }