我正在使用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());
但它不刷新页面。 我认为它不会刷新,因为页面已经“实时”了一段时间。 (用户在销售活跃时的项目页面上)。
关于如何实施这一点的任何想法?
P.S 我还尝试在客户端级别实现此倒计时,当我使用c:set存储结束日期,然后使用javascript或其他东西进行视图更新。但后来我注意到了代码
<c:set var = "enddate" value = "#{itemsBean.endDate}" scope="session" />
每次使用“enddate”时都会调用服务器,而不是在本地存储日期,然后在不打扰服务器的情况下执行计算。所以我甚至没有进入javascript部分。 如果有办法在当地实施,很高兴听到它。
答案 0 :(得分:4)
永远不要在getter方法中执行业务/控制器逻辑。如果getter表示EL 2.2直接方法调用,也不是。毕竟它仍然是一个值表达式,它只在生成HTML输出期间进行评估,并在渲染响应阶段写入响应主体。设置响应标头(指示客户端执行重定向)显然为时已晚。
将该逻辑移动到动作(侦听器)方法。
<p:poll ... listener="#{bean.onpoll}" />
public void onpoll() {
// ...
if (someCondition) {
redirect();
}
}