2011-02-25 82 views
0

我有JSF2.0中新的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)在那里输出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 /铬按钮我看到@PostConstruct方法@ViewScoped bean被调用两次,而如果我使用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的一个bug,但我的bean实际上只是一个字符串(当然问题来自一个非常复杂的例子,我试图加载一些数据从@PostConstruct方法中的数据库,但我试图将示例减少到最低限度)

回答

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