Refresh/Redirect 当 p:poll 达到特定条件时来自支持 bean

Refresh/Redirect from backing bean when p:poll reaches certain condition

我正在使用 jsf 实现拍卖系统。

在商品页面中,我有一个倒计时,显示此次促销还剩多少时间。我用 <p:outputlabel value=#{itemBean.timeToEnd()} />.

显示它

timeToEnd() 方法 returns 格式为:1 天,2 小时.. 等的字符串。 它在该 bean 内的 Date 对象上计算它。 我以 1 秒的间隔用 <p:poll> 更新标签。

我的问题是,当计数器达到 0 秒时,我想刷新整个页面,它会显示销售处于非活动状态。

在timeToEnd()中,我添加了一个逻辑,如果结束日期已过,或者结束秒数为0,则执行以下假设刷新页面的代码:

ExternalContext ec1 =FacesContext.getCurrentInstance().getExternalContext();             
ec.redirect(((HttpServletRequest) ec.getRequest()).getRequestURI());

但是没有刷新页面。 我认为它不会刷新,因为页面 "live" 有一段时间了。 (用户从销售活动开始就在商品页面上)。

关于如何实施的任何想法?

P.S 当我使用 c:set 存储结束日期然后使用 javascript 或其他内容进行视图更新时,我还尝试在客户端级别实现此倒计时。但后来我注意到代码

 <c:set var = "enddate" value = "#{itemsBean.endDate}" scope="session"  />

每次使用 "enddate" 都会调用服务器,而不是在本地存储日期,然后在不打扰服务器的情况下执行计算。所以我什至没有进入 javascript 部分。 如果有一种在本地实施的方法,我会很高兴听到它。

切勿在 getter 方法中执行 business/controller 逻辑。如果 getter 表示 EL 2.2 直接方法调用,则也不行。毕竟它仍然是一个值表达式,仅在生成 HTML 输出和在呈现响应阶段写入响应 body 期间进行评估。那一刻显然为时已晚,无法设置响应 header(指示客户端执行重定向)。

将该逻辑移至操作(侦听器)方法。

<p:poll ... listener="#{bean.onpoll}" />
public void onpoll() {
    // ...

    if (someCondition) {
        redirect();
    }
}