关于serveletContext.getRealPath()获得应用绝对路径的问题

request.getRealPath用于获取应用的绝对路径,但现在已经建议不要使用了。

由于在servlet中使用getServletContext.getRealPath()方法受到war 和non-war的影响,以及不同app server实现的影响,莫名地常常会得到null。

原因在于:对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath只会简单地返回null。其实,也很好理解,一个文件被打包入了.war文件,就不存在目录结构了(虽然包中仍然存在目录结构,但这不等同于文件系统中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO进行读取了。
解决的方法如下:
使用servletContext.getResourceAsStream():

如获取war中的资源路径 servletContext.getResourceAsStream("/WEB-INF/resource/test.config")方法。

 

原则:基本上就是尽量使用j2ee规范中的各层次classloader来获取资源,而不是试图去找文件的绝对路

方法:调用this.getClass().getClassLoader().getResource("/").getPath(); 获取到classes目录的全路径

使用:在得到classes目录的全路径后再根据字符串的截取与拼装达到你的要求即可。

 

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径!应该使用ServletContext的getResource()方法,直接使用相对于Web应用根目录的相对路径来获取资源。
 

 

 

你可能感兴趣的:(Web,servlet)