1.前言
1.1配置文件是什么
配置文件是一种特殊的XML文件,它被用于存储程序或系统的配置信息。顾名思义,就是可以存储各种配置参数、选项以及设置,用于告诉程序或系统如何运行、如何连接网络、如何访问硬件资源,用来做配置的文件,常见的后缀名有:
.xml .config .properties .json .yml .ini等。
1.2为什么要用到配置文件
①配置文件可以作为程序或系统的常规配置文件,放置在固定的路径下,方便用户和管理员查看和修改。
②配置文件在程序或系统启动时被加载和解析,程序或系统可以根据需要动态修改配置文件,如更改服务器端口号、连接字符串等等。
③在我们编写Java程序时,有很多参数是会经常改变的。比如环境的配置,我们开发的时候是⼀套环境,测试使用的可能⼜是另外⼀套环境,最后交付给用户的时候,用户用的又是另外⼀套环境,不能每次都重新编译,那样成本太高,所以对于这些参数往往不能直接写死在程序里,不然会非常麻烦,每次修改都需要重新运行⼀次程序,这时就需要借助配置⽂件来存储这些常变的参数,在程序中是读取配置⽂件中的变量的值,如果我们需要修改这些值,只需要修改配置⽂件即可。
1.3配置文件的使用规则
- XML格式化语法: 配置文件必须符合XML格式化语法,且符合XML规范。
- 格式规范: XML配置文件应该遵循一定的格式规范。
- 只读性: 配置文件一般是只读的,只能读取,不能被程序或系统删除或覆盖。
- 路径设置: 需要在程序或系统中指定配置文件所在的路径或文件名。
- 安全性: 配置文件中可能包含敏感的信息,如数据库密码,因此需要保证配置文件的安全性,比如加密或设置访问权限等。
- 版本控制: 配置文件通常需要进行版本控制,需要确保配置文件的版本与程序或系统版本匹配。
1.4配置文件的展示
展示如下:
如上,db.properties就是一个配置文件,里面存放的就是所需要的一些变量。
2.Java中配置文件的三种配置位置及读取方式
2.1同包
即:配置文件与java文件放在同一层次(方便同步编写)
就像这样:
代码如下:
package kissship; import java.io.InputStream; import java.util.Properties; /** * 读取各个文件的位置 * * @author jj * */ public class Demo1 { public static void main(String[] args) throws Exception { // 通过类加载器加载配置文件(同包下) InputStream in = Demo1.class.getResourceAsStream("db.properties"); Properties p = new Properties(); // 让Properties工具类对象,加载含有db.properties文件内容所对应的流 p.load(in); System.out.println(p.getProperty("driver_Class")); System.out.println(p.getProperty("upass")); } }
控制台输出结果:
将XML配置文件和Java文件放在同一层次中,对于大型项目或长期维护的项目来说是非常有益的。这样可以避免出现找不到配置文件的问题,可以方便统一部署和管理。访问和解析配置文件,提高开发效率。
2.2根路径
即:配置文件放在根目录下(一般不做频繁更改)
就像这样:
代码如下:
package kissship; import java.io.InputStream; import java.util.Properties; /** * 读取各个文件的位置 * * @author jj * */ public class Demo1 { public static void main(String[] args) throws Exception { // 通过类加载器加载配置文件(同包下) // InputStream in = Demo1.class.getResourceAsStream("db.properties"); // Properties p = new Properties(); //通过类加载器加载配置文件(根路径下) InputStream in = Demo1.class.getResourceAsStream("/db.properties"); Properties p = new Properties(); // 让Properties工具类对象,加载含有db.properties文件内容所对应的流 p.load(in); System.out.println(p.getProperty("driver_Class")); System.out.println(p.getProperty("upass")); } }
控制台输出结果:
将配置文件放在根目录下,可以方便地找到并进行管理修改和维护,而不必打开多个文件夹层级。同时也能让多个应用程序共享同一个配置文件。可以避免出现找不到配置文件的问题,方便程序员管理、修改和维护配置信息。
2.3WIN-INF安全路径
即:配置文件放在WEB-INF文件下(更加安全)
就像这样:
代码如下:
package kissship; 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; /** * Servlet implementation class WEBinfServlet */ @WebServlet("/WEBinfServlet") public class WEBinfServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //访问WEB-inf目录下的db.properties //拿到servlet上下文 InputStream in = request.getServletContext().getResourceAsStream("/WEB-INF/db.properties"); Properties p = new Properties(); // 让Properties工具类对象,加载含有db.properties文件内容所对应的流 p.load(in); System.out.println(p.getProperty("driver_Class")); System.out.println(p.getProperty("upass")); } }
控制台输出结果:
将配置文件放在WEB-INF中,可以提高配置文件的安全性,有助于保护配置文件的安全。还可以避免其他应用程序或用户误操作配置文件的情况。
3.dom4j的使用
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>
代码展示(获取XML文件):
package kissship; import java.io.InputStream; import org.dom4j.Document; import org.dom4j.io.SAXReader; /** * 获取students中的内容 DOM4J解析 * 1.selectNodes * 2.selectSingNode * 3.getText * 4.attributeValue * @author jj * */ public class Demo2 { public static void main(String[] args) throws Exception { //先获取到需要解析的配置文件 InputStream in = Demo2.class.getResourceAsStream("students.xml"); SAXReader sr = new SAXReader(); Document doc = sr.read(in); System.out.println(doc.asXML()); } }
控制台结果:
3.1获取多个标签
方法名:selectNodes
3.2获取单个标签
方法名:selectSingleNode
3.3获取属性值
方法名:attributeValue
3.4获取标签值
方法名:getText
3.5方法展示
代码展示:
package kissship; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 获取students中的内容 DOM4J解析 * 1.selectNodes * 2.selectSingNode * 3.getText * 4.attributeValue * @author jj * */ public class Demo2 { public static void main(String[] args) throws Exception { //先获取到需要解析的配置文件 InputStream in = Demo2.class.getResourceAsStream("students.xml"); SAXReader sr = new SAXReader(); Document doc = sr.read(in); // System.out.println(doc.asXML()); //1.获取所有的student标签中的内容 List<Element> stuEles = doc.selectNodes("/students/student"); for (Element stuEle : stuEles) { // System.out.println(stuEle.asXML()); //2.获取所有name标签的内容 Element nameEle = (Element) stuEle.selectSingleNode("name"); // System.out.println(nameEle.asXML()); //3.获取标签内部内容 System.out.println(nameEle.getText()); //4.获取标签属性值,即学生的学号id System.out.println(stuEle.attributeValue("sid")); } } }
4.xpath的使用
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>
代码如下:
package kissship; import java.io.InputStream; import java.util.List; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * xpath解析 * @author jj * */ public class Demo3 { public static void main(String[] args) throws Exception { //获取到sid=002学生的姓名 InputStream in = Demo2.class.getResourceAsStream("students.xml"); SAXReader sr = new SAXReader(); Document doc = sr.read(in); // System.out.println(doc.asXML()); //1.获取所有的student标签中的内容 List<Element> stuEles = doc.selectNodes("/students/student"); for (Element stuEle : stuEles) { if("s002".equals(stuEle.attributeValue("sid"))); Element nameEle = (Element) stuEle.selectSingleNode("name"); System.out.println(nameEle.getText()); } //xpath解析 Element nameEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']/name"); System.out.println(nameEle.getText()); } }
最后J2EE之XML解析(超详细)就到这里,祝大家在敲代码的路上一路通畅!