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), если вы считаете это необходимым.

Другие вопросы по тегам