Java中動態獲取項目根目錄的絕對路徑


 序言

  在開發過程中經常會用到讀寫文件,其中就必然涉及路徑問題。使用固定的絕對路徑當然很方便,但會導致程序的可移植性差,比如在代碼中寫死了要在E盤建一個文件,而移植后的環境中木有E盤,那就只能改代碼;又或者需要調用D盤某某某很長路徑下的一個自定義文件,這個文件路徑又不在項目文件夾下,則拷項目代碼時很容易遺漏這個自定義文件,這樣給項目的交接帶來了不必要的麻煩。如果我們將自定義配置文件或者其他待訪問的文件都放在項目根目錄下的某個文件夾中,在運行時動態獲取項目根目錄,則能大大提升項目的可移植性。注意,Tomcat下的Web程序的項目根目錄是在Tomcat根目錄的webapps\項目名 下,而Java桌面程序的項目根目錄是在源代碼所在的文件夾下。

  這個想法從我最開始做涉及文件存取的項目時就想到了,但是實踐中經常失敗,因為不同情況下(Tomcat下的Web程序、Java桌面程序)獲取項目根目錄的方法是不一樣的,同樣的(new File("")).getAbsolutePath()方法在Web環境下或桌面程序環境下的結果不一樣,不一一分析和測試的話就會繞暈。於是最近我專門花了點時間研究了下,發現其實也不復雜。我的測試環境為:MyEclipse1.6.0;Tomcat6.0.1,其根目錄為"D:\Program Files\Java\tomcat6.0.1";項目源文件所在根目錄為"D:\CHLOE\IT\java\eclipse_workspace\tests"。

 正文

1. 在jsp文件或Servlet中,可以通過getServletContext().getRealPath("/")來獲取項目根目錄的絕對路徑。

  testServletPath.jsp

1 <body>
2     <h1>jsp文件中獲得項目根目錄絕對路徑</h1>
3     <%
4     String realPath=getServletContext().getRealPath("/");//項目絕對路徑
5      %>
6      項目根目錄的絕對路徑為:<%=realPath %>
7 </body>
8 </html>

  訪問結果:

jsp文件中獲得項目根目錄絕對路徑

項目根目錄的絕對路徑為:D:\Program Files\Java\tomcat6.0.1\webapps\tests\

     在Servlet中可以使用同樣的方法,得到同樣的結果,畢竟jsp文件中的內容在本質上跟Servlet是一回事。getServletContext().getRealPath("/")很好用,但僅僅適用於jsp文件和Servlet中,因為這是一個Servlet API。

2. Java桌面程序中,可以通過(new File("")).getAbsolutePath()獲取項目根目錄(非Tomcat下)。

  PathTest.jsp

 1 package chloe.aboutpath;
 2 
 3 import java.io.File;
 4 public class PathTest 
 5 {
 6     static String abspath;
 7    static public String getPath()
 8    {
 9        
10        File file=new File("");
11        abspath=file.getAbsolutePath();
12        return abspath;
13    }
14    public static void main(String args[])throws Exception
15    {
16        System.out.println(getPath());
17    }
18 }

  運行結果為:

 D:\CHLOE\IT\java\eclipse_workspace\tests

3. 在Tomcat下運行的類中,(new File("")).getAbsolutePath()獲得的路徑是Tomcat安裝路徑下的bin文件夾下,將獲得的路徑字符串去掉最后的"bin"再添上"webapps\\項目文件夾名"即可。

  經過測試代碼的運行,我發現只要是在Tomcat環境中運行的代碼,如Jsp、Servlet、Servlet調用的Java類、Servlet調用的Java類所調用的Java類等等,由(new File("")).getAbsolutePath()獲得路徑均為Tomcat根目錄下的bin文件夾下,測試代碼與PathTest.java中的基本一樣,這里不再贅述。

 總結

  在大多數情況下,我們都是用Java開發Web程序。根據我個人習慣,如果在jsp文件或者Servlet中需要用到項目的根目錄,則采用getServletContext().getRealPath("/"),因為這個最方便,不需要進一步處理,如果在Servlet調用的其他普通類中需要獲得項目根目錄,則使用(new File("")).getAbsolutePath(),再稍作處理。另外,jsp文件中資源的相對路徑在沒有特別聲明的情況下是相對於本文件所在的位置,可以通過在路徑字符串的前端加上".."進入上一級文件夾后繼續定位,如"../ckeditor/ckeditor.js";默認情況下,指定form的action為某Servlet時,應該使用"/servlet/Servletname",因為默認生成Servlet時,在web.xml的servlet-mapping項中均是這種形式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM