1. 程式人生 > >Maven組織的web專案讀取WEB-INF下properties檔案

Maven組織的web專案讀取WEB-INF下properties檔案

開發時經常要讀取properties檔案的配置資訊,但是properties檔案所在的位置和properties訪問方式不同讀取方式也不同,現就讀取properties檔案進行總結。

1、訪問方式一般分:java專案和web專案。

2、檔案位置:與原始檔相同目錄和與源目錄不相同

  • java專案與原始檔相同目錄讀取properties檔案方法,在main函式中讀取
[javascript] view plain copy
  1. import java.io.FileInputStream;  
  2. import java.io.FileNotFoundException;  
  3. import
     java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.util.Properties;  
  6. publicclass PropertiesUtils {  
  7.     publicstaticvoid main(String[] args) {  
  8.         Properties properties = new Properties();  
  9.         try {  
  10.             InputStream in = PropertiesUtils.class.getResourceAsStream(
    "./db.properties");//或者直接寫成"db.properties"
  11.             properties.load(in);  
  12.             String url = properties.getProperty("url");  
  13.             String userName = properties.getProperty("user");  
  14.             String password = properties.getProperty("password");  
  15.             System.out.println("url="
    +url+",userName="+userName+",password="+password);  
  16.         } catch (FileNotFoundException e) {  
  17.             e.printStackTrace();  
  18.         } catch (IOException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

父級或子級目錄只要加相應的方法路徑即可。讀取properties檔案的關鍵是能夠訪問到properties檔案,讀取的方法是一樣的,主要在於訪問的方法不一樣。

這裡有兩個獲取當前執行緒類路徑根目錄的方法,分別為:

Thread.currentThread().getContextClassLoader().getResource("")和ClassLoader.getSystemResource("")

兩個方法作用一樣,通過以上方法獲取活動.classes檔案的目錄絕對位置,然後接受需要訪問的路徑即可。這兩個方法不使用在web功能webapp下的檔案方法,因為webapp下的檔案不會出現在classes路徑下。

  • maven組織的web專案中讀取properties檔案方法

以下方法是在http請求情況下訪問的,部署伺服器為tomcat

獲取部署在tomcat下的真實地址進行拼接訪問,

    • 絕對地址訪問方式:
[javascript] view plain copy
  1. public Map<String, String> getDBInfo() {  
  2.     Map<String, String> dbInfo = new HashMap<String, String>();  
  3.     try {  
  4.         String url = this.getClass().getResource("").getPath();    
  5.            String path = url.substring(0, url.indexOf("WEB-INF")) + "WEB-INF/db.properties";    
  6.            Properties config = new Properties();    
  7.            InputStream in = new FileInputStream(path);  
  8.            config.load(in);   
  9.            String dbUrl = config.getProperty("url");  
  10.            dbInfo.put("url", dbUrl);  
  11.            dbInfo.put("userName", config.getProperty("user"));  
  12.            dbInfo.put("password", config.getProperty("password"));  
  13.     } catch (Exception e) {  
  14.         e.printStackTrace();  
  15.     }  
  16.     return dbInfo;  
  17. }  
    • Servlet下的方法
[javascript] view plain copy
  1. public Map<String, String> getDBInfo() {  
  2.     Map<String, String> dbInfo = new HashMap<String, String>();  
  3.     try {  
  4.            String path = getServletContext().getRealPath("");    
  5.            Properties config = new Properties();    
  6.            InputStream in = new FileInputStream(path+"/WEB-INF/db.properties");  
  7.            config.load(in);   
  8.            String dbUrl = config.getProperty("url");  
  9.            dbInfo.put("url", dbUrl);  
  10.            dbInfo.put("userName", config.getProperty("user"));  
  11.            dbInfo.put("password", config.getProperty("password"));  
  12.     } catch (Exception e) {  
  13.         e.printStackTrace();  
  14.     }  
  15.     return dbInfo;  
  16. }  

    • Servlet下的方法,相對地址訪問方式:
[javascript] view plain copy
  1. public Map<String, String> getDBInfo() {  
  2.     Map<String, String> dbInfo = new HashMap<String, String>();  
  3.     try {  
  4.            Properties config = new Properties();    
  5.            InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/db.properties");  
  6.            config.load(in);   
  7.            String dbUrl = config.getProperty("url");  
  8.            dbInfo.put("url", dbUrl);  
  9.            dbInfo.put("userName", config.getProperty("user"));  
  10.            dbInfo.put("password", config.getProperty("password"));  
  11.     } catch (Exception e) {  
  12.         e.printStackTrace();  
  13.     }  
  14.     return dbInfo;  
  15. }  


以上兩種區別主要在於getResourceAsStream和getResource。所有的方法主要的思路在於首先得到CLASS路徑值,即當前類.class檔案所有的路徑,然後在此路徑的基礎上通過父級、子級目錄或專案的根目錄開展遍歷,java工程和web工程所在的路徑是不一樣的。掌握獲取路徑的方法後,其他事就水到渠成了。

附錄:

Java中getResourceAsStream的用法:
首先,Java中的getResourceAsStream有以下幾種: 
1. Class.getResourceAsStream(String path) : path 不以’/'開頭時預設是從此類所在的包下取資源,以’/'開頭則是從ClassPath根下獲取。其只是通過path構造一個絕對路徑,最終還是由ClassLoader獲取資源。

2. Class.getClassLoader.getResourceAsStream(String path) :預設則是從ClassPath根下獲取,path不能以’/'開頭,最終是由ClassLoader獲取資源。

3. ServletContext. getResourceAsStream(String path):預設從WebAPP根目錄下取資源,Tomcat下path是否以’/'開頭無所謂,當然這和具體的容器實現有關。

getResourceAsStream 用法大致有以下幾種:
第一: 要載入的檔案和.class檔案在同一目錄下,例如:com.demo 下有類Test.class ,同時有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("myfile.xml");

第二:在me.class目錄的子目錄下,例如:com.demo 下有類Test.class ,同時在com.demo.file 目錄下有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("file/myfile.xml");
或者如下寫法:
Test.class.getResourceAsStream("./file/myfile.xml");
第三:不在Test.class目錄下,也不在子目錄下,例如:com.demo 下有類Test.class ,同時在 com.demo.file 目錄下有資原始檔myfile.xml
那麼,應該有如下程式碼:
Test.class.getResourceAsStream("/com/demo/file/myfile.xml");


總結一下,可能只是兩種寫法
第一:前面有 “/”
“ / ”代表了工程的根目錄,例如工程名叫做myproject,“ / ”代表了myproject
Test.class.getResourceAsStream("/com/demo/file/myfile.xml");

第二:前面沒有 “/”,代表當前類的目錄(當前路徑也可以用“./”表示)
Test.class.getResourceAsStream("myfile.xml");
Test.class.getResourceAsStream("file/myfile.xml");
或者如下寫法:
Test.class.getResourceAsStream("./myfile.xml");
Test.class.getResourceAsStream("./file/myfile.xml");

http://blog.csdn.net/wpydaguan/article/details/45971649