这篇博客是对网上看到的资料和自己做东西时的一些总结进行的整理。
在这之前我们一定要搞懂绝对路径和相对路径,否则你会看得稀里糊涂的。举例说明:下面的图片是我的Web项目MyEclipse工作空间下的文件目录:如果我要获取templet文件夹下的文件templet1.xml
采用绝对路径为:D:\mydemo\ItcastOAZD\WebRoot\templet\templet1.xml 如果采用相对路径(后面讲如何获取相对路径),那么在没发布项目的情况下,可以获取到的路径和上面一样,但是一旦发布了,获取的路径就是如下:E:\spring\tomcat\apache-tomcat-6.0.43\webapps\ItcastOAZD\templet\templet1.xml.这个路径是在Tomcat服务器上的路径。我想这个应该很能说明绝对路径和相对路径了吧。当我们把项目部署到服务器上时,当然要采用相对路径,否则肯定会出现路径错误的问题。其实,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!
知道了这个。在理解下面获取资源的方法就比较容易了。
在开发Web方面的应用时, 经常需要获取服务器中当前WebRoot/webapp的物理路径。但是我们不能凭空就能获取到,肯定需要依靠一些有路径的对象来获取到或者推断到。那么什么对象是有路径的呢?有两类:第一类是类,有classpath。 第二类是客户端访问时,我们可以获取到路径。下面依次讲一下这两类下取路径的方法。
一、借助类的加载路径获取
1. System.getProperty("user.dir") 这里的 "user.dir" 是固定的。指当前工程路径,在不同程序中所指的位置也不尽相同。也还是一个绝对路径和相对路径的区别。
(1) 对于eclipse中的Java Application,System.getProperty("user.dir")的值为:
D:\mydemo\ItcastOAZD(项目的存储路径)
(2) 对于eclipse中的动态web工程(也就是部署以后),System.getProperty("user.dir")的值为:
E:\spring\tomcat\apache-tomcat-6.0.43\bin
2,. calss.getResource()和ClassLoader().getResource()
我先给出几个实例,结合实例讲解:
File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile());
File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile());
首先这两句获取路径都是依靠Test这个类。第一种是通过Class类实例的getResource方法,第二种是ClassLoader类实例的getResource方法.Class.getResource()也是委托ClassLoader的getResource方法来实现的.但是这两者使用上有些区别:
第一种:Class.getResource(String path)
path不以’/'开头时,默认是从此类所在的包下取资源;
path 以’/'开头时,则是从ClassPath根下获取;
第二种:Class.getClassLoader().getResource(String path)
path不能以’/'开头时;
path是从ClassPath根下获取;
详细比较请看:http://www.cnblogs.com/yejg1212/p/3270152.html
顺便提一下:关于 getClassLoader().getResource() 和 Thread.currentThread().getContextClassLoader().getResource()区别:因为类似Tomcat这类的容器,可能使用了自定义的ClassLoader产生了特殊的classpath,这样就需要遵循特殊的方式,Thread.currentThread().getContextClassLoader()返回该线程的上下文 ClassLoader,再调用getResource更保险一些,一般推荐使用Thread.currentThread().getContextClassLoader().getResource()方式获取资源 .
二、借助客户端访问服务器,获取路径
我们可以从servlet中获取,也可以从jsp中获取,如果你使用的是Struts框架,那从Action中也可以获取。
在jsp中获取方法:
根目录所对应的绝对路径:request.getRequestURI()
文件的绝对路径:application.getRealPath(request.getRequestURI());
当前web应用的绝对路径 :application.getRealPath("/");
在servlet中获取方法:
根目录所对应的绝对路径:request.getServletPath();
文件的绝对路径:request.getSession().getServletContext().getRealPath(request.getRequestURI())
当前web应用的绝对路径 :servletConfig.getServletContext().getRealPath("/");
(ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
)
在Action中获取方法:
String rootPath = ServletActionContext.getServletContext().getRealPath("/");
String path = rootPath+"WEB-INF\\...\\...\\test.xls";
总结:虽然这里列出了很多种方法,但是根本的就是要明白,获取路径依靠两种:一是类,二是主要能处理客户端和服务器通信对象。我们实际中要获取资源的情况肯定是各不一样的。理解了这个后,就可以确定用什么方式能最合适的取用。也可能这些获取的不是最终想要的,那么在上面继续拼接或者进行截取就OK了。