Javaweb專案中的路徑問題
最近在完成一個作業的時候,需要讀取一個在javaWeb的專案中的XML檔案。老是弄不好,便去網上找了方法,有用!一開始也沒深究,完成了作業後,有精力深究了一下。如今寫出來,供大家參考。
我的專案目錄如圖所示,我使用的是Tomcat 8.0作為伺服器,servlet 3.0
首先考慮在普通java類當中獲取UserList.xml的路徑,首先要了解兩個基本知識:
System.out.println(new File("/").getAbsolutePath());//E:\ System.out.println(new File(".").getAbsolutePath());//E:\javaee專案\ContactListB\.
“/”代表了當前專案路徑的根目錄,就好比上面程式碼所示,我的workspace是在E:\javaee專案,所以在普通java類當中就定位在根目錄所在位置---E:/.
"."代表了當前專案位置,相對於java命令執行目錄。這不難得到,就是E:\javaee專案\ContactListB\.。也就是說列印“.”的絕對路徑,得到的就是java命令執行目錄!我們可以做個實驗
這是我們的實驗目錄,我們可以看到有個名為“00.txt”的檔案在extractWord的目錄下,我們在Eclipse中可以通過“./00.txt”或者“00.txt”進行訪問(最好加上“.”),那麼如果我們進入命令列會怎樣呢?
我們可以看到,訪問不到路徑。這是因為,在命令列下,java
E:\javaee專案\extractWord\bin
而不是先前我們在eclipse下面所看到的E:\javaee專案\ContactListB\.
現在我們設定classpath,將classpath設定為E:\javaee專案\extractWord\bin後,再去執行
如圖所示我們又可以得到在Eclipse下面得到的路徑了,這就是java 命令執行目錄。而我們可以得出Eclipse幫助我們set classpath了,所以我們才會在cmd上得到的結果與Eclipse上不一樣。這就是-java命令目錄的意思。
接下來我們回到最初的問題,如果在普通java類當中,獲得想要的檔案路徑呢?知道“.
那麼,如何在Servlet當中,獲取javaweb專案當中的檔案路徑呢?眾所周知,Servlet的程式是放入伺服器中執行的,而
給伺服器使用的: / 表示在當前web應用的根目錄(webRoot下),意思就是如果想要進去WebRoot目錄,就是”/WebRoot”就行了
給瀏覽器使用的: / 表示在webapps的根目錄下
而在servlet 3.0使用註釋代替了web.xml,使得不用寫xml檔案就可以執行servlet,所以我們不用將javaWeb專案拷貝紙TomCat的Webapps下面,也可以直接執行,(可以放,也可以不放)
System.out.println(new File(".").getAbsolutePath());
System.out.println(new File("/").getAbsolutePath());
System.out.println(this.getServletContext().getRealPath(""));
在servlet上面執行如上程式碼,得到如下結果:
D:\Eclipse\eclipse-jee-neon-R-win32-x86_64\eclipse\.
D:\
E:\javaee專案\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MyFirstJaveProject\
如果我們使用“.”或者"/",得到的都是eclipse軟體路徑和eclipse軟體所在的根目錄。
可以看到第三個方法this.getServletContext().getRealPath(""),
這個方法就是得到ServletContext的路徑,而ServletContext是對於一個專案的全文,是一個唯一路徑。可以看出如果我們不將JavaWeb專案拷貝到TomCat伺服器下面,Eclipse會自動在Workspace下面相應的檔案下建立一個名為wtpwebapps的資料夾,這個資料夾的作用就相當於TomCat伺服器下面的webapps,所以我們就找到了相對應的檔案路徑
對於在src下面的資原始檔,在wtpwebapps(webapps)下面的classes資料夾裡面
對於在其他檔案下面的資原始檔,根據標準的WEB專案檔案去找即可
<hr>
類檔案路徑的獲取:
System.out.println("類檔案路徑:"+testPath.class.getResource("/"));
System.out.println("類檔案路徑:"+testPath.class.getResource("."));
結果如圖所示:
使用“/”獲取到的路徑是的最末端是bin目錄