Tar*_*rik 3 jsf resourcebundle facescontext jsf-2
为了从资源包中检索字符串,我试图比较这两种方法的结果,下面是代码示例:
第一个例子:
baseName:资源包的完全限定名称(<base-name>in <resource-bundle>).
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, baseName);
Run Code Online (Sandbox Code Playgroud)
第二个例子:
varName:是表示<var></var>in 的String<resource-bundle>
FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context .getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(varName, locale, loader);
Run Code Online (Sandbox Code Playgroud)
这两个例子有什么区别?如果没有区别,获得ResourceBundle(使用Application#getMessageBundle()或ResourceBundle#getBundle())的最佳做法是什么?
首先,您混合了方法的varName/baseName.实际的方法是:
Application#getResourceBundle()
varName:是表示<resource-bundle><var>in 的Stringfaces-config.xmlRun Code Online (Sandbox Code Playgroud)FacesContext context = FacesContext.getCurrentInstance(); Application application = context.getApplication(); ResourceBundle bundle = application.getResourceBundle(context, varName);
ResourceBundle#getBundle()
baseName:是资源包的完全限定名称,例如<resource-bundle><base-name>Run Code Online (Sandbox Code Playgroud)FacesContext context = FacesContext.getCurrentInstance(); Locale locale = context.getViewRoot().getLocale(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);
前者通过JSF获得它Application,后者也会使用UIViewRoot#getLocale()(后退Locale#getDefault()),而后者直接获得它.
至于技术和最终结果,没有区别.在这两种情况下,您将获得完全相同的捆绑(假设区域设置正确).但是,就可维护性而言,它肯定是不同的.资源包属于"配置",必须外部化(in faces-config.xml).
对FQN进行硬编码baseName是一种不好的做法.如果不重新编译并重新构建所有代码,则无法轻松快速更改FQN.如果它是在第三方JAR文件中,那将更加麻烦.你本来只是另一个覆盖它<resource-bundle>在相同的<var>从你的web应用中.此外,JSF组件/实用程序库可能提供一个自己的Application包装器,它可能会装饰getResourceBundle()调用以便做一些非常棒的事情.如果你直接通过它获得它,这是不可能的ResourceBundle#getBundle().
顺便提一下第三种方法:注入它.
在JSF托管bean中,提供了<var>text</var>:
@ManagedProperty("#{text}")
private ResourceBundle text;
Run Code Online (Sandbox Code Playgroud)
或者在CDI托管bean中:
@Inject
private PropertyResourceBundle text;
Run Code Online (Sandbox Code Playgroud)
有这个生产者:
public class BundleProducer {
@Produces
public PropertyResourceBundle getBundle() {
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:EL评估#{text}捆绑使用Application#getResourceBundle().