我需要在页面加载时调用支持bean的方法.我实现了它使用
<f:event listener="#{managedBean.onLoad}" type="preRenderView">
但是,只要在页面中进行ajax请求,该方法将再次被调用.我不需要我的要求.如何避免该方法调用ajax请求?
在渲染视图之前,只要在每个请求上调用preRenderView事件. ajax请求也是呈现视图的请求.所以行为是完全预期的.
你基本上有两个选择:
>在@ViewScoped bean上用@postconstruct方法替换它.
@ManagedBean
@ViewScoped
public class ManagedBean {
@postconstruct
public void onLoad() {
// ...
}
}
这是在第一次构建bean时调用的.视图范围的bean实例只要在与postbacks(ajax)不同的交互中与同一视图进行交互即可.
>如果当前请求是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.
}