2012-06-15 47 views
1

我下WEB-INF目錄複製的配置文件,名爲configDEV.propertiesconfigPRO.properties(一個用於開發環境,另一個爲生產環境)。合適的方式來傳遞由彈簧加載到JSF全球配置屬性

我加載正確的文件,由於這些春天的聲明,這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> 

所有這一切工作確定,但我想請問專家是否是最適當的方式來做到這一點,或者如果這可以通過某種方式簡化?

在此先感謝您的提示和建議

+0

您使用的是哪個版本的Spring和JSF? – Ravi

+0

Spring 3.1.1&JSF 2.0(Mojarra 2.0.6?) – webmeiker

回答

1

這取決於您使用的是哪個版本的Spring。如果它正好是最新春季3.1,你可以採取的@Profile優勢:

Springsource Blog

Springsource reference

+0

發佈這個問題後,一些優先任務成爲。所以,現在我們沒有時間去嘗試你的建議。可能下個星期吧。不管怎樣,謝謝你。 – webmeiker

+0

儘管我還沒有嘗試,但它應該是正確的答案,所以我給你的綠色標記 – webmeiker

1

離開酒店,佔位符在你的applicationContext.xml,如果你在你的Spring beans使用它。

配置上下文初始參數在你的web.xml是這樣的:

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

也動下,一些包的屬性文件在類路徑中(注:由於這種變化,你需要找到的資源使用應用程序上下文的classpath *:前綴)

,然後你可以加載像這樣在JSF頁面中捆綁:

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

和使用這樣的:

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

但不是作爲由Ryan Lubke在他blog提到的,這樣就可以使用相同的屬性甚至javax.faces.PROJECT_STAGE上下文參數通過JNDI設置系統屬性這樣的配置ProjectStage。

+0

感謝您的建議,但前兩段對我們來說是不可協商的:「我有一個重複的配置文件在WEB-INF目錄下,調用configDEV.properties和configPRO.properties(一個用於開發環境,另一個用於生產環境)。 由於這些Spring聲明和這個Tomcat啓動參數「 – webmeiker

+0

」,我加載了正確的文件,然後只是複製這些文件將是最好的方式來做到這一點,並像上面一樣使用。 – Ravi