【问题标题】:Can we store messages.properties under WEB-INF in a JSF application?我们可以将messages.properties 存储在JSF 应用程序的WEB-INF 下吗?
【发布时间】:2013-12-17 05:37:18
【问题描述】:
我已经尝试过这种映射,但 JSF 就是找不到它。
<application>
<resource-bundle>
<base-name>/WEB-INF/i18/messages</base-name>
<var>msg</var>
</resource-bundle>
</application>
我看到的所有示例都将 messages.properties 放在 Java Source 文件夹中。有些使用包名,有些则不使用——这仍然很像使用空白包名。 JSF 是否强制我们将资源包存储在 Java Source 下?
【问题讨论】:
标签:
jsf
resourcebundle
faces-config
【解决方案1】:
这不是 JSF 特有的。这是特定于ResourceBundle API 的。捆绑包是通过调用者的类加载器以完全限定的基本名称加载的规范。来自javadoc(强调我的):
getBundle
public static final ResourceBundle getBundle(String baseName)
使用指定的基本名称、默认语言环境、和调用者的类加载器获取资源包。 [...]
参数:
baseName - 资源包的基本名称,完全限定的类名
[...]
在幕后,它使用ClassLoader#getResourceAsStream() 来获取类路径资源的InputStream。
/WEB-INF 文件夹不是类路径的一部分。它是网络内容的一部分。 Web 内容资源只能通过ServletContext#getResourceAsStream() 以编程方式获得,并且在JSF 中固有地通过ExternalContext#getResourceAsStream() 获得。您当然可以自制一个自定义 ResourceBundle.Control,它将资源作为 Web 内容资源加载,但实际上不建议在没有任何有效技术原因的情况下以不同于标准的方式做事。
只需按照通常的方式将这些资源放在类路径中即可。将它们放在网络内容中是没有意义的。