5

有两种方法可以将属性文件加载到 JSF 2.0 中。

  1. 全局资源包 全局加载属性文件,以便所有 jsf 页面都可以访问消息。您可以创建一个“faces-config.xml”文件并明确声明属性文件。

面孔-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">
     <application>
      <resource-bundle>
        <base-name>com.mkyong.messages</base-name>
        <var>msg</var>
       </resource-bundle>
     </application>
</faces-config>

选项 2:本地资源包 本地加载属性文件,或仅用于指定页面。在messages.properties中声明<f:loadBundle />页面中需要访问消息的标签。

在这两个中,哪一个给我更好的性能?

假设我选择第一个选项,这是否意味着在应用程序启动期间加载了所有捆绑包,还是延迟加载?(一经请求)

如果选择第二个选项,是否可能导致每个 ViewRoot 多次加载捆绑包?

Java ResourceBundle 是在 servlet 容器中提供单例对象的工厂类吗?

我的意思是 getBundle 方法是始终创建单例对象的工厂方法?

ResourceBundle myResources =
      ResourceBundle.getBundle("MyResources", currentLocale);

假设我有一个页面 abc.xhtml 并且我正在使用 f:loadBundle,并且有 1000 个用户访问此页面,这是否意味着将创建 1000 个 resouceBundle 对象?还是只有所有页面实例共享的对象?

4

3 回答 3

3

在这两个中,哪一个给我更好的性能?

我不会担心性能。已经在ResourceBundle内部缓存它们。


假设我有一个页面 abc.xhtml 并且我正在使用 f:loadBundle,并且有 1000 个用户访问此页面,这是否意味着将创建 1000 个 resouceBundle 对象?还是只有所有页面实例共享的对象?

默认情况下,只创建一个。另请ResourceBundle参阅API 文档

缓存管理

getBundle 工厂方法创建的资源包实例默认会被缓存,如果已经缓存,工厂方法会多次返回同一个资源包实例。getBundle 客户端可以清除缓存,使用生存时间值管理缓存的资源包实例的生命周期,或者指定不缓存资源包实例。有关详细信息,请参阅getBundle工厂方法clearCacheResourceBundle.Control.getTimeToLiveResourceBundle.Control.needsReload的说明。

您可以通过查看实例的哈希码轻松证明自己是否在调试器中。


顺便说一句,该<application>声明还有一个额外的好处,即捆绑包也可以通过@ManagedProperty("#{msg}"). 另请参阅此问答:读取托管 bean 中的资源包属性

于 2013-01-16T13:48:59.257 回答
0

您已经从答案中看到,一个全局资源包就足够了。关于性能:

您有两种标准 ResourceBundle 实例:

  • PropertyResourceBundle - *[_LOCALE].properties 文件,以及
  • ListResourceBundle,一个java类(使用带有'.'的包名) - *[_LOCALE].class。

对于 ListResourceBundle:

每个 locale java 类都会创建一个带有共享 (!) 键和本地化文本的字符串数组。在 JVM 中共享密钥字符串很好。此外,所有字符串都提前加载。

因此,提供一个 ListResourceBundle 可能是值得的。

然而,对于翻译,您可能必须维护一些非 Java 翻译记忆库、tmx、xliff 等。并在构建过程中生成 java.lang.

于 2013-01-16T14:23:42.480 回答
-1

第一个选项 - 因为它是应用程序范围并在启动时加载

于 2013-01-16T13:28:11.423 回答