有两种方法可以将属性文件加载到 JSF 2.0 中。
- 全球资源包
全局加载属性文件,以便所有jsf页面都可以访问消息。您可以创建一个“faces-config.xml”文件并显式声明属性文件。
面孔配置.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:本地资源包
本地加载属性文件,或仅加载指定页面的属性文件。声明<f:loadBundle />
页面中需要访问messages.properties中消息的标签。
这两者中哪一个能给我更好的性能?
假设我选择第一个选项,这是否意味着所有捆绑包都会在应用程序启动期间加载,还是延迟加载? (一经请求)
如果选择第二个选项,是否可能导致每个 ViewRoot 多次加载包?
Java ResourceBundle 是在 servlet 容器内提供单例对象的工厂类吗?
我的意思是 getBundle 方法是始终创建单例对象的工厂方法?
ResourceBundle myResources =
ResourceBundle.getBundle("MyResources", currentLocale);
假设我有一个页面 abc.xhtml 并且正在使用 f:loadBundle,并且有 1000 个用户访问该页面,这是否意味着会创建 1000 个 resouceBundle 对象?或者它是所有页面实例共享的唯一对象?
这两者中哪一个能给我更好的性能?
我不会担心表演。这ResourceBundle
已经在内部缓存它们。
假设我有一个页面 abc.xhtml 并且正在使用 f:loadBundle,并且有 1000 个用户访问该页面,这是否意味着会创建 1000 个 resouceBundle 对象?或者它是所有页面实例共享的唯一对象?
默认情况下,只创建一个。也可以看看the ResourceBundleAPI文档 http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html:
缓存管理
getBundle 工厂方法创建的资源包实例默认会被缓存,如果已缓存,工厂方法会多次返回同一个资源包实例。 getBundle 客户端可以清除缓存,使用生存时间值管理缓存的资源包实例的生命周期,或者指定不缓存资源包实例。请参阅 的说明getBundle工厂方法 http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#getBundle%28java.lang.String,%20java.util.Locale,%20java.lang.ClassLoader,%20java.util.ResourceBundle.Control%29, clearCache http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html#clearCache%28java.lang.ClassLoader%29, ResourceBundle.Control.getTimeToLive http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.Control.html#getTimeToLive%28java.lang.String,%20java.util.Locale%29, and ResourceBundle.Control.needsReload http://docs.oracle.com/javase/6/docs/api/java/util/ResourceBundle.Control.html#needsReload%28java.lang.String,%20java.util.Locale,%20java.lang.String,%20java.lang.ClassLoader,%20java.util.ResourceBundle,%20long%29了解详情。
您可以通过查看实例的哈希码轻松证明自己是否处于调试器中。
The <application>
顺便说一下,声明还有一个额外的好处,即该包也可以通过以下方式注入到托管 bean 中:@ManagedProperty("#{msg}")
。另请参阅此问答:读取托管 bean 中的资源包属性 https://stackoverflow.com/questions/13655540/read-i18n-variables-from-properties-file-in-a-bean.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)