我想知道在 JSF 中放置应用程序范围的预设的首选位置是什么。我看到 3 个选项:
- web.xml
<resource-bundle>
带有faces-config.xml中配置的属性文件- 属性文件并使用它
java.util.Properties
我更喜欢Nr。2,因为它似乎是最直接最容易使用的。但我不确定这是否好,因为总的来说,我认为<resource-bundle>
是针对本地化消息而不是针对应用程序范围的设置。
我想知道在 JSF 中放置应用程序范围的预设的首选位置是什么。我看到 3 个选项:
<resource-bundle>
带有faces-config.xml中配置的属性文件java.util.Properties
我更喜欢Nr。2,因为它似乎是最直接最容易使用的。但我不确定这是否好,因为总的来说,我认为<resource-bundle>
是针对本地化消息而不是针对应用程序范围的设置。
选项 #1 和 #2 的优点是您还可以通过 EL 轻松访问设置。使用选项#1,您可以执行#{initParam['keyUsedForContextParam']}
. 使用选项#2,您可以使用资源包的正常方式#{rscBundleName['keyUsedInPropertiesFile']}
。但正如您已经说过的:大多数时候您将使用它进行本地化,所以这会有点奇怪,但它会起作用。但是对于应用程序范围的设置,我认为带有自定义的 web.xmlcontext-params
可能是更合适的方式。
如果要访问托管 bean 中的设置,则必须通过 FacesContext 访问设置。对于可能看起来像的选项#1 FacesContext.getCurrentInstance().getExternalContext().getInitParameter("keyUsedForContextParam");
。这不是很好。
选项#3 当然也可以,但是您需要某种@ApplicationScoped
实用程序 bean,它将从您的自定义文件中访问设置.properties
。但这实际上不是一个很大的问题。您可以像这样通过 EL 访问设置#{settingsBean.get('keyUsedInPropertiesFile')}
:这比例子更明显initParam
。在您的托管 bean 中,您也可以SettingsBean
以相同的方式注入并访问设置。最容易理解。
选项#3 也有一个不那么明显的优势。您可以实时重新读取设置。在 faces-config.xml 中定义的 web.xml 和资源包只会在启动时被读取。每次都可能重新读取 .properties 文件,您将SettingsBean
能够即时更改设置(make it @RequestScoped
)。bean 替代方案通常也更强大,例如,您可以定义默认设置,当您未在属性文件中定义任何值时应用这些设置等等。
我建议您使用选项#3。
web.xml
我想你的意思是<context-param>
?这通常用于基于 servlet/filter 的 3rd 方库(JSF API/impl、PrimeFaces、OmniFaces、Jersey 等)的配置参数。
<resource-bundle>
带有配置的属性文件faces-config.xml
这通常用于 JSF 页面的本地化,即能够在站点范围内切换到完全不同的语言。
properties 文件并根据 java.util.Properties 使用它
这通常用于名称=值对,它可以表示本地化文本和配置设置等任何内容。
你看,这里没有真正的“我应该使用哪个”案例。“我什么时候应该使用它”这个问题更合适。最终的答案是,只需为工作使用正确的工具。