1.对于servlet的读取资源文件,要考虑工程文件路径和tomcat服务器的部署后的文件,所以一定要弄清楚加载文件路径位置,同时要考虑采用哪种方式:
一般有三种方式:
(1).采用传统方式即jdk中提供的InputStream is = new FileInputStream("config.properties");
(2).采用ServletContext对象加载
(3).采用类加载器的方式
2.用代码检验
package cn.wwh.www.web.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*类的作用:研究在servlet中读取的数据,加载的文件路劲的含义
*
*
*@author 一叶扁舟
*@version 1.0
*@创建时间: 2014-7-28 上午11:24:05
*/
public class DealFilePath extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 采用传统的方式加载文件,例如加载的文件的路径为FileInputStream("config.properties"),此时代表的
* 路径的位置是在tomcat服务器的bin目录下的一个文件config.properties
* 如果加载的路径是src/config.properties,则表示这个文件实在
* tomcat服务器下的一个文件夹src中文件config.properties,对于传统方式(即jdk中)都是相对与bin目录而言
*
*/
/*InputStream is = new FileInputStream("config.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println("name:"+prop.getProperty("age"));
*/
/**
*用这种方式加载的文件,“/”表示的是Summer_Exercise6这个目录
*即这种加载文件的路径是相对于tomcat中webapps目录下的工程文件名而言
* 1.context.getResourceAsStream("/config2/config.properties")的
* 全路径是webapps/Summer_Exercise6/config2/config.properties
* 2.context.getResourceAsStream("/config.properties")的全路径是:
* webapps/Summer_Exercise6/config.properties
* 3.如果想加载工程中src目录下的文件如config1/config.properties文件
* 应该这样写:/WEB-INF/classes/config1/config.properties
* 此时“/”仍然代表的文件路径是Summer_Exercise6
*/
/*ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/config2/config.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println("name:"+prop.getProperty("name"));*/
ServletContext context = this.getServletContext();
InputStream is = context.getResourceAsStream("/WEB-INF/classes/config1/config.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println("name1:"+prop.getProperty("name"));
/**
*采用类加载器的处理时,"/"表示的是当前工程名下的src目录,即/WEB-INF/classes/
*cl.getResourceAsStream("/config1/config.properties")的全路径是:
*Summer_Exercise6/WEB-INF/classes/config1/config.properties
*/
// 返回当前字节码对象
Class clazz = this.getClass();
// 取得类加载对象
ClassLoader cl = clazz.getClassLoader();
// 通过类加载器加载资源文件
is = cl.getResourceAsStream("/config1/config.properties");
prop = new Properties();
prop.load(is);
System.out.println("name2:"+prop.getProperty("name"));
}
}
3.目录结构图:
(1)工程目录图;
(2).tomcat服务器的目录结构图;
4.对以上总结:
(1)如果以传统方式读取资源文件(txt/xml/properties),是相对于web服务器的bin/目录而言
(2)如果以ServletContext方式读取资源文件(txt/xml/properties),是相对于web服务器的当前web应用目录而言此时/表示:当前web应用,即Summer_Exercise6
(3)类加载器只能加载IDE工具下src目录下的资源文件,其它目录无法加载此时/表示:/WEB-INF/classes/目录
(4)ServletContext和类加载器的区别:
ServletContext方式:
1)资源的文件的位置任意
2)加载文件时,只会以流的方式读取,不会一次性加载全部
3)/表示当前web应用,即Summer_Exercise6
类加载器方式:
1)资源文件的位置只能放置类路径下,即IDE工具的src目录下
2)加载文件时,会一次性加载全部文件
3)/表示当前/WEB-INF/classes/
注意:
1>物理硬盘路径使用\[window系统]
2>网络路径使用/
3> 如果/表示客户端路径的话,表示tomcat/webapps/目录
servlet资源路径加载详解(3)