我需要在页面加载时调用一个方法来支持bean。我用
实现了它<f:event listener="#{managedBean.onLoad}" type="preRenderView">
但是无论何时在页面中发出ajax请求,都会再次调用该方法。在我的要求中我不需要它。如何避免在ajax请求中调用该方法?
答案 0 :(得分:30)
在呈现视图之前,仅在每个请求上调用preRenderView
事件。 ajax请求也是呈现视图的请求。所以这种行为是完全可以预期的。
你基本上有两种选择:
在@PostConstruct
bean上用@ViewScoped
方法替换它。
@ManagedBean
@ViewScoped
public class ManagedBean {
@PostConstruct
public void onLoad() {
// ...
}
}
只有在第一次构造bean时才会调用它。只要您在回发中使用相同的视图,ajax或非回显,视图范围的bean实例就会存在。
如果当前请求是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.
}