這些天我正在開發一個Web應用程序。這隻使用jsps和servlet。這是一個小應用程序。現在我已經將所有的DataSource細節放在DAO實用程序類中。我想把這些細節放在一個屬性文件中,這個文件可以放在戰爭之外,所以根據環境我們可以改變這些值,而不會影響戰爭。我怎樣才能做到這一點?如何閱讀置於戰爭外的屬性文件?
回答
使用上下文參數或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
但是,它又是屬性文件位置與戰爭有關。您應該更改war文件以更改propert文件位置。 – 2011-06-01 12:51:34
如果我是正確的,則需要更改文件中的道具,而不是文件。 – 2011-06-01 12:53:47
@Gursel Koca如果是這樣的話,即使系統參數需要更改,在運行腳本文件 – 2011-06-01 12:54:33
你應該給屬性文件位置的Java運行時屬性爲Web容器..
比如, java -DmypropertyFile.location=c:/propertyfile.properties -jar yourContainer.jar
如果你a重新使用Tomcat,您可以將任何屬性添加到上下文中,查看documentation for context.xml。所有的應用程序服務器都有自己的做法,所以你將不得不在JBoss,Glassfish等中尋找這樣做的例子。
另一個更難但可能更好的解決方案是使用JNDI resources。
我通常採用的方法是讓程序假定配置文件位於%user.home%/.program/config.properties
之下。
如果找不到文件(通常在第一次運行時),則從「默認」配置文件的類路徑創建副本並將其放置在那裏。
爲了靈活起見,通常使用-Dconfig = somepath來覆蓋。
根據您的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){}
}
}
這是怎麼做到這一點:
添加以下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");
}
}
希望這可以幫助你或其他人。
這個答案幫了我這麼多。不要忘記關閉你的輸入流,每個人。 – 2016-11-01 15:37:18
- 1. 特定於戰爭的配置文件
- 2. 使用ServletContext讀取來自外部戰爭的Hibernate屬性
- 3. 閱讀屬性文件
- 4. 閱讀JAR文件之外的屬性文件
- 5. 從外部戰爭中讀取context.xml
- 6. 如何使戰爭依賴於另一場戰爭?
- 7. 如何「戰爭」
- 8. 的jarsigner戰爭文件
- 9. ANT戰爭任務 - 如何戰爭只有新的/修改的文件
- 10. 閱讀屬性文件中的接口
- 11. 如何改變在戰爭文件的index.jsp的位置
- 12. 如何反編譯基於jijster的戰爭文件
- 13. maven如何才能從戰爭文件中導入的項目構建戰爭?
- 14. 戰爭文件部署
- 15. 從戰爭文件導入
- 16. 創建戰爭文件
- 17. 閱讀屬性文件失敗
- 18. 閱讀位於服務器上的屬性文件從Javascript
- 19. 如何讓Maven運行戰爭:爆炸但不是戰爭:戰爭
- 20. 閱讀休眠配置文件中的屬性
- 21. 問題與閱讀的Maven配置文件屬性
- 22. 如何閱讀C#中的自定義文件屬性
- 23. jar文件如何讀取外部屬性文件
- 24. 如何閱讀Visio中Shape的屬性
- 25. 如何閱讀BIRT報告的屬性?
- 26. 如何配置戰爭以取決於戰爭中的導出庫而不是來自服務器的庫?
- 27. Django的Jython的戰爭文件部署
- 28. 戰爭
- 29. 從戰爭容器中加載外部的.xhtml文件(Facelets)
- 30. 基於多個XML閱讀屬性
我必須修改屬性文件中的屬性。要將屬性文件放置在相對於WAR的路徑中。我無法訪問dev和prod框。另外我不想讀Servlet級別的屬性文件,我想在負責提供數據源的實用程序類中讀取它。 ServletContext和全部僅在servlet級別可用。 – user779354 2011-06-01 13:18:41
更新了我的回答以解決您的評論。 – RHSeeger 2011-06-01 13:38:46