2011-08-05 85 views
1

我嘗試了MyFaces CODI與它的奇妙功能。類型安全導航非常有用。我可以在我的控制器豆指定一個動作方法的結果是這樣的:JSF:MyFaces CODI類型安全導航和f:viewParam

public Class<? extends ViewConfig> goBack() { 
    return Pages.ListView.class; 
} 

這是因爲每個開發IDE的過度重構能力真的很酷。

但是,當我想使用此功能,我有一個傳遞viewParameter到下一個視圖的問題。我必須使用一個命令按鈕來調用這樣這個動作方法:

<h:commandButton id="backButton" value="#{msgs.Button_Back}" 
action="#{viewBean.goBack()}" /> 

如果我用這個命令按鈕,我不能傳遞參數。 「正常」按鈕或鏈接會做到這一點:

<h:button id="backButton" value="#{msgs.Button_Back}" outcome="siteBefore.xhtml"> 
    <f:param name="itemId" value="5" /> 
</h:button> 

的缺點是「正常」的按鈕,不使用的操作方法,因此我無法對CODI的類型安全導航的優勢參與。

那麼有沒有可能將這兩個功能結合起來? (通過viewparams和使用typeafe導航)

在此先感謝!

回答

0

@StevenR

使用類型安全導航的時候,如果你按照他們的問題跟蹤系統,這似乎是一個潛在的功能CODI不支持列入viewParams的,但是:

https://issues.apache.org/jira/browse/EXTCDI-171

從問題的歷史你可以告訴他們最近更新了狀態(〜4周前),並且很快就會包含它。也許其中一個comitters是這個帖子後,可以更新我們這個新功能粗糙的時間線?

而且類型安全導航的功能已在JSF規範中討論:

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-977

作爲一種解決辦法,我建議做遵循CODI維基的提示(見下面的URL的一部分),並使用Pages.ListView.class.getName(),您可以在支持bean的操作方法中連接其他viewParams。這樣您的導航就是安全的,並且可以利用IDE的重構功能。只有PARAMS不會是類型安全的這樣......

我會建議你使用<f:attribute/>標籤,所以你不必走線槽這樣

String viewParam = ""; 
for (UIComponent comp : event.getComponent().getChildren()) { 
    if (comp instanceof UIParameter) { 
     UIParameter myParameter = (UIParameter) comp; 
    if (myParameter.getName().equals("myParameterName")) { 
     viewParam = myParameter.getValue()); 
    } 
} 
} 
// add your viewParam to the navigation string here 

這裏的缺點是硬在代碼深處的參數的編碼名稱。所以一旦CODI配備了新的功能

cwiki.apache.org/EXTCDI/jsf-usage.html#JSFUsage-TypesafeNavigation