将应用程序设置放在JSF中的位置

tim*_*nYE 1 java jsf properties jsf-2

我想知道在JSF中放置应用程序范围预设的首选位置是什么.我看到3个选项:

  1. web.xml中
  2. <resource-bundle>在faces-config.xml中配置的属性文件
  3. 属性文件并使用它 java.util.Properties

我更喜欢Nr.2,因为它似乎是最直接和最容易使用的.但我不确定这是否<resource-bundle>合适,因为一般来说我认为是针对本地化消息而不是针对应用程序范围的设置.

noo*_*one 5

选项#1和#2的优点是您还可以通过EL轻松访问设置.使用选项#1,你可以做到#{initParam['keyUsedForContextParam']}.使用选项#2,您可以采用资源包的正常方式#{rscBundleName['keyUsedInPropertiesFile']}.但正如你已经说过的那样:大部分时间你会将它用于本地化,所以它会有点奇怪,但它会起作用.但是对于应用程序范围的设置,我认为带有自定义的web.xml context-params可能是更合适的方式.

如果要访问托管bean中的设置,则必须通过FacesContext访问设置.对于可能看起来像的选项#1 FacesContext.getCurrentInstance().getExternalContext().getInitParameter("keyUsedForContextParam");.这不是那么好.

选项#3当然也有效,但你需要某种@ApplicationScoped实用程序bean,它将从你的自定义.properties文件中访问设置.但这实际上不是一个很大的问题.您可以通过EL访问设置,如下所示:#{settingsBean.get('keyUsedInPropertiesFile')}.这比例如更明显initParam.在您的托管bean中,您也可以SettingsBean以相同的方式注入和访问设置.最容易理解.

选项#3也有一个不那么明显的优势.您可以实时重新读取设置.faces.xml和faces-config.xml中定义的资源包只能在启动时读取.将SettingsBean可能重新阅读的.properties文件每一次,你将能够改变即时设置(让它@RequestScoped).bean替代方案通常也更强大,例如,您可以定义默认设置,当您未在属性文件中定义任何值时应用这些设置,依此类推.

我建议你选择#3选项.