2011-06-01 67 views
5

這些天我正在開發一個Web應用程序。這隻使用jsps和servlet。這是一個小應用程序。現在我已經將所有的DataSource細節放在DAO實用程序類中。我想把這些細節放在一個屬性文件中,這個文件可以放在戰爭之外,所以根據環境我們可以改變這些值,而不會影響戰爭。我怎樣才能做到這一點?如何閱讀置於戰爭外的屬性文件?

+0

我必須修改屬性文件中的屬性。要將屬性文件放置在相對於WAR的路徑中。我無法訪問dev和prod框。另外我不想讀Servlet級別的屬性文件,我想在負責提供數據源的實用程序類中讀取它。 ServletContext和全部僅在servlet級別可用。 – user779354 2011-06-01 13:18:41

+0

更新了我的回答以解決您的評論。 – RHSeeger 2011-06-01 13:38:46

回答

4

使用上下文參數或java系統參數提供文件名。

1.Context帕拉姆

<context-param> 
<param-name>daofilename</param-name> 
<param-value>D:\daofilename.props</param-value> 
</context-param> 

2.系統參數

java -Ddao.filename=D:\daofilename.props server 
+0

但是,它又是屬性文件位置與戰爭有關。您應該更改war文件以更改propert文件位置。 – 2011-06-01 12:51:34

+0

如果我是正確的,則需要更改文件中的道具,而不是文件。 – 2011-06-01 12:53:47

+0

@Gursel Koca如果是這樣的話,即使系統參數需要更改,在運行腳本文件 – 2011-06-01 12:54:33

0

你應該給屬性文件位置的Java運行時屬性爲Web容器..

比如, java -DmypropertyFile.location=c:/propertyfile.properties -jar yourContainer.jar

0

如果你a重新使用Tomcat,您可以將任何屬性添加到上下文中,查看documentation for context.xml。所有的應用程序服務器都有自己的做法,所以你將不得不在JBoss,Glassfish等中尋找這樣做的例子。

另一個更難但可能更好的解決方案是使用JNDI resources

0

我通常採用的方法是讓程序假定配置文件位於%user.home%/.program/config.properties之下。

如果找不到文件(通常在第一次運行時),則從「默認」配置文件的類路徑創建副本並將其放置在那裏。

爲了靈活起見,通常使用-Dconfig = somepath來覆蓋。

2

根據您的Web服務器,您可以將屬性文件放置在類路徑中包含的某個位置。例如,對於一些tomcat版本,這將是${TOMCAT_BASE}/shared/classes。然後,webapp可以使用類似下面的內容來讀取文件,並在該位置自動找到它。

ServletContext context = getServletContext(); 
InputStream is = context.getResourceAsStream("yourfilename.cnf"); 

您也可以命名您的web應用程序的安裝名稱後的文件,並從類路徑加載文件時在代碼中使用該名稱。這樣,您可以在共享目錄中擁有多個webapps的屬性文件,而不會相互衝突。

您已經表示您無權訪問ServletContext,因爲您希望代碼位於實用程序類中。解決這個限制的一個方法是註冊一個ServletContextListener,它創建屬性文件讀取器的一個實例(因爲它可以訪問上下文)並註冊它,以便其他代碼可以使用它。像下面這樣:

public class MyServletContextListener extends ServletContextListener{ 
    public void contextInitialized(ServletContextEvent event){ 
     ServletContext context = event.getServletContext(); 
     context.setAttribute("settings", new MyPropertyReader(context)); 
    } 

    public void contextDestroyed(ServletContextEvent event){} 
    } 

} 
4

這是怎麼做到這一點:

添加以下context.xml文件(conf文件夾,在Tomcat的安裝目錄)。你可以改變名稱屬性;並在值中設置你有你的屬性文件的文件夾的路徑。

<Environment name="config" value="C:\Program files\my app\" 
     type="java.lang.String" override="false"/> 

然後在您的Util類,你可以得到這樣的文件:(中的「java:comp/env的/配置」替換「配置」的「名稱」屬性的值,你在上下文中使用。 xml)

String folderName = null; 
Properties properties = new Properties(); 
try { 
    InitialContext context = new InitialContext(); 
    folderName = (String) context.lookup("java:comp/env/config"); 
} catch (NamingException ex) { 
    System.out.println("exception in jndi lookup"); 
} 
if(folderName != null) { 
    File configFile = new File(folderName + "yourfile.properties"); 
    try { 
     InputStream is = new FileInputStream(configFile); 
     properties.load(is); 
    } catch(IOException ex) { 
     System.out.println("exception loading properties file"); 
    } 
} 

希望這可以幫助你或其他人。

+0

這個答案幫了我這麼多。不要忘記關閉你的輸入流,每個人。 – 2016-11-01 15:37:18