16

我需要在页面加载时调用支持 bean 中的方法。我使用它实现了它

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

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

4

1 回答 1

30

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

你基本上有两个选择:

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

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

    只有在第一次构造 bean 时才会调用它。只要您在回发、ajax 或非 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.
            }
    
于 2013-02-04T15:13:00.900 回答