JSF 2 ViewScope вопросы - PullRequest
       1

JSF 2 ViewScope вопросы

12 голосов
/ 31 марта 2011

Цитата из этой хорошей статьи ,

Новая область видимости должна решить именно эти проблемы. @ViewScoped боб будет жить до тех пор, пока вы отправив форму в том же виде опять и опять. Другими словами, как до тех пор, когда метод действия (ы) возвращает ноль или даже пустоту, боб будет там в следующем запросе. Как только вы перейдете к другому виду, тогда боб будет уничтожен.

И эти вопросы приходят на ум:

  1. Если мой текущий вид - index.xhtml, и если я явно укажу return "index"; или <h:commandButton action="index.xhtml" ..>, который в основном возвращает тот же самый вид, бин будет воссоздан заново ... почему?
  2. Может ли видимый объект пережить перенаправление?
  3. А если можно, как я могу это указать? Я не могу представить себе что-то вроде return "?faces-redirect=true" или <h:commandButton action="?faces-redirect=true" ..>, и да, я бы хотел пропустить определение навигации в faces-config.xml, используя <redirect/>.

Ответы [ 2 ]

12 голосов
/ 31 марта 2011

Если мое текущее представление - index.xhtml, и если я укажу явно, return "index";или, который в основном возвращается к тому же представлению, bean-компонент будет воссоздан снова .. почему?

Если вы явно указываете результат (читай: представление), то новое представлениебудет создан.Вы должны вернуть null или void из метода действия (или просто пропустить атрибут action компонента команды).

Я должен признать, что я понимаю вашу путаницу и что термин "представление" может бытьинтерпретируется по-разному, в зависимости от контекста.Я думаю, что рано или поздно я пересмотрю формулировку в связанной статье.

Может ли объект Viewscoped пережить перенаправление?

Нет.Только компоненты сессионной области могут и объекты в области flash (которая заканчивается сразу после завершения перенаправления, возможно, именно это вам на самом деле нужно для функциональных требований, которые вы имели в виду, когдазадавать этот вопрос).

0 голосов
/ 23 марта 2013

Состояние просмотра может пережить перенаправление, если указан javax.faces.ViewState.Самое простое на данный момент решение, которое я нашел, - это реализация обработчика навигации.

В Face-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);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...