如何避免在ajax请求中调用preRenderView方法?

时间:2013-02-04 13:35:58

标签: jsf-2

我需要在页面加载时调用一个方法来支持bean。我用

实现了它
<f:event listener="#{managedBean.onLoad}" type="preRenderView">

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

1 个答案:

答案 0 :(得分:30)

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

你基本上有两种选择:

  1. @PostConstruct bean上用@ViewScoped方法替换它。

    @ManagedBean
    @ViewScoped
    public class ManagedBean {
    
        @PostConstruct
        public void onLoad() {
            // ...
        }
    
    }
    

    只有在第一次构造bean时才会调用它。只要您在回发中使用相同的视图,ajax或非回显,视图范围的bean实例就会存在。


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

    @ManagedBean
    // Any scope.
    public class ManagedBean {
    
        public void onLoad() {
            if (FacesContext.getCurrentInstance().getPartialViewContext().isAjaxRequest()) { 
                return; // Skip ajax requests.
            }
    
            // ...
        }
    
    }
    

    或者,如果您真的对跳过回发而不是特别是ajax请求感兴趣,那么请改为:

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