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

Aru*_*run 16 jsf-2

我需要在页面加载时调用一个方法来支持bean.我用它实现了它

<f:event listener="#{managedBean.onLoad}" type="preRenderView">
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 30

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

你基本上有两个选择:

  1. @PostConstruct@ViewScopedbean 上用方法替换它.

    @ManagedBean
    @ViewScoped
    public class ManagedBean {
    
        @PostConstruct
        public void onLoad() {
            // ...
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

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


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

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

    或者,如果您真的对跳过回发而不是特别是ajax请求感兴趣,那么请执行以下操作:

            if (FacesContext.getCurrentInstance().isPostback()) { 
                return; // Skip postback requests.
            }
    
    Run Code Online (Sandbox Code Playgroud)