首页 > 代码库 > servlet资源路径加载详解(3)

servlet资源路径加载详解(3)

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/目录