【问题标题】:preRenderView is called on every ajax request在每个 ajax 请求上调用 preRenderView
【发布时间】:2013-11-27 07:17:33
【问题描述】:

我在 link 之后使用 jquery waypoints 和 jsf 实现无限滚动。 我对需要无限滚动的 xhtml 之一进行了预渲染。 现在,由于航点发送 ajax 请求,所以为什么每次滚动都调用 prerender,这意味着整个页面都在刷新。 请告诉我如何解决这个问题。

【问题讨论】:

    标签: ajax jsf primefaces infinite-scroll prerenderview


    【解决方案1】:

    您似乎认为preRenderView 事件在视图构建期间仅被调用一次,并且不会在同一视图的后续请求中调用。这是不真实的。 preRenderView 事件在视图呈现之前被调用。 每个请求都会呈现视图。这还包括 ajax 请求(它应该如何为 ajax 请求生成必要的 HTML 输出?)。因此,您所看到的行为是完全可以预料的。您只是使用了错误的工具来完成这项工作。

    您应该使用@ViewScoped bean 的@PostConstruct 方法,

    @ManagedBean
    @ViewScoped
    public class Bean {
    
        @PostConstruct
        public void init() {
            // Do here your thing during construction of the view.
        }
    
        // ...
    }
    

    或在预渲染视图事件侦听器中对 FacesContext#isPostback() 添加否定检查

    public void preRender() {
        if (!FacesContext.getCurrentInstance().isPostback()) {
            // Do here your thing which should run on initial (GET) request only.
        }
    }
    

    另见:

    【讨论】:

    • 谢谢@BalusC,我还有一个查询。实际上我无法阻止“viewExpiredException”。我正在做的事情如下:- 1.)我已经登录到应用程序。 2.)现在我重新启动了服务器 3.)现在当我刷新打开的页面时,它会直接进入错误页面,但应该发生的是它应该导航到登录页面,因为我在 web.xml 和 prerender 中声明了它login.xhtml 我正在检查 cookie 是否存在,然后直接转到主页。请让我知道我错过了什么?
    • 不客气。如果您有一个新的且完全不相关的问题,只需按右上角的“”按钮。对不同问题的答案的 cmets 不适合这样做。不可能发布和接受对此的答案,并且将来没有人能够通过搜索找到答案,只要他们有相同的问题。
    • 好的@BalusC,我已经发布了问题和链接是link
    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多