К сожалению, я работаю с jsf, и у меня возникла проблема.
У меня есть страница jsf, которая отображает таблицу с некоторыми данными, используя компонент <h:dataTable>
.
В каждой строке этой таблицы есть <h:commandLink>
с действием Удалить, чтобы удалить элемент из этой строки.
Когда я выполняю это действие, метод в компоненте поддержки корректно вызывается, ArrayList , содержащий элементы таблицы, корректно обновляется, и метод навигации для возврата на ту же страницу, где находится таблица, правильно выполнен.
Но при перезагрузке страницы таблица не обновляется . Я вижу те же элементы, которые были в таблице перед действием удаления.
Если я снова перезагружу страницу, теперь таблица обновится.
Похоже, что представление визуализируется до того, как компонент поддержки завершит свои обновления.
Как я могу заставить рендеринг представления только после того, как компонент поддержки завершил свои обновления?
Вот код:
CommandLink на странице jsf внутри таблицы данных:
<h:column>
<f:facet name="header">
<h:outputText value="Rimuovi" />
</f:facet>
<h:commandLink action="#{servicesListBean.removeServizio}" title="Rimuovi questo servizio" onclick="if(!confirm('Vuoi davvero rimuovere questo servizio?')) return false">
<h:outputText value="Rimuovi" />
</h:commandLink>
</h:column>
А вот метод в бэк-бине:
public String removeServizio() {
this.servizioToRemove = (Servizio) getDataTable().getRowData();
try {
ServiziDAO.removeServizio(this.servizioToRemove.getId());
} catch (Exception e) {
// ...
}
return userSessionBean.goToElencoServizi();
}
В этом случае я передал область запроса компоненту поддержки.
Я уже пытался определить область действия сеанса и вызвать метод для обновления списка, но результат тот же.
Надеюсь, я был достаточно ясен. Спасибо всем заранее.
ОБНОВЛЕНИЕ ЭТОГО ВОПРОСА, КОТОРЫЕ ИЗМЕНЯЮТ ВСЕ
Спасибо всем.
Как сказал Макдауэлл, проблема была не во время визуализации представления, и проблема вообще не была связана с JSF.
Случилось так, что когда я удалял элемент из БД, я не удалял строку, я просто устанавливал конечную дату для элемента. Это правильный способ сделать это в моем приложении, но в то время как в запросе, который установил конечную дату для элемента, я потратил время, используя System.currentTimiMillis()
, в запросе, который перезагрузил обновленный список, я использовал sysdate
из Сервер Oracle.
Между этими двумя датами есть доли секунды разницы, и поэтому я мог видеть обновленный список сразу после перезагрузки страницы: потому что прошла одна или две секунды!
Может быть, эта проблема может быть полезна кому-то еще.