2

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

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

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

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

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

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

但它不会刷新页面。 我认为它不会刷新,因为该页面“活动”了一段时间。(用户从销售活动开始就在项目页面上)。

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

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

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

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

4

1 回答 1

4

永远不要在 getter 方法中执行业务/控制器逻辑。如果那个 getter 代表 EL 2.2 直接方法调用,也不是。毕竟它仍然是一个值表达式,仅在生成 HTML 输出和在呈现响应阶段写入响应正文期间进行评估。那一刻显然为时已晚,无法设置响应标头(指示客户端执行重定向)。

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

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

    if (someCondition) {
        redirect();
    }
}
于 2015-05-26T09:36:59.653 回答