Симптомы указывают, что страница была запрошена запросом POST и что вы игнорируете предупреждение веб-браузера о том, что данные будут повторно отправлены при обновлении запроса.Обновление запроса POST, конечно, приведет к его повторному выполнению.Это не специфическая проблема JSF.
Распространенным решением является отправка перенаправления на запрос GET после выполнения запроса POST.Таким образом, клиент получит запрос GET в представлении браузера.Обновление этого параметра приведет к повторному выполнению запроса GET, который ничего не изменяет (не должен) (если вы не делаете это в конструкторе bean-объекта области действия запроса, связанного с представлением).Это также называется шаблоном POST-Redirect-GET .
В JSF 2.0 этого можно достичь, просто добавив параметр faces-redirect=true
к результату действия компонента.
public String submit() {
// ...
return "viewid?faces-redirect=true";
}
Если вы все еще используете устаревшие <navigation-case>
s в faces-config.xml
, то тот же эффект может быть достигнут путем добавления <redirect/>
к делу.
Единственный недостаток - это запросbean-объекты scoped обрабатываются таким образом (перенаправление в основном инструктирует веб-обозреватель создать новый запрос), и, таким образом, вы не можете передать данные в область запроса, чтобы повторно отобразить их на перенаправленной странице.Например, отображение сообщения об успехе.В JSF 2.0 вы могли бы вместо этого использовать для этого область флеш-памяти или просто разрешить POST путем <f:ajax>
отправки вместо обычной отправки.