JSF国际化f:loadbundle或通过faces-config:性能点

时间:2013-01-16 13:25:51

标签: java jsf java-ee internationalization resourcebundle

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

  1. 全球资源包 要全局加载属性文件,以便所有jsf页面都可以访问消息。您可以创建“faces-config.xml”文件并明确声明属性文件。
  2. faces-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 />标记。

    在这两个中哪一个给了我更好的表现?

    让我说我选择第一个选项,是否意味着在应用程序启动期间所有的bundle都被加载了,还是延迟加载? (按要求)

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

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

    我的意思是getBundle方法是工厂方法,它总是创建单例对象?

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

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

3 个答案:

答案 0 :(得分:3)

  

在这两个中哪一个给了我更好的表现?

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


  

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

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

  

缓存管理

     

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

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


<application>声明的另一个好处是,@ManagedProperty("#{msg}")可以在托管bean中注入捆绑包。另见Q&amp; A:Read resource bundle properties in a managed bean

答案 1 :(得分:0)

您从答案中看到一个全局资源包就足够了。 关于效果:

您有两种标准的Res​​ourceBundle实例:

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

对于ListResourceBundle:

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

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

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

答案 2 :(得分:-1)

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