【问题标题】:Why can JSF resource bundle var be used differently with f:loadBundle and faces-config为什么 JSF 资源包 var 可以与 f:loadBundle 和 faces-config 不同地使用
【发布时间】:2013-06-16 13:17:51
【问题描述】:

我有一个属性文件以两种方式链接(使用 f:loadBundle 和 faces-config.xml),两者都具有不同的 var 名称。所以它看起来像下面这样:

datatypes.properties:

A=first
B=second
C=third

faces-config.xml:

<resource-bundle>
    <base-name>datatypes</base-name>
    <var>myProp</var>
</resource-bundle>

myPage.xhtml:

<f:loadBundle basename="datatypes" var="prop"/>

在 myPage.xhtml 中,我列出了属性文件中的所有键。我似乎无法理解的是,当我在下面的代码中使用#{prop} 时,它可以工作,但是当我用#{myProp} 替换它时,列表不再显示。

<h:form>
 <h:selectManyListbox id="list">
 <f:selectItems value="#{myProp}"></f:selectItems>
 </h:selectManyListbox>
</h:form>

我认为这意味着这两种情况下的变量在幕后并不相同,但如果有人能解释(或指出我的解释)它们有何不同,我将不胜感激。理想情况下,我希望只使用#{myProp},而不必在代码中提取密钥并将它们存储在列表中。

谢谢。

【问题讨论】:

    标签: jsf-2 resourcebundle


    【解决方案1】:

    &lt;f:loadBundle&gt;&lt;resource-bundle&gt; 都是加载属性的不同方式,不同之处在于它们的访问范围。顺便说一句,后者还有一个额外的好处,即捆绑包也是injectable in a managed bean by @ManagedProperty("#{myProp}")

    在 faces-config.xml 中使用 &lt;resource-bundle&gt; 创建一个 global 资源包,可以在应用程序的任何位置访问它。这是通过java.util.ResourceBundle 实例实现的。

    在您的视图中使用&lt;f:loadBundle&gt; 会创建一个特定于视图的 资源包,该资源包只能在该视图中访问。标签处理程序使用 Map 的内部实现来实现这一点。这是在VDL of the tag 中指定的:

    加载为当前视图的区域设置本地化的资源包, 并将其公开为 java.util.Map 在请求属性中 由“var”的值指定的键下的当前请求 这个标签的属性。

    现在,由于您尝试使用从 datatypes.properties 到 &lt;f:selectItems&gt; 的值,您将得到上述异常。这是因为标签 should evaluate to a Collection or an arrayvalue 属性。

    指向任何集合数组的值表达式。会员 元素可以是 SelectItem 或任何 Java 对象的实例。

    因此,为了使用全局捆绑实例,您首先必须在使用它之前将其转换为支持 bean 中的 List&lt;SelectItem&gt;

    注意:您可以通过在com.sun.faces.renderkit.SelectItemsIterator 类的initializeItems(Object) 方法中设置断点来验证上述情况。当然,这是假设您使用的是 Mojarra 实现。

    【讨论】:

    • 我看不出有什么偏好,因为我为 gobal 资源包 (myProp) 和特定于视图的资源包 (prop) 使用了不同的变量名。我刚刚删除了特定于视图的资源包声明,#{myProp} 仍然不起作用。我得到一个 IllegalArgumentException。
    • 糟糕,我没有注意到您将它用于 selectManyListBox。更新了我的答案。
    • 感谢您的回复和更新Vrushank。我认为全局与特定视图资源包的不同实现最初让我失望,但在阅读您的回复后,我现在很清楚。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 2017-09-18
    • 2012-04-28
    • 1970-01-01
    • 2014-01-07
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多