2012-02-24 61 views
9

我正在使用JSF 2.我試圖動態解析消息包引用的託管bean屬性。該值包含軟件包名稱以及密鑰。這是必需的,因爲該值可能來自幾個不同的捆綁包之一。我嘗試了許多排列,但是來自bean的值似乎總是作爲一個字符串來解析(使用EL括號輸出),並且從未調用該bundle來解析並返回值。有任何想法嗎?如何獲得後臺bean中的JSF資源包屬性值?

我曾嘗試:

#{bundle['key']} 
${bundle['key']} 
bundle['key'] 

他們究竟輸出原樣,也處於<h:outputText>。如果我直接在頁面中寫入,它會正常工作。我的理論是,JSF沒有意識到它必須將字符串作爲表達式來處理。有沒有辦法強制它?

回答

17

EL只能在視圖中解析,而不能在模型中解析。否則它會是一個巨大的EL注入攻擊漏洞,它允許最終用戶在輸入字段中輸入任意EL表達式並解決它們。不,你不能以任何方式強迫它。

您需要自己解決。你可以做到這一點無論是評估它以編程方式使用Application#evaluateExpressionGet()

FacesContext context = FacesContext.getCurrentInstance(); 
String value = context.getApplication().evaluateExpressionGet(context, "#{bundle['key']}", String.class); 
// ... 

或者說,在這種特殊情況下,僅通過使用ResourceBundle API一樣,直接爲JSF在幕後做:

ResourceBundle bundle = ResourceBundle.getBundle(basename, FacesContext.getCurrentInstance().getViewRoot().getLocale()); 
String value = bundle.getString("key"); 
// ... 
+0

謝謝BalusC的及時和有益的反應,這已經回答了我的問題。 – RobP 2012-02-27 11:39:44

+0

不客氣。 – BalusC 2012-02-27 11:48:45

1

嘗試這個..

資源包味精引用

USD=$ 

XHTML代碼:

<c:set var="key" value="#{managedBean.currencyCode}" /> 
<h:outputText value="#{msg[key]}"/> 

這應該工作..