JSF2.0 View Scope & Redirect - PullRequest
       5

JSF2.0 View Scope & Redirect

0 голосов
/ 26 февраля 2011

У меня возникла следующая проблема с новым ViewScope в JSF2.0.

У меня есть класс, аннотированный как компонент области видимости с помощью метода @PostConstruct

@ManagedBean(name = "userListController")
@ViewScoped
public class UserListController {

    private String text = "myText";

    @PostConstruct
    public void init() {
       System.out.println("init") ;
    }
}

На главной странице (/pages/main.xhtml) есть кнопка для перехода на вторую страницу (/pages/user/list.xhtml), где я выводю свойство "text" компонента UserListController.

Кнопка:

<h:commandButton value="Manage Users" action="gotoUsers"/>

Навигационный регистр в face-config.xml:

<navigation-rule>
    <from-view-id>/pages/main.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>gotoUsers</from-outcome>
        <to-view-id>/pages/user/list.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

Когда я нажимаю кнопку с помощью Firefox / Chrome, я вижу, что метод @PostConstruct bean-компонента @ViewScoped вызывается дважды, а если я использую IE8, метод вызывается только один.

С помощью простого фазового трекера (в примере FF / Chrome):

DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - AFTER - APPLY_REQUEST_VALUES 2
DEBUG - PhaseTracker               - BEFORE - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - AFTER - PROCESS_VALIDATIONS 3
DEBUG - PhaseTracker               - BEFORE - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - AFTER - UPDATE_MODEL_VALUES 4
DEBUG - PhaseTracker               - BEFORE - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - AFTER - INVOKE_APPLICATION 5
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6
DEBUG - PhaseTracker               - BEFORE - RESTORE_VIEW 1
DEBUG - PhaseTracker               - AFTER - RESTORE_VIEW 1
DEBUG - PhaseTracker               - BEFORE - RENDER_RESPONSE 6
Init.
DEBUG - PhaseTracker               - AFTER - RENDER_RESPONSE 6

Я что-то не так делаю?

Из этого форума я вижу, что при ViewScope возникает ошибка, когда включена привязка компонента, но мой bean-компонент на самом деле является только строкой (конечно, проблема возникает из очень сложного примера, когда я пытаюсь загрузить некоторые данные из БД в методе @PostConstruct, но я попытался свести пример к минимуму)

1 Ответ

0 голосов
/ 21 апреля 2011

Прежде всего правила навигации являются необязательными в JSF 2.0. У меня есть довольно большой проект, над которым я сейчас работаю, и я им не пользовался. Посмотрите, что это делает для вас.

<h:commandButton value="Manage Users" action="list?faces-redirect=true"/>

Так я делаю навигацию или просто вызываю метод, возвращающий это как строку.

<h:commandButton value="Manage Users" action="#{backingBean.doList}"/>


  public String doList() {
 return "list?faces-redirect=true";
}

Правила навигации в JSF оставляют желать лучшего. Если вам действительно нужен контроль, посмотрите Spring Web Flow и его интеграцию с JSF.

...