[原創] 如何在 Java 代碼中獲得 WebRoot 的物理路徑?(區分 Windows 和 Linux 的情況)


第一部分:我自己的處理方法

  今天要解析 IK Expression 的 IKExpression.cfg.xml 文件,以解析其中系統函數默認配置用戶函數配置,於是又遇到了一個老問題:Java Web 開發中如何獲取部署目錄下 WEB-INF 中 classes 的物理路徑(網上也有同行描述為:獲取服務器中當前WebRoot的物理路徑)?

  閑話不多說,我先附上代碼片段:

1 pathStr = this.getClass().getClassLoader().getResource("").getPath();
2 // 對 Windows 下獲取 物理路徑 做 特殊處理
3 if("\\".equals(File.separator)) {
4     pathStr = pathStr.substring(1).replaceAll("/", "\\\\");
5 }

  代碼很簡單,也不用過多的解釋了,相信大家都能看懂的。為什么要對 Windows 下的情況做特殊處理呢?因為如果不做這個處理,得到的結果就如下圖所示:

  大家可以看到所有 File Separator 都是“/”,而實際我們期望的是“\”。博主用的是 Windows 8 64位版, MyEclipse 8.6 開發, Tomacat 部署,配合虛擬機里面的 Ubuntu 測試 Linux 下的運行效果。所以情況可能跟大家的不太一樣,大家根據實際情況修改代碼吧 o(∩_∩)o

  最后的運行效果圖如下:

  上圖是在 Ubuntu下部署后運行的效果,下圖是在 Windows 8 的 MyEclipse 中運行的效果:

  下面再附上 Ubuntu 中運行的截圖:

  這種方法是利用Java的類加載機制調用 XXX.class.getClassLoader().getResource(""); 方法來獲取到 ClassPath,然后處理獲得 WebRoot 目錄。這種方式只能是該class在WebRoot/WEB-INF/classes下才能生效,如果該class被打包到一個jar文件中,則該方法失效。

  如果有不完善的地方或更好的方法,歡迎批評指正,謝謝 o(∩_∩)o

第二部分:可供大家參考的其他“高端”做法

  最后我再附上網上的其他比較“高端”的做法共大家參考:

  1. 如果是Servlet, Action, Controller, 或者 Filter, Listener, 攔截器等相關類時,我們只需要獲得 ServletContext,然后通過ServletContext.getRealPath("/")來獲取當前應用在服務器上的物理地址;
  2. 如果在類中取不到ServletContext時,可采用博主使用的方法,或如下方法:采用 Spring 框架的思路,在WEB-INF/web.xml中,創建一個 webAppRootKey 的 param,指定一個值(默認為 webapp.root)作為鍵值,然后通過Listener,或者Filter,或者 Servlet 執行 String webAppRootKey = getServletContext().getRealPath("/");並將 webAppRootKey 對應的 webapp.root 分別作為 Key , Value 寫到 System Properties 系統屬性中。之后在程序中通過 System.getProperty("webapp.root") 來獲得 WebRoot 的物理路徑。

 

 


免責聲明!

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



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