2011-02-25 39 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集成。