我正在使用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();
}
}