Servlet获取资源文件的方式总结

最近在学习JavaWeb,同时也因为ServletContext获取资源文件的方式而苦恼,
一个最直截了当的问题就是:为什么方式有这么多?太容易弄混了!

确实,看了视频教程之后,首先感觉到在Web工程中想要获取资源文件信息和普通的Java工程是不一样的,因为这是在Web工程而不是Java工程,即使我们的文件放在src下,但是,真正的相对路径不是在src下,真正的绝对路径也不是在Java工作空间中。由于我们的Web工程是寄托在Tomcat中来运行,所以运行的路径是在Tomcat项目目录下的classes中,故这也是本人为什么要总结的原因!以下为重点:

  • ServletContext - 普通方式读取工程文件
  • 首先,如果我们在EclipseWeb项目中src目录下,新建一个properties配置文件,并写上信息,若要读取,最原始方法是的使用Properties加载FileInputStream(PS:这也是我们学JavaSE所通常使用的方法)但是这种方法有以下注意点及局限性:
  1. 实例化InputStream的代码过于啰嗦,文件路径太长(不是相对路径)
  2. 以下为该方法的代码:
Properties properties = new Properties();
InputStream is = new FileInputStream("D:/apache-tomcat-7.0.77/wtpwebapps/Servlet/WEB-INF/classes/peizhi.properties");
properties.load(is);
String name = properties.getProperty("name");	//这里以获取name为例
System.out.println("name="+name);
  • ServletContext - 获取资源文件(一)
  • 该方法比上面的方法方便,仍然是Properties加载InputStream来实现,还加入了ServletContext对象来获取InputStream,就不用像上面那样填写复杂的路径了,这种方法有以下注意点:
  1. 使用到了ServletContext的getRealPath(“WEB-INF/classes/peizhi.properties”);
  2. 该方法指向的目录为:项目工程名的目录下
  3. 所以路径为:WEB-INF/classes/peizhi.properties
  4. 以下为该方法的代码:
Properties properties = new Properties();
ServletContext sc = getServletContext();
InputStream is = null;
String path = sc.getRealPath("WEB-INF/classes/peizhi.properties");
//System.out.println("path="+path);
is = new FileInputStream(path);
properties.load(is);
String name = properties.getProperty("name");
System.out.println("name="+name);
  • ServletContext - 获取资源文件(二)
  • 该方法比第一种方法方便(和第二种类似),这种方法有以下注意点:
  1. 使用到了ServletContext的getResourceAsStream方法
  2. getResourceAsStream方法指向的目录在Tomcat的根目录工程下,即wtpwebapps\项目工程名
  3. 所以路径为:WEB-INF/classes/peizhi.properties
  4. 以下为该方法的代码:
ServletContext sc = getServletContext();
Properties properties = new Properties();
InputStream is = null;
is = sc.getResourceAsStream("WEB-INF/classes/peizhi.properties");
properties.load(is);
String name = properties.getProperty("name");
System.out.println("name="+name);
  • ServletContext - 使用ClassLoader获取资源文件
  • 该方法与上面的两种方法类似,也是使用properties与InputStream,只不过是使用ClassLoader来完成
  1. this.getClass().getResourceAsStream("…/name.properties");指向:classes\Servlet
  2. this.gerClass().getClassLoader().getResourceAsStream(“name
    .properties”);指向:classes
  3. 以下为该方法的代码:
Properties properties = new Properties();
InputStream is = null;
is = this.getClass().getClassLoader().getResourceAsStream("peizhi.properties");
properties.load(is);
String name = properties.getProperty("name");
System.out.println("name="+name);

最后:本人为大二菜鸡一枚,希望对一些和我一样学习Web有疑惑的同学有所帮助。PS:第一次写博客,竟然写了近两个小时!