1. 程式人生 > 實用技巧 >檔案上傳 通過 ServletContext.getRealPath()獲取不到路徑&war與war exploded的區別

檔案上傳 通過 ServletContext.getRealPath()獲取不到路徑&war與war exploded的區別

場景

  實現檔案上傳功能,並將使用者上傳的檔案儲存在 WEB-INF 目錄下(不允許外部訪問,保護檔案安全),但是通過 ServletContext.getRealPath() 方法獲取路徑和專案路徑不相符,情況如下:


  使用 war 包部署專案,呼叫方法:`String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");`獲取路徑,相對的就是 Tomcat 的安裝目錄,如下所示:

  而使用 war exploded 包部署專案,呼叫相同方法獲取到的路徑是相對於當前專案的,如下:

分析

  第一種方式是以我們的 Tomcat 伺服器為根據,第二種是以我們的專案為根據。開發中,後者這才是我們更常用的目錄,IDEA 中通過如下方式在配置 Tomcat 時就應該按需求進行部署:

擴充套件:war和war exploded的區別

在使用 IDEA 開發專案的時候,部署 Tomcat 的時候通常會出現下邊的情況:

是選擇 war 還是 war exploded,這裡首先看一下他們兩個的區別:

war 模式這種可以稱之為是釋出模式,就是先將 WEB 工程打成 war 包,然後再將其上傳到伺服器進行釋出 。;war exploded 模式是將 WEB 工程以當前資料夾的位置關係上傳到伺服器,即直接把資料夾、jsp 頁面 、classes 等等移到 Tomcat 部署資料夾裡面,進行載入部署。因此這種方式支援熱部署,一般在開發的時候也是用這種方式。在平時開發的時候,使用熱部署的話,應該對 Tomcat 進行相應的設定,這樣的話修改的 jsp 介面什麼的東西才可以及時的顯示出來。

修改下方圖中箭頭指向的位置,這樣的話就可以實現熱部署。

使用 war 模式開發的時候遇到的坑

一、專案程式碼的位置如下:

上述專案為 SSM 專案。

二、部署使用的 Tomcat 位置:

三、用於獲取上下文環境絕對路徑的程式碼:

String contextPath = request.getSession().getServletContext().getRealPath("/");

四、兩種方式的實驗過程和結果:

(1)在使用 war 模式開發的時候,通過下邊這段程式碼獲取專案的相對路徑:

String contextPath = request.getSession().getServletContext().getRealPath("/");

war 模式始終是獲取到的路徑如下:

其中 C:\Software\apache-tomcat-8.0.32 是本例子中 Tomcat 的所在位置。

可以看出通過 war 模式是最終打包部署到 Tomcat 所在的位置。

(2)然後再看 war exploded 模式,同樣進行設定,運行同一段程式碼,執行結果如下:

可以看出最終得到的是我這個專案的位置,其實就是這個專案 target 的位置。

五、總結

根據上述(1)(2)的實驗結果可以看到這兩種方式得部署方式是不一樣的,因此在獲取專案的相對路徑的時候得到的結果是不一樣的。

此段內容原文地址 baijiahao.baidu.com