【问题标题】:How to avoid preRenderView method call in ajax request?如何避免在 ajax 请求中调用 preRenderView 方法?
【发布时间】:2013-01-19 05:19:09
【问题描述】:

我需要在页面加载时调用 backing bean 中的方法。我使用

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

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

【问题讨论】:

  • 使用 ??如果您需要帮助,请提供更多详细信息

标签: jsf-2


【解决方案1】:

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

你基本上有两个选择:

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

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

    只有在第一次构造 bean 时才会调用它。只要您在回发、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.
            }
    

【讨论】:

  • 感谢您的回答,但我的 Backing Bean 需要在会话范围内...我该如何处理?
  • 然后采用第二种方法。
  • 非常感谢 BalusC... 它工作得很好 :)
  • 嗨@BalusC,当你说:“只要你在回发中与同一个视图交互,一个视图范围的bean实例就存在,不管是否是ajax。”是什么意思?我有一个场景,我有一个视图范围 bean,我在数据表上有一个按钮。当用户单击该按钮时,它会查询一些数据并在同一视图中打开一个表单,并且用户可以选择通过单击返回返回到上一个屏幕。所有这些都发生在同一个 index.xhtml 视图上。然而,当点击 Return 时,postconstruct 正在触发。我检查了一些 SO 问题/答案,但还没有弄清楚。想法?
  • @BalusC,很遗憾我已经阅读了该链接但没有找到答案。
猜你喜欢
  • 2013-11-27
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2018-05-02
  • 2019-10-02
  • 2019-09-16
相关资源
最近更新 更多