Вопросы 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);
    }
}

Это оказывает определенное влияние: каждое перенаправление больше не является независимым запросом. Это зависит от состояния представления, которое не может быть восстановлено. Так что у вас есть резервная стратегия, если она истек, например. переадресация на исключение с истекшим прогнозом.