Обновить / перенаправить с бэк-компонента, когда p:poll достигает определенного состояния
Я внедряю систему аукционов, используя jsf.
на странице товара у меня есть обратный отсчет, показывающий, сколько времени осталось до этой продажи. Я показываю это с <p:outputlabel value=#{itemBean.timeToEnd()} />
,
метод timeToEnd() возвращает строку в формате: 1 день, 2 часа... и т. д. Он вычисляет ее для объекта 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" />
при каждом использовании "конечной даты" вызывается сервер, а не хранится дата локально, а затем выполняется расчет, не мешая серверу. так что я даже не дошел до части JavaScript. если есть способ реализовать локально, буду рад услышать об этом.
1 ответ
Никогда не делайте бизнес / логику контроллера в методе получения. Также нет, если этот геттер представляет прямой вызов метода EL 2.2. В конце концов, это все еще выражение значения, которое оценивается только во время генерации вывода HTML и записи тела ответа во время фазы ответа рендеринга. Этот момент явно слишком поздно, чтобы установить заголовок ответа (чтобы поручить клиенту выполнить перенаправление).
Переместите эту логику в метод действия (слушателя).
<p:poll ... listener="#{bean.onpoll}" />
public void onpoll() {
// ...
if (someCondition) {
redirect();
}
}