JSF: перезагрузить страницу после изменения данных
Используя DataModel<MyObject>
Я заполняю таблицу данных в соответствии с этим ответом
Теперь в конце каждой строки у меня есть кнопка удаления, которая вызывает определенный метод моего компонента. Данные аккуратно удаляются. Но так как данные были изменены после удаления, я бы хотел перезагрузить страницу, чтобы отразить изменения.
Я попытался добавить правило навигации в faces-config.xml
:
обзор /overview.jsp удаленная подписка /overview.jsp
Если у меня есть <redirect />
или нет, так или иначе это не перезагружает или делает что-то еще вообще. Данные удаляются, поэтому метод бина фактически вызывается.
Моя кнопка выглядит так:
<h:dataTable border="1" value="#{overviewBean.overviewModel }" var="item" first="0">
<h:column id="column13">
<f:facet name="header">
<h:outputText value="#{messages.overviewDeleteItem }"></h:outputText>
</f:facet>
<h:commandButton action="#{overviewBean.deleteItem}" value="X"/>
</h:column>
</h:dataTable>
Установка атрибута type="submit"
на самом деле решает проблему. Страницы перезагружаются.
Мой вопрос сейчас: действительно ли требуется отправка? Разве JSF (Apache MyFaces) не имеет какого-либо механизма использования AJAX для удаления только что удаленной строки?
Спасибо за попытку помочь новичку JSF.
1 ответ
Просто удалите элемент из списка поддержки модели данных. Изменения будут отражены в модели.
В принципе:
private List<MyObject> overviewList;
private DataModel overviewModel;
public OverviewBean() {
overviewList = overviewDAO.list();
overviewModel = new ListDataModel(overviewList);
}
public void deleteItem() {
MyObject myObject = (MyObject) overviewModel.getRowData();
overviewDAO.delete(myObject);
overviewList.remove(myObject); // See?
}
Перенаправление после этого не требуется. Если метод действия возвращает void (или null
), он все равно перейдет на ту же страницу.
Аяксические возможности были введены в JSF 2.0, но если я не ошибаюсь, вы все еще используете JSF 1.x. Лучше всего принять стороннюю библиотеку компонентов, такую как Ajax4jsf (в настоящее время является частью RichFaces), если вы считаете это необходимым.