0

我对 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 的属性“文本”。

按钮是:

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

faces-config.xml 中的 Navigation 案例是:

<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 方法,但我试图将示例减少到最低限度)

4

1 回答 1

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 的集成。

于 2011-04-21T03:31:41.083 回答