当p:poll达到一定条件时,从后台bean刷新/重定向



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

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

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

我的问题是,当计数器达到0秒,我想刷新整个页面,它会显示销售是不活跃的。

在timeToEnd()中,我添加了一个逻辑,如果传递了结束日期,或者距离结束的秒数为0,那么执行以下代码来刷新页面:

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

但是不刷新页面我认为它不会刷新,因为页面"活"了一段时间。(用户所处的商品页面是销售活动的时间)。

关于如何实现这一点有什么想法吗?

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

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

对于每次使用"enddate"都调用服务器,而不是在本地存储日期,然后在不打扰服务器的情况下执行计算。所以我还没讲到javascript部分。如果有办法实现本地,将很高兴听到它。

永远不要在getter方法中使用业务/控制器逻辑。如果getter表示EL 2.2直接方法调用,也不需要。毕竟,它仍然是一个值表达式,只有在生成HTML输出和在呈现响应阶段编写响应体时才会计算它。此时设置响应头(指示客户端执行重定向)显然太晚了。

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

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

相关内容

  • 没有找到相关文章

最新更新