数据加载中……

在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径


在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径

如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContext.getRealPath("/")来获取当前应用在服务器上的物理地址

如果在类中取不到ServletContext时, 有两种方式可以做到

1) 利用Java的类加载机制 调用 XXX.class.getClassLoader().getResource(""); 方法来获取到ClassPath , 然后处理获得WebRoot目录

这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式


2) 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 on 2007-11-08 22:14 姜利阳 阅读(2057) 评论(6)  编辑  收藏 所属分类: Java

评论

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

不错
2007-11-09 01:18 | ci

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

不错,基本上也是我能想到的

可以尝试下面这个方法

String path = ClassLoader.getSystemResource(".").getPath();

看 path 是不是指向 WebRoot/WEB-INF/classes

应用一般都有 AppClassLoader 和 ExtClassLoader

ClassLoader.getSystemClassLoader()就是那个 AppClassLoader

JRE_HOME/lib/ext目录就是 ExtClassLoader 加载包的位置,所以把 jar 包放在这个目录中都不需要写在 classpath 参数中, 还有些程序会用到 BootClassLoader,这个优先级更高了,可以用来替换 rt.jar 中的实现,记得原来用过 corba 就是执行时用了 -Xbootclasspath:xxx.jar 参数来替换 jdk 本身的实现类才行。
2007-11-09 13:19 | 隔叶黄莺

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

楼上所言甚是
2007-11-09 13:49 | 酸酸菜

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

File file = new File(".");
file.getCanonicalPath();//当前路径
2007-11-09 16:03 |

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

@阿

这也是一种方法,但是只能取得当前类的目录,不能够取道WebRoot/的目录
2007-11-09 21:39 | 姜利阳

# re: 在Java代码(非JSP及Action,Servlet,Controller)中获得WebRoot的物理路径  回复  更多评论   

@隔叶黄莺
String path = ClassLoader.getSystemResource(".").getPath();

看 path 是不是指向 WebRoot/WEB-INF/classes
已经试过,如果class文件打包到jar文件中(jar文件与war文件在被打包到ear文件中), 只能取到jar文件目录
2007-11-09 21:42 | 姜利阳



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-09-01 17:42 编辑过
 
 
相关链接:
网站导航: