2

我在WEB-INF目录下有一个重复的配置文件,名为configDEV.propertiesconfigPRO.properties(一个用于开发环境,另一个用于生产环境)。

由于这些 Spring 声明和这个 Tomcat 启动参数,我加载了正确的文件:

<context:property-placeholder 
        location="WEB-INF/config${project.environment}.properties" />

-Dproject.environment=PRO
(or –Dproject.environment=DEV)

然后,在一个servlet 侦听器(称为 StartListener)中,我执行以下操作,以允许JSF在托管 bean 和 jsp 视图中访问这些属性。(具体来说,我们将使用一个名为cfg.skin.richSelector的属性)。

public class StartListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        //Environment properties
        Map<String, String> vblesEntorno = System.getenv();

        //Project properties
        String entorno = vblesEntorno.get("project.environment");
        String ficheroPropiedades = "/WEB-INF/config" + entorno + ".properties";
        try {
            Properties props = new Properties();
            props.load(sc.getResourceAsStream(ficheroPropiedades));

            setSkinRichSelector(sc, props.getProperty("cfg.skin.richSelector"));
        } catch (Exception e) {
            //...
        }
    }

    private void setSkinRichSelector(ServletContext sc, String skinRichSelector) {
        sc.setInitParameter("cfg.skin.richSelector", skinRichSelector); 
    }

    public void contextDestroyed(ServletContextEvent sce) {}

}

在 JSF 托管 bean 中:

public class ThemeSwitcher implements Serializable {

    private boolean richSelector;

    public ThemeSwitcher() {

        richSelector = Boolean.parseBoolean(
            FacesContext.getCurrentInstance().getExternalContext().getInitParameter("cfg.skin.richSelector"));

        if (richSelector) {
            //do A
        } else {
            //do B
        }

    }

    //getters & setters

}

在 xhtml 页面中:

<c:choose>
    <c:when test="#{themeSwitcher.richSelector}">
        <ui:include src="/app/comun/includes/themeSwitcherRich.xhtml"/>
    </c:when>
    <c:otherwise>
        <ui:include src="/app/comun/includes/themeSwitcher.xhtml"/>
    </c:otherwise>
</c:choose>

所有这些都可以,但我想问专家这是否是最合适的方法,或者是否可以以某种方式简化???

提前感谢您的提示和建议

4

2 回答 2

1

这取决于您使用的 Spring 版本。如果它恰好是最新的 Spring 3.1,您可以利用@Profile

Springsource 博客

Springsource 参考

于 2012-06-15T09:21:53.923 回答
1

如果您在 spring bean 中使用它,请将属性占位符保留在 applicationContext.xml 中。

在 web.xml 中配置上下文初始化参数,如下所示:

   <context-param>
      <param-name>envProp</param-name>
      <param-value>${project.environment}</param-value>
   </context-param>

还要在类路径中的某个包下移动属性文件(注意:由于此更改,您需要使用类路径*:前缀在应用程序上下文中定位资源)

然后你可以像这样在你的 JSF 页面中加载包:

<f:loadBundle basename="com.examples.config#{initParam['envProp']}" var="msgs"/>

并使用这样的东西:

<h:outputText value="#{msgs.cfg.skin.richSelector}" />

但是,不要像 Ryan Lubke 在他的博客中提到的那样通过 JNDI 配置 ProjectStage 来设置系统属性,这样即使对于 javax.faces.PROJECT_STAGE 上下文参数,您也可以使用相同的属性。

于 2012-06-17T22:49:07.903 回答