如何在后端Bean中获取JSF资源包属性值?

11

我正在使用JSF 2。我试图动态解析一个托管bean属性中的消息包引用。该值包含包名称以及键名。这是必需的,因为该值可能来自几个不同的包之一。我尝试了很多排列组合,但似乎来自bean的值始终被解析为字面字符串(带有EL括号输出),而且从未调用包来解析和返回值。有什么想法吗?

我已经尝试过:

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

它们会完全按原样输出,即使在<h:outputText>中也是如此。如果我直接在页面中编写它,则可以正常工作。我的理论是JSF没有意识到它必须将字符串处理为表达式。有没有办法强制它这样做?

2个回答

19

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

非常感谢BalusC的及时和有益的回答,这解决了我的问题。 - RobP

1

试一下这个...

由msg引用的资源包

USD=$

xhtml 代码:

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

这应该可以运行…

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接