当前位置: 首页 > 知识库问答 >
问题:

JSF 2.0中按应用程序#getResourceBundle()和ResourceBundle#getBundle()的区别

彭修筠
2023-03-14

为了从资源包中检索Strings,我试图比较这两种方法的结果,下面是代码示例:

第一个例子:

basName:资源包的完全限定名称(

FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
ResourceBundle bundle = app.getResourceBundle(context, baseName);

第二个例子:

varName:是表示

FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context .getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(varName, locale, loader);

这两个例子有什么区别?如果没有区别,获取ResourceBundle(使用Application#getMessageBundle()或ResourceBundle#getBundle())的最佳实践是什么?


共有1个答案

段干弘扬
2023-03-14

首先,您混淆了方法的varName/baseName。实际做法是:

varName:是表示

FacesContext context = FacesContext.getCurrentInstance();
Application application = context.getApplication();
ResourceBundle bundle = application.getResourceBundle(context, varName);

是资源包的完全限定名称,如

FacesContext context = FacesContext.getCurrentInstance();
Locale locale = context.getViewRoot().getLocale();
ClassLoader loader = Thread.currentThread().getContextClassLoader();
ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale, loader);

前者通过JSF应用程序获取,该应用程序在封面下还将使用UIViewRoot#getLocale()(回退到Locale#getDefault()),后者直接获取。

至于技术和最终结果,没有区别。在这两种情况下,您将得到完全相同的捆绑包(前提是区域设置正确)。然而,关于可维护性,这是完全不同的。资源包属于“配置”范畴,必须将其外部化(在faces config.xml中)。

baseName中硬编码FQN是一种糟糕的做法。如果不重新编译和重建所有代码,就无法轻松地快速更改FQN。如果它位于第三方JAR文件中,则会更加麻烦。否则,您可以使用另一个

顺便说一下,还有第三种方法:注射它。

在JSF托管bean中,提供了一个

@ManagedProperty("#{text}")
private ResourceBundle text;

或者在CDI管理的bean中:

@Inject
private PropertyResourceBundle text;

与这位制作人:

public class BundleProducer {

    @Produces
    public PropertyResourceBundle getBundle() {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getApplication().evaluateExpressionGet(context, "#{text}", PropertyResourceBundle.class);
    }

}

注意:EL评估{text}捆绑包在应用程序#getResourceBundle()的封面下使用。

 类似资料:
  • 我们试图将JSF2.0 web应用程序部署到Apache Tomcat/7.0.23中。我们得到以下错误: 下面是web.xml: 有什么可能导致这个错误的提示吗?

  • 我已经阅读了一些关于将Web应用和API应用部署到Azure的教程。然而,我仍然有点不确定为什么你会使用一个而不是另一个。 我可以创建一个新的。NET解决方案,并将其部署为Web应用程序,那么为什么我会特别需要API应用程序呢?这些都是专门为ASP优化的。NET Web API,其中Web应用程序用于交付HTML?

  • 我想知道IDE中的Jave EE项目和Java Web项目在方面的主要区别。事实上,如果选择Java web类别,您可以在IDE中基于、和JavaServer Faces创建web应用程序。 另一方面,选择项目类别为Jave EE项目,NetBeans IDE将创建3个子项目,例如:StoreApp(企业应用项目)、StoreApp-ejb(EJB项目)和StoreApp-war(Web项目)。

  • 这可能是一个很难回答的问题,但是在很多教程和示例中,我看到这些注释的使用就好像它们做了同样的事情。 但是,我使用时遇到了一些限制(尤其是依赖注入等),我找不到解释差异的源,如果有人能给出一个大致的概述,说明什么时候使用这两个,我将非常感谢。

  • 混合移动应用程序:PhoneGap和Cordova的区别: 我知道PhoneGap提供PhoneBuild服务来为您构建应用程序,它使用的是cordova的一个版本,但人们发现使用PhoneGap比cordova还有其他好处吗?

  • 当我们在Azure Active Directory中注册应用程序以使用graph api时,我看到有两种类型的应用程序Web应用程序和本机应用程序。 创建web应用程序时,请求了两个值%1。登录URL和2。应用程序ID URL。这些数值有什么用?我们需要真实世界的url还是只需要https://localhost:randomeport就够了? 关于权限,对于本机应用程序,我只能看到可用的“委托