【问题标题】:How to get a JSF resource bundle property value in backing bean?如何在支持 bean 中获取 JSF 资源包属性值?
【发布时间】:2012-03-15 01:23:20
【问题描述】:

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

我试过了:

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

它们完全按原样输出,也在<h:outputText> 中。如果我直接在页面上写它就可以了。我的理论是 JSF 没有意识到它必须将字符串作为表达式处理。有什么办法可以强制吗?

【问题讨论】:

    标签: jsf jsf-2 bundle el


    【解决方案1】:

    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 的及时和有益的回应,这已经回答了我的问题。
    【解决方案2】:

    试试这个..

    msg 引用的资源包

    USD=$
    

    xhtml代码:

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

    这应该可行..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 2012-04-01
      相关资源
      最近更新 更多