如何在 Java 代码中获得 WebRoot 的物理路径

如何在 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 的物理路径。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值