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

标签 jsf jsf-2 bundle el

我正在使用 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/

相关文章:

jsf - 如何在 JSF 中禁用 jftfdi jffi 查询参数

performance - 我如何衡量一个 Seam 应用程序的性能?

jsf - actionListener commandLink 不适用于惰性 dataScroller

jsf - 如果 EJB 暴露了 @Remote 接口(interface),但您注入(inject)的是 EJB bean 而不是其 Remote 接口(interface),这会触发远程调用还是本地调用?

jsf - 从 Servlet 访问 ViewScoped ManagedBean

java - 使用 JSF PrimeFaces 时,java.lang.String 类型的属性不可读

javascript - JSF:强制页面重新加载时,从托管 Bean 调用 javascript 代码不起作用

javascript - 如何将 javascript 与 typescript 编译成一个包?

ruby-on-rails - bundle 安装错误 "invalid byte sequence in US-ASCII (ArgumentError)"

iphone - 如何访问应用程序版本?