關於Java獲取Tomcat7和Tomcat8根目錄路徑webapps的不同
專案需要用到上傳功能,所以想把上傳後的圖片儲存在Tomcat的根目錄下,發現Tomcat和Tomcat獲取根目錄有所不同,特此記錄。
Java獲取Tomcat根目錄示例程式碼如下
private HttpServletRequest request = ServletActionContext.getRequest(); String path = request.getSession().getServletContext().getRealPath("/"); System.out.println("path = " + path); String picturePath = request.getSession().getServletContext().getRealPath("/picture"); System.out.println("picturePath = " + picturePath); String url = request.getSession().getServletContext().getRealPath(""); System.out.println("url = " + url); int ch = url.lastIndexOf("\\"); String webapp = url.substring(0, ch); System.out.println("webapp = " + webapp); String home = System.getProperty("catalina.home"); System.out.println("home = " + home); String home2 = System.getProperty("catalina.home"); System.out.println("home2 = " + home2 + "\\webapps");
使用的測試工具為postman
測試結果如下:
Tomcat7:
Tomcat8:
此時,我們可以發現 request.getSession().getServletContext().getRealPath("/") Tomcat7和8獲取的路徑是一樣的,都是獲取你專案路徑xxx,但是 request.getSession().getServletContext().getRealPath("") 獲取的路徑有所不同,而且 webapp在Tomcat可以直接獲取,而Tomcat8則不能,需要使用其他方法來實現。
我們可以用更好的方法來實現,就是
String home2 = System.getProperty("catalina.home"); System.out.println("home2 = " + home2 + "\\webapps");
這樣無論是Tomcat7還是Tomcat8都可以獲取到正確的webapps路徑了。
或者配置Tomcat的server.xml檔案配置虛擬對映路徑
1、修改Tomcat的server.xml檔案,新增Context 欄位
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <!-- 設定虛擬路徑[訪問時路徑為/picture] --> <Context path="/picture" docBase="F:\picture" reloadable="true" />
其中path是對映的虛擬路徑(可視具體情況配置),docBase是靜態資源存放的真實物理路徑,reloadable指有檔案更新時,是否重新載入,一般設定為true後,tomcat不需要重啟啟動,自動熱載入
2、此時,直接開啟 http://localhost:8080/picture/xxxxxxxx.jpg 即可開啟圖片或上傳檔案到 http://localhost:8080/picture/ 即可。
結論:一般獲取路徑都是用於上傳或者下載內容,我們可以用上面程式碼獲取路徑,也可以直接配置Tomcat的虛擬路徑,但最好的方法就是使用雲儲存,使用雲儲存儲存圖片或者檔案,可以很大程度減輕伺服器壓力,也不需要怎麼去管理,非常方便,並且現在的雲端儲存大多數都是10G免費試用。