Java中配置文件的三种配置位置及读取方式
1.读取同级目录下的配置文件
(读取存放在src根目录下db.properties)
db.properties,内容有
uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
driver_Class=com.mysql.jdbc.Driver
initPoolSize=5
maxPoolSize=20
这里写Demo1.java来读取
package wxm;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**读取同级目录下的配置文件 *
* @author 2019071003 *
*/public class Demo1 {
public static void main(String[] args) throws Exception {// 读取同级目录下的配置文件 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("maxPoolSize"));} }
结果如下
结果一致
2与读取配置文件的类在同一包.如图(读取conf下面db.properties)
写一个Demo2.java来读取,如下
package wxm;
import java.io.IOException;import java.io.InputStream;
import java.util.Properties;
/**读取项目根目录下的配置文件 *
* @author 2019071003 *
* */
* 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("maxPoolSize"));
}
}
结果:对应内容成功
对比:错误示范,没有在文件名前加/
Test2.class.getResourceAsStream("/db.properties");这里的/若是没有就会报错(空指针异常,找不到文件)
3 WEB-INF(或其子目录下)(读取WEB-INF里面的db.properties)*
注意!!!
WEB-INF是安全目录,不能被外界访问然后我们的办法是
package wxm;
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;
/** 获取web-inf下的配置文件db.properties
* @author 2019071003 *
*/
@WebServlet("/demo3")//配置文件
public class DemoServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost (req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取web-inf下的配置文件
InputStream in=req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");//把上下文转为流资源 Properties p=new Properties();//创建管理对象(!!!空指针-一般是这里为空->一般去检查一下文件是否在web-info的根目录下) //将读取的配置文件对应的流对象交给Properties进行管理
p.load(in);
System.out.println(p.getProperty("uname"));
System.out.println(p.getProperty("upass")); }}
XML的作用
3.dom4j+xpath解析xml文件(重点
3.1写好students.xml
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student sid="s001">
<name>小明</name>
</student>
<student sid="s002">
<name>小芳</name>
</student>
<student sid='s003'>
<name>小王</name>
</student>
</students>
3.2导入2个jar包
写一个来读取`test.java
案例1:
获取到小芳
第一种方法:
先得到所有的student元素
package 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;
/**
*讲解如何解析xml从中获取我们想要得到的内容
* xml解析技术: dom4j、sax解析、jdom解析
* 重点是dom4j,后两种已经慢慢被淘汰 例如:我需要获取到小芳
* @author 2019071003
* */
public class Test {
public static void main(String[] args) throws Exception {
InputStream in=Test.class.getResourceAsStream("students.xml");
SAXReader reader=new SAXReader();//dom4j //将配置文件xml内容加载到内存中
Document doc= reader.read(in);//注意 导包为dom4j的,抛出异常
//System.out.println(doc.asXML());
//例如:我需要获取到小芳。运行如下代码: //第一种方法: //1. 先得到所有的student元素 List<Element> stus=doc.selectNodes("students/student");//得到所有的student的元素
for (Element e : stus) {
System.out.println(e.asXML());
}
}
}
效果一致
案例2:
判断是否是sid=“s002”,并得到sid=“s002”内的元素, 如下代码:
package 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;
/** *3..获取标签内的文本内容,代码如下:
* @author 2019071003 *
* /
* public class Test2 {
* public static void main(String[] args) throws Exception {
InputStream in=Test2.class.getResourceAsStream("students.xml");
SAXReader reader=new SAXReader();//dom4j //将配置文件xml内容加载到内存中
Document doc= reader.read(in);//注意 导包为dom4j的,抛出异常
List<Element> stus=doc.selectNodes("students/student");//得到所有的student的元素
for (Element e : stus) { //System.out.println(e.asXML());
if("s002".equals(e.attributeValue("sid"))) {//得到每个sid的内容
Element name=(Element) e.selectSingleNode("name");//得到002的元素name // System.out.println(name.asXML()); System.out.println(name.getText()); }
}
}
}
效果:
第二种方法
代码:
package 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; /
** * 第二种方法 *2.判断是否是sid=“s002”,并得到sid=“s002”内的元素, 如下代码:
* @author 2019071003
* */public class Test3 {public static void main(String[] args) throws Exception {
* InputStream in=Test3.class.getResourceAsStream("students.xml");
* SAXReader reader=new SAXReader();//dom4j //将配置文件xml内容加载到内存中
* Document doc= reader.read(in);//注意 导包为dom4j的,抛出异常
* Element stuEle002=(Element) doc.selectSingleNode("students/student[@sid='s002']");
* Element nameEle=(Element) stuEle002.selectSingleNode("name");
* System.out.println(nameEle.getText());
* }
* }
作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
package 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;
/** document.selectNodes(xpath);//查一组
document.selectSingleNode(xpath);//查单个
作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
* @author 2019071003
* */public class Test5 {public static void main(String[] args) throws Exception {
* InputStream in=Test5.class.getResourceAsStream("config.xml");
* SAXReader reader=new SAXReader();//dom4j //将配置文件xml内容加载到内存中
* Document doc= reader.read(in);//注意 导包为dom4j的,抛出异常 //1、获取所有action中的type的值
* List<Element> stuEles=doc.selectNodes("/config/action");
* for (Element e : stuEles) { //1、获取所有action中的type的值
* System.out.println("1、获取所有action中的type的值"+e.attributeValue("type"));
* //2.获取第二个action中的type
* if("/loginAction".equals(e.attributeValue("path"))) {
* System.out.println("2.获取第二个action中的type:"+e.attributeValue("type")); } }
* //3、获取第二个action的所有forward的path
* List<Element> stuEle2=doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
* for (Element e : stuEle2) {
* System.out.println("3、获取第二个action的所有forward的path"+e.attributeValue("path"));
* // 4、获取第二个action的第二个forward的path
* if("success".equals(e.attributeValue("name"))) {
* System.out.println("4、获取第二个action的第二个forward的path"+e.attributeValue("path"));
*
* }}
* }}