JSF2.0查看范围&重定向

时间:2011-02-25 21:56:00

标签: jsf-2 managed-bean

我在JSF2.0中遇到了新的ViewScope问题。

我有一个使用@PostConstruct方法注释为视图范围bean的类

@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),我输出UserListController bean的属性“text”。

按钮是:

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

faces-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点击按钮时,我看到@ViewScoped bean的@PostConstruct方法被调用两次,而如果我使用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方法中的DB,但我试图将示例简化为最低限度)

1 个答案:

答案 0 :(得分:0)

首先,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集成。