有两种方法可以将属性文件加载到JSF 2.0中。
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对象?或者它只是所有页面实例共享的对象?
答案 0 :(得分:3)
在这两个中哪一个给了我更好的表现?
我不担心性能。 ResourceBundle
已在内部缓存它们。
假设我有一个页面abc.xhtml,我使用f:loadBundle,有1000个用户访问此页面,这是否意味着会创建1000个resouceBundle对象?或者它只是所有页面实例共享的对象?
默认情况下,只创建一个。另请参阅the ResourceBundle
API documentation:
缓存管理
默认情况下,getBundle工厂方法创建的资源包实例会被缓存,如果已缓存,则工厂方法会多次返回相同的资源包实例。 getBundle客户端可以清除缓存,使用生存时间值管理缓存资源包实例的生命周期,或指定不缓存资源包实例。有关详细信息,请参阅
getBundle
factory method,clearCache
,ResourceBundle.Control.getTimeToLive
和ResourceBundle.Control.needsReload
的说明。
通过查看实例的哈希码,您可以轻松地在调试器中证明自己。
<application>
声明的另一个好处是,@ManagedProperty("#{msg}")
可以在托管bean中注入捆绑包。另见Q&amp; A:Read resource bundle properties in a managed bean。
答案 1 :(得分:0)
您从答案中看到一个全局资源包就足够了。 关于效果:
您有两种标准的ResourceBundle实例:
对于ListResourceBundle:
每个locale java类都创建一个包含共享(!)键和本地化文本的字符串数组。 在JVM中共享密钥字符串很不错。 此外,所有字符串都会尽早加载。
因此可能值得提供一个ListResourceBundle。
然而,对于翻译,您可能需要维护一些非java翻译记忆库,tmx,xliff等。并在构建过程中生成java。
答案 2 :(得分:-1)
第一个选项 - 因为它是应用程序作用域并在启动时加载