通常情况下,资源会有两种放置path,一个是src目录下,经编译会处于web工程下的WEB-INF/classes目录下;一种是WebRoot下,经编译处于工程根目录下。
这里我以对web配置资源作为例子来演示如何解析web资源,web配置通常又会以properties文件和xml文件出现。如上图所示
一、当资源放置在src目录下面时,解析资源可以有两种方式:使用ServletContext和类装载器ClassLoader。
1、使用ServletContext
package com.zpc.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class GetPropDemo extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获得InputStream,有两种方式获得,使用getResourceAsStream()
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
//或者使用getRealPath获得
//String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
//FileInputStream is = new FileInputStream(new File(path));
//2.如果是properties文件则用Properties类获得
Properties prop = new Properties();
prop.load(is);
System.out.println(prop.getProperty("driver"));
//3.如果是xml文件
SAXReader reader = new SAXReader();
try {
Document documnent = reader.read(is);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//然后dom4j方式获得xml内的数据,可以参照另一篇专门讲解xml解析的文章
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
2、使用ClassLoader
//得到InputStream,同样有两种方式,,使用getResourceAsStream()
//InputStream is = GetPropDemo.class.getClassLoader().getResourceAsStream("db.properties");
//或者使用GetResource()
URL url = GetPropDemo.class.getClassLoader().getResource("db.properties");
String path = url.getPath();
//读
FileInputStream in = new FileInputStream(path);
//写
FileOutputStream out = new FileOutputStream(path);
Properties prop = new Properties();
prop.load(in);
prop.setProperty("username", "admin");
//写入propties文件
prop.store(out, "");
由上面可以看出,当只需对资源进行读取时,使用代表web工程的对象ServletContext更方便,当需要修改资源的的数据时则使用类装载器。但对资源进行修改在实际开发中并不常见。
二、 当资源放置在webroot下时,只需要修改相应的路径可采取同样的方式进行解析。
InputStream is = this.getServletContext().getResourceAsStream("/db.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop.getProperty("driver"));
有一点,当读取资源数据较大,超过JVM承载时,则不能用类装载器,而只能使用ServeletContext获取。