如何在backingbean中获取JSF资源包属性值



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

我试过:

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

它们也在<h:outputText>中按原样输出。如果我直接写在页面上,效果会很好。我的理论是JSF没有意识到它必须将String作为一个表达式来处理。有什么办法可以强迫它吗?

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

试试这个。。

消息引用的资源捆绑包

USD=$

xhtml代码:

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

这应该有效。。

最新更新