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