Вопросы JSF 2 ViewScope
Цитата из хорошая статья,
Новая область обзора должна решить именно эти проблемы. A @ViewScoped bean будет жить так долго, как вы отправка формы в ту же точку зрения опять и опять. Другими словами, поскольку когда метод действия возвращает null или даже void, beanбудет в следующем запросе. Когда вы перейдете к другому виду, то bean будет разбит.
И эти вопросы приходят в голову:
- Если мое текущее представление
index.xhtml
, и если я укажу явно return "index";
или <h:commandButton action="index.xhtml" ..>
, который в основном возвращается к тому же представлению, bean снова будет воссоздан.. почему?
- Можно ли просмотреть просмотренное bean перенаправление?
- И если это возможно, как я могу его указать? Я не могу себе представить что-то вроде
return "?faces-redirect=true"
или <h:commandButton action="?faces-redirect=true" ..>
, и да, я бы хотел пропустить определение навигации в faces-config.xml
с помощью <redirect/>
.
Ответы
Ответ 1
Если мое текущее представление - index.xhtml, и если я указываю явно возвращать "индекс"; или, который в основном возвращается к одному и тому же виду, bean снова будет воссоздан.. почему?
Если вы явно укажете результат (чтение: представление), тогда будет создано новое представление. Вы должны вернуть null или void из метода действия (или просто оставить атрибут action
компонента команды).
Я должен признать, что я понимаю ваше замешательство и что термин "представление" можно интерпретировать по-разному, в зависимости от контекста. Я думаю, что рано или поздно я пересмотрю формулировку в связанной статье.
Может ли Viewscoped bean пережить перенаправление?
Нет. Только сеанс beans может и объекты в флэш-сфере также (который заканчивается сразу после завершения перенаправления, возможно, что вам действительно нужно для функционального требования, которое вы имел в виду, задавая этот вопрос).
Ответ 2
Состояние представления может пережить перенаправление, если поставляется javax.faces.ViewState. В настоящее время самое простое решение, которое я нашел, реализует обработчик навигации.
В faces-config.xml:
<faces-config>
<application>
...
<navigation-handler>com.intersult.jsf.util.RedirectNavigationHandler</navigation-handler>
</application>
...
</faces-config>
Класс Java:
public class RedirectNavigationHandler extends ConfigurableNavigationHandler {
private NavigationHandler parent;
public RedirectNavigationHandler(NavigationHandler parent) {
this.parent = parent;
}
@Override
public void handleNavigation(FacesContext context, String from, String outcome) {
if (!context.getPartialViewContext().isPartialRequest()) {
if (outcome == null)
outcome = context.getViewRoot().getViewId();
if (!outcome.endsWith("?faces-redirect=true"))
outcome += "?faces-redirect=true";
String viewState =
context.getExternalContext().getRequestParameterMap().get(ResponseStateManager.VIEW_STATE_PARAM);
outcome += "&javax.faces.ViewState=" + viewState;
}
parent.handleNavigation(context, from, outcome);
}
}
Это оказывает определенное влияние: каждое перенаправление больше не является независимым запросом. Это зависит от состояния представления, которое не может быть восстановлено. Так что у вас есть резервная стратегия, если она истек, например. переадресация на исключение с истекшим прогнозом.