我正在使用 JSF 2。我正在尝试通过托管 bean 属性动态解析消息包引用。该值包含包名称和键。这是必需的,因为该值可能来自几个不同的 bundle 之一。我尝试了许多排列,但是来自 bean 的值似乎总是被解析为文字字符串(使用 EL 括号输出),并且永远不会调用包来解析和返回值。有任何想法吗?
我试过了:
#{bundle['key']}
${bundle['key']}
bundle['key']
它们完全按原样输出,也在
<h:outputText>
中。 .如果我直接在页面上写它就可以了。我的理论是 JSF 没有意识到它必须将字符串作为表达式处理。有什么方法可以强制吗?
最佳答案
EL 只会在 View 中解析,而不是在模型中解析。否则这将是一个巨大的 EL 注入(inject)攻击漏洞,允许最终用户在输入字段中输入任意 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");
// ...
关于jsf - 如何在支持 bean 中获取 JSF 资源包属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433371/