Как избежать повторного выполнения последнего действия отправки формы при обновлении страницы?

#jsf-2

#jsf-2

Вопрос:

Я работаю над проектом, который разработан в JSF. Всякий раз, когда мы обновляем страницу JSF, событие последнего действия выполняется повторно. Например, когда я отправляю форму для удаления записи списка и обновления страницы результатов, тогда другая запись из списка в той же позиции также удаляется. Чем это вызвано и как я могу это решить?

я пробовал в faces-config.xml но это не решает мою проблему,

Чтобы получить более четкое представление о проблеме, с которой я сталкиваюсь, заключается в том, что я использую CommandLink для удаления одного ресурса из datatable , я использую атрибут actionlistener, который вызывает один метод в моем backingbean, поэтому проблема заключается в том, что когда-либо я обновляю событие действия страницы, и выполняется метод, который удаляет другой ресурс из таблицы. Заранее спасибо

Ответ №1:

Симптомы указывают на то, что страница была запрошена запросом POST и что вы игнорируете предупреждение веб-браузера о том, что данные будут повторно отправлены при обновлении запроса. Обновление запроса POST, конечно, приведет к его повторному выполнению. Это не специфичная для JSF проблема.

Общим решением для этого является отправка перенаправления на запрос GET после выполнения запроса POST. Таким образом, клиент в конечном итоге получит запрос GET в представлении браузера. Обновление этого приведет только к повторному выполнению запроса GET, который ничего (не должен) изменять (если вы не делаете это в конструкторе компонента с областью запроса, связанного с представлением). Это также известно как шаблон POST-Redirect-GET.

С JSF 2.0 вы можете добиться этого, просто добавив faces-redirect=true параметр к результату действия компонента.

 public String submit() {
    // ...

    return "viewid?faces-redirect=true";
}
 

Если вы все еще используете старомодные <navigation-case> s в faces-config.xml , то того же эффекта можно добиться, добавив <redirect/> в дело.

Единственным недостатком является то, что компоненты с областью запроса таким образом удаляются (перенаправление в основном указывает веб-браузеру создать совершенно новый запрос), и поэтому вы не можете передавать данные в область запроса, чтобы повторно отобразить их на перенаправленной странице. Например, отображение сообщения об успешном завершении. В JSF 2.0 вы могли бы вместо этого использовать для этого область flash или просто разрешить отправку сообщения путем <f:ajax> отправки вместо обычной отправки.

Комментарии:

1. Каждый раз, когда я вижу подобный ответ, я чувствую, что в «руководстве» есть какой-то большой раздел, который я должен был прочитать, но не прочитал. @BalusC у вас случайно нет ссылки на все правила, которые применяются к возвращаемому значению метода action ? Это первое, что я слышал о параметре faces-redirect . Какие другие параметры там возможны? Я подозреваю, что есть что-то, что было бы полезно, о чем я не знаю.

2. @Alan: Этот конкретный (шаблон PRG) — это общие знания в области веб-разработки и понимание того, как работают HTTP и webbrowsers. Что касается поддерживаемых специальных параметров действия, другой includeViewParams=true . Это включает в себя все объявленные <f:viewParam> текущего представления в качестве параметров запроса конечного результата. Я узнал об этом из чтения блогов / документации / ресурсов. Это также упоминается в руководстве по Java EE 6. Об этом также следует упомянуть в немного приличной книге по JSF 2.0, такой как JSF 2.0: полная ссылка и базовый JSF .

3. @BalusC У меня такая же проблема, только у меня есть таблица данных, где я могу выполнять обработку строк. Когда я обновляю страницу, последнее действие отправляется повторно. Как я могу это решить? У меня нет кнопки отправки?

4. В соответствии с ответом используйте PRG или ajax.

5. Не могли бы вы уточнить? Как бы я привязал ajax к перезагрузке?