1、java种配置文件的三种配置位置和相对应的读取方式:
1.1常见的两种配置文件:xml和*.properties(属性文件)
1.2常见的三种存放位置以及对应的读取方式(properties文件为例):
配置文件内容:
①存放src根目录下:
读取代码:
package com.songwanxi.XML;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws Exception {
//读取src根目录下存放的配置文件 配置文件名前需要加 /
InputStream in = Demo1.class.getResourceAsStream("/db.properties");
Properties p = new Properties();
//将读取到的配置文件对应的流对象交给properties对象进行管理
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
//打印对应键名的值
}
}
输出:
②与读取配置文件的类在同一包(同一级)
读取代码:
package com.songwanxi.XML;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo2 {
public static void main(String[] args) throws Exception {
//读取配置文件的类在同一包(同一级)
InputStream in = Demo2.class.getResourceAsStream("db.properties");
Properties p = new Properties();
//将读取到的配置文件对应的流对象交给properties对象进行管理
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
//打印对应键名的值
}
}
结果:
③WEB-INF(或者在其子目录下)
由于WEB-INF是安全目录,外部无法直接访问到其内部文件,所以需要改变方法使用上下文来获取
读取代码:
package com.songwanxi.XML;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/demo")
public class Demo3Servlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//读取WEN-INF安全目录下的配置文件 通过声明上下文来获取
InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
Properties p = new Properties();
//将读取的配置文件对应的流对象交给Properties进行管理
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass"));
req.getRequestDispatcher("demo.jsp").forward(req, resp);
}
}
结果:
注(了解一下):*.properties文件
key=value
#注释
Properties.load(is)
bin 放命令的
config 放tomcat服务配置的
work 临时文件
webapp 发布项目的目录
web-inf
安全目录 含义:不能被外界访问
log 日志
2、XML文件的读取
根据文件存在的位置来取的方法是跟properties文件一样的
注:properties文件的解析方式有java.util.properties这个类来完成
XML文件应该有一个工具类来完成:
jdk/jdom
sax解析 由上往下解析 (移动端用的比较多)
dom4j解析 由外到内解析(目前最火的解析方式)
首先展示XML文件的内容:
如果我们要读取XML文件可以采用dom4j 解析XML文件,需要先导入两个jar包
接着,我们开始解析:
package com.songwanxi.XML;
import java.io.InputStream;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class Demo4 {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("/students.xml");
SAXReader red = new SAXReader();
//将配置文件加载到内存中(由dom4j创建的对象完成)
Document doc = red.read(in);
System.out.println(doc.asXML());
}
}
结果:
如果我只想拿到XML文件中sid为002的小芳呢?
dom4j+xpath方法:
第一种:
package com.songwanxi.XML;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo4 {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("/students.xml");
SAXReader red = new SAXReader();
//将配置文件加载到内存中(由dom4j创建的对象完成)
Document doc = red.read(in);
//System.out.println(doc.asXML());
//xpath拿到xml中的小芳 按照查找目录的方式去查找XML内容
//students/student/name
//注意:Element 是dom4j中的
//查到所有
List<Element> stuEles = doc.selectNodes("/students/student");
//遍历
for (Element stuEle : stuEles) {
//System.out.println(stuEle.asXML());//获取/students/student该目录下的所有
//获取sid的属性值为s002的
if("s002".equals(stuEle.attributeValue("sid"))) {
Element nameEle = (Element) stuEle.selectSingleNode("name");//获取name标签
//System.out.println(nameEle.asXML());
//获取标签内部的文本内容
System.out.println(nameEle.getText());
}
}
}
}
第二种:
//第二种:xpath直接定位 sid=s002
Element stuEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
//System.out.println(stuEle.asXML());
Element nameEle = (Element) stuEle.selectSingleNode("name");//获取name标签
System.out.println(nameEle.getText());//获取标签内部的文本内容
结果:
比起第一种,第二种明显更加方便。
一个案例: config.xml解析:
1、获取所有action中的type的值
package com.songwanxi.XML;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader red = new SAXReader();
Document doc = red.read(in);
//1、获取所有action中的type的值
List<Element> actEle = doc.selectNodes("/config/action");
for (Element act : actEle) {
System.out.println("获取所有action中的type的值:"+act.attributeValue("type"));
}
}
}
结果:
2、获取第二个action中的type的值
package com.songwanxi.XML;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader red = new SAXReader();
Document doc = red.read(in);
// 2、获取第二个action中的type的值
List<Element> actEle2 = doc.selectNodes("/config/action[@path='/loginAction']");
for (Element act2 : actEle2) {
System.out.println("获取第二个action中的type的值:"+act2.attributeValue("type"));
}
}
}
结果:
3、获取第二个action的所有forward的path
package com.songwanxi.XML;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader red = new SAXReader();
Document doc = red.read(in);
// 3、获取第二个action的所有forward的path
List<Element> actEle3 = doc.selectNodes("/config/action[@path='/loginAction']/forward");
for (Element act3 : actEle3) {
System.out.println("获取第二个action的所有forward的path:"+act3.attributeValue("path"));
}
}
}
结果:
4、获取第二个action的第二个forward的path
package com.songwanxi.XML;
import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test {
public static void main(String[] args) throws Exception {
//找到XML文件
InputStream in = Demo4.class.getResourceAsStream("config.xml");
SAXReader red = new SAXReader();
Document doc = red.read(in);
// 4、获取第二个action的第二个forward的path
List<Element> actEle4 = doc.selectNodes("/config/action[@path='/loginAction']/forward[@name='success']");
for (Element act4 : actEle4) {
System.out.println("获取第二个action的第二个forward的path:"+act4.attributeValue("path"));
}
}
}
结果: