[原创] 如何在 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 的物理路径。

 

 

posted @ 2013-03-19 16:35  PayneWang@王沛  阅读(10560)  评论(0编辑  收藏  举报