序言
在開發(fā)過程中經(jīng)常會用到讀寫文件,其中就必然涉及路徑問題。使用固定的絕對路徑當然很方便,但會導(dǎo)致程序的可移植性差,比如在代碼中寫死了要在E盤建一個文件,而移植后的環(huán)境中木有E盤,那就只能改代碼;又或者需要調(diào)用D盤某某某很長路徑下的一個自定義文件,這個文件路徑又不在項目文件夾下,則拷項目代碼時很容易遺漏這個自定義文件,這樣給項目的交接帶來了不必要的麻煩。如果我們將自定義配置文件或者其他待訪問的文件都放在項目根目錄下的某個文件夾中,在運行時動態(tài)獲取項目根目錄,則能大大提升項目的可移植性。注意,Tomcat下的Web程序的項目根目錄是在Tomcat根目錄的webapps\項目名 下,而Java桌面程序的項目根目錄是在源代碼所在的文件夾下。
這個想法從我最開始做涉及文件存取的項目時就想到了,但是實踐中經(jīng)常失敗,因為不同情況下(Tomcat下的Web程序、Java桌面程序)獲取項目根目錄的方法是不一樣的,同樣的(new File("")).getAbsolutePath()方法在Web環(huán)境下或桌面程序環(huán)境下的結(jié)果不一樣,不一一分析和測試的話就會繞暈。于是最近我專門花了點時間研究了下,發(fā)現(xiàn)其實也不復(fù)雜。我的測試環(huán)境為: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>
訪問結(jié)果:
jsp文件中獲得項目根目錄絕對路徑
項目根目錄的絕對路徑為:D:\Program Files\Java\tomcat6.0.1\webapps\tests\
在Servlet中可以使用同樣的方法,得到同樣的結(jié)果,畢竟jsp文件中的內(nèi)容在本質(zhì)上跟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 Exception15 {16 System.out.println(getPath());17 }18 }
運行結(jié)果為:
D:\CHLOE\IT\java\eclipse_workspace\tests
3. 在Tomcat下運行的類中,(new File("")).getAbsolutePath()獲得的路徑是Tomcat安裝路徑下的bin文件夾下,將獲得的路徑字符串去掉最后的"bin"再添上"webapps\\項目文件夾名"即可。
經(jīng)過測試代碼的運行,我發(fā)現(xiàn)只要是在Tomcat環(huán)境中運行的代碼,如Jsp、Servlet、Servlet調(diào)用的Java類、Servlet調(diào)用的Java類所調(diào)用的Java類等等,由(new File("")).getAbsolutePath()獲得路徑均為Tomcat根目錄下的bin文件夾下,測試代碼與PathTest.java中的基本一樣,這里不再贅述。
總結(jié)
在大多數(shù)情況下,我們都是用Java開發(fā)Web程序。根據(jù)我個人習(xí)慣,如果在jsp文件或者Servlet中需要用到項目的根目錄,則采用getServletContext().getRealPath("/"),因為這個最方便,不需要進一步處理,如果在Servlet調(diào)用的其他普通類中需要獲得項目根目錄,則使用(new File("")).getAbsolutePath(),再稍作處理。另外,jsp文件中資源的相對路徑在沒有特別聲明的情況下是相對于本文件所在的位置,可以通過在路徑字符串的前端加上".."進入上一級文件夾后繼續(xù)定位,如"../ckeditor/ckeditor.js";默認情況下,指定form的action為某Servlet時,應(yīng)該使用"/servlet/Servletname",因為默認生成Servlet時,在web.xml的servlet-mapping項中均是這種形式。