我在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,但我试图将示例简化为最低限度)
答案 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集成。