Введение
Есть несколько способов добиться этого. Наивный способ - просто обнулить поля в бобе. Безумный способ - захватить JS / jQuery для работы, которая делает это после отправки или даже во время загрузки страницы. Эти способы только вводят ненужный код и указывают на проблему мышления / дизайна. Все, что вам нужно, это просто начать с нового запроса / page / view / bean. Примерно так, как вы получите с запросом GET.
POST-Redirect-GET
Таким образом, лучший способ - просто отправить перенаправление после отправки. Вы, вероятно, когда-либо слышали об этом: POST-Redirect-GET . Он дает вам новый новый запрос GET после запроса POST (отправка формы), именно так, как вы и планировали. Это дает дополнительное преимущество, заключающееся в том, что ранее представленные данные не передаются повторно, когда конечный пользователь неосознанно нажимает F5 после этого и игнорирует предупреждение браузера.
Существует несколько способов выполнения PRG в JSF.
Просто вернитесь к тому же представлению со faces-redirect=true
строкой запроса. Предполагая /page.xhtml
, вы можете сделать это в методе действия:
public String submit() {
// ...
return "/page.xhtml?faces-redirect=true";
}
Если вы все еще возитесь с навигационными кейсами по пути JSF 1.x, тогда вам нужно добавить <redirect/>
к рассматриваемому кейсу. См. Также Как сделать перенаправление с помощью правила навигации .
Чтобы сделать его более пригодным для повторного использования, вы можете получить идентификатор вида программно:
public String submit() {
// ...
UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
return view.getViewId() + "?faces-redirect=true";
}
В любом случае, если вы просматриваете параметры, которые также должны быть сохранены в URL запроса, добавьте &includeViewParams=true
к результату. См. Также Сохранение параметров строки запроса GET в форме JSF submit .
Если вы используете какое-либо решение для перезаписи URL, которое работает вне контекста JSF, то вам лучше всего взять текущий URL-адрес запроса (со строкой запроса) и использовать ExternalContext#redirect()
, чтобы перенаправить именно на него.
public void submit() throws IOException {
// ...
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
StringBuffer requestURL = ((HttpServletRequest) ec.getRequest()).getRequestURL();
String queryString = ((HttpServletRequest) ec.getRequest()).getQueryString();
ec.redirect((queryString == null) ? requestURL.toString() : requestURL.append('?').append(queryString).toString());
}
Это всего лишь беспорядок, который действительно должен быть переработан в некоторый служебный класс.
Запрос / Просмотр области видимости боба
Обратите внимание, что все это работает только в сочетании с запросом или просмотром bean-объекта bean. Если вы привязали к форме bean-объект сессионной области, то bean-компонент не будет воссоздан с нуля. У вас есть еще одна проблема, которую тоже нужно решить. Разделите его на меньшую область сессий для данных области сеанса и область с видом представления для данных области просмотра. См. Также Как правильно выбрать область применения бобов?
Лица сообщений
Если у вас есть сообщение лица, которое будет показано в результате успешного действия, просто сделайте его мгновенным. См. Также Как показать сообщение о лицах на перенаправленной странице .
public String submit() {
// ...
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(clientId, message);
context.getExternalContext().getFlash().setKeepMessages(true);
return "/page.xhtml?faces-redirect=true";
}
Ajax
Только если у вас есть страница, предназначенная только для ajax, на которой F5 всегда будет вызывать новый новый запрос GET, то просто обнуление полей модели в методе действия не должно сильно навредить.
Смотри также: