我正在使用JSF 2.我正在尝试动态解析托管bean属性的消息包引用。该值包含包名称和密钥。这是必需的,因为该值可能来自几个不同的包中的一个。我已经尝试了很多排列,但是bean的值似乎总是被解析为文字字符串(用EL括号输出),并且从不调用bundle来解析并返回值。有什么想法吗?
我试过了:
#{bundle['key']}
${bundle['key']}
bundle['key']
它们完全按原样输出,也在<h:outputText>
中输出。如果我直接在页面中写它,它工作正常。我的理论是JSF没有意识到它必须将String作为表达式处理。有没有办法强迫它?
答案 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]}"/>
这应该有用..