1

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

数据类型.属性:

A=first
B=second
C=third

面孔-config.xml:

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

我的页面.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}而不必在代码中拉出键并将它们存储在列表中。

谢谢。

4

1 回答 1

3

两者都是加载属性的不同方式,不同之处在于它们的访问范围<f:loadBundle><resource-bundle>顺便说一下,后者还有一个额外的好处,即捆绑包也可以通过以下方式注入到托管 bean@ManagedProperty("#{myProp}")

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

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

加载为当前视图的Locale 本地化的资源包,并将其作为java.util.Map暴露在当前请求的请求属性中,该关键字由该标记的“var”属性的值指定。

现在,由于您尝试使用 datatypes.properties 到 的值<f:selectItems>,您将得到上述异常。这是因为标签的value属性应该评估为 Collection 或 array

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

因此,为了使用全局捆绑实例,您首先必须List<SelectItem>在使用它之前将其转换为支持 bean 内部。

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

于 2013-06-20T09:27:54.640 回答