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

时间:2013-09-01 15:45:39

标签: java jsf jsf-2 properties

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

  1. 的web.xml
  2. faces-config.xml
  3. 中配置为<resource-bundle>的属性文件
  4. 属性文件,并按java.util.Properties
  5. 使用

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

我建议你选择#3选项。

答案 1 :(得分:4)

  

的web.xml

我认为你的意思是<context-param>?这通常用于基于servlet / filter的第三方库(JSF API / impl,PrimeFaces,OmniFaces,Jersey等)的配置参数。


  

<resource-bundle>

中配置faces-config.xml的属性文件

这通常用于JSF页面的本地化,即能够在站点范围内切换到完全不同的语言。


  

属性文件,并根据java.util.Properties

使用它

这通常用于名称=值对,它可以表示本地化文本和配置设置等任何内容。


你知道,这里并没有真正的“我应该使用哪种”案例。 “我应该何时使用它”的问题更合适。答案是最终的,只需使用合适的工具即可。