如何在支持bean中获取JSF资源包属性值?

时间:2012-02-24 15:32:09

标签: jsf jsf-2 bundle el

我正在使用JSF 2.我正在尝试动态解析托管bean属性的消息包引用。该值包含包名称和密钥。这是必需的,因为该值可能来自几个不同的包中的一个。我已经尝试了很多排列,但是bean的值似乎总是被解析为文字字符串(用EL括号输出),并且从不调用bundle来解析并返回值。有什么想法吗?

我试过了:

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

它们完全按原样输出,也在<h:outputText>中输出。如果我直接在页面中写它,它工作正常。我的理论是JSF没有意识到它必须将String作为表达式处理。有没有办法强迫它?

2 个答案:

答案 0 :(得分:18)

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");
// ...

答案 1 :(得分:1)

试试这个..

msg

引用的资源包
USD=$

xhtml代码:

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

这应该有用..