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