日志、类加载器、XML(配置文件)
目录
- 一、日志
- 1.日志技术的概述
- 2.日志技术的体系
- a. Logback
- 3.日志的级别
- 二、类加载器
- 1.概述
- 2.类加载时机
- 3.类加载过程
- 3.类加载器的分类
- 4.常用方法
- 三、XML(配置文件)
- 1.概述
- 2.XML的基本语法
- 3.XML的文档约束
- a.DTD约束
- b.schema约束
- 4.XML文档解析
- a.Dom4j
- b.Xpath
一、日志
1.日志技术的概述
如果我们想知道一个系统运行的过程和详情怎么办? 这时就需要用到日志,生活中的日志就好比日
记,可以记录生活中的点点滴滴;程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。
日志技术具备的优势:
- 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件、数据库中)。
- 可以随时以开关的形式控制是否记录日志,无需修改源代码。
2.日志技术的体系
日志规范大多是一些接口,提供给实现框架去设计的,常见的规范有以上两种。日志的实现框架,现在最常用的就是Lohback。
a. Logback
首先在当前模块下,新建一个文件夹,起名为lib。
然后将三个jar包粘贴到lib文件夹中。
然后再将三个jar包添加为库即可。
将xml文件拷贝到src目录下
代码如下:
public class LoggerDemo1 {
//获取日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("LoggerDemo1.class");
public static void main(String[] args) {
//就可以记录用户的操作日志
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
if ("zhangsan".equals(username) && "123".equals(password)) {
System.out.println("登陆成功!");
LOGGER.info("用户于" + new Date() + "登陆成功,用户名为:" + username + "密码为:" + password);
}else {
System.out.println("登录失败!");
LOGGER.info("用户于" + new Date() + "登陆失败,用户名为:" + username + "密码为:" + password);
}
}
}
控制台打印,并且写到了日志文件中
3.日志的级别
如果系统上线之后只想记录一些错误的日志信息或者不想记录日志了,就可以通过日志的输出级别来
控制哪些日志信息输出或者不输出。
二、类加载器
1.概述
类加载器负责将字节码文件加载到内存中。
2.类加载时机
- 创建类的实例(对象)。
- 调用类的类方法(静态方法)
- 访问类或者接口的类变量,或者为该类变量赋值。(类变量指的是类中的静态变量)
- 使用反射方式来强制创建某个类或接口对应的Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
概括为用到这个类就加载,没用到就不加载。
3.类加载过程
一开始字节码文件是存储在硬盘上的,首先通过包名+类名找到想要加载的class字节码文件,然后创建一个流,在通过这个流将字节码文件加载到内存当中,然后在内存中创建一个class对象。
例如我的类成员变量中有一个String类型的变量,当把类加载到内存中的时候,并不知道String这个类在哪里,就需要先用符号来替代,例如“&&&”这个符号。在解析这一步,会将符号替换为String。
3.类加载器的分类
我们自己写的程序大多都是用的第三种类加载器。
双亲委派模型中每一个加载器都是下面加载器的父类。如果我们现在想要用自定义类加载器去加载一个文件,首先自己并不会尝试加载,而是将这个文件一层一层向上委派给父类进行加载。每种加载器都有自己的加载范围,如果父类的加载器不能进行加载,就会一层一层向下返回,然后子加载器才会尝试自己去加载文件。
4.常用方法
public class ClassLoaderDemo1 {
public static void main(String[] args) throws IOException {
//获取系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//利用加载器去加载一个指定的文件
//参数:文件的路径
//返回值:字节流
InputStream is = systemClassLoader.getResourceAsStream("prop.properties");
Properties prop = new Properties();
prop.load(is);
System.out.println(prop);
is.close();
}
}
这是文件中的数据:
结果:
三、XML(配置文件)
1.概述
配置文件用来保存程序在运行时需要的一些参数。例如IDEA就有相应的配置文件,里面有IDEA的背景图片、字体信息、字号信息等等。常见的配置文件有以下三种,txt,properties,xml:
三种配置文件的优缺点:
TxT文件
- 优点:几乎没有优点
- 缺点:不利于阅读
properties文件:
- 优点:键值对形式易于阅读
- 缺点:无法配置一组一组得数据
XML文件:
- 优点:易于阅读,可以配置成组出现的数据
- 缺点: 解析比较复杂
如果以后配置信息数据量比较少,一个键只对应一个值,就是用properties。数据量多就使用XML。
下图是XML文件的概述和作用
2.XML的基本语法
对于XML中的其他组成,对于小于号(<),大于号(>)等等一些特殊字符就需要用特殊的标记来写,下图中给出了特殊的标记。
对于CDATA区,CDATA区中的所有内容都可以当做是文本内容,即小于号、大于号等特殊字符可以直接写,不需要用特殊的标记。
XML文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<!-- 下面表示第一个学生的信息 -->
<student id = "1">
<name>张三</name>
<!-- 表示1<2-->
<name>1 < 2</name>
<!--CDATA区 -->
<name> <![CDATA[<<<<<<<< >>>>>>>>>]]> </name>
</student>
</students>
在浏览器中显示的效果如下:
3.XML的文档约束
文档约束是用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件。
常见的约束分为DTD约束和schema约束。
a.DTD约束
下面是dtd文件约束:
这是xml配置文件代码,必须严格按照dtd文件的格式进行书写,标签什么的都要一致:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM 'book.dtd'>
<书架>
<书>
<书名>西游记</书名>
<作者>吴承恩</作者>
<售价>23</售价>
</书>
<书>
<书名>西游记</书名>
<作者>吴承恩</作者>
<售价>23</售价>
</书>
</书架>
但dtd约束不能约束具体的数据类型。
b.schema约束
schema文件代码如下:
xml文件代码书写如下:
4.XML文档解析
a.Dom4j
我们要利用Dom4j(第三方库)来对一个XML文件的数据进行解析。
方法如下:
代码如下:
XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id = "1">
<name>zhangsan</name>
<age>23</age>
</person>
<person id = "2">
<name>lisi</name>
<age>24</age>
</person>
<person id = "3">
<name>wangwu</name>
<age>23</age>
</person>
</persons>
测试用例:
public class Demo4jDemo1 {
public static void main(String[] args) throws DocumentException {
//1.创建解析器的对象
SAXReader saxReader = new SAXReader();
//2.利用解析器去读取xml文件,并返回文档对象
File file = new File("day33\\src\\xmldemo3\\person.xml");
Document document = saxReader.read(file);
//3.自己解析的时候,一定要一层一层的解析
//获取根标签
Element rootElement = document.getRootElement();
//获取根标签中的子标签
List<Element> elements = rootElement.elements();
for (Element element : elements) {
//继续获取里面的内容
//获取属性
Attribute id = element.attribute("id");
//获取里面的值
String text = id.getText();
//获取标签name
Element name = element.element("name");
String text1 = name.getText();
//age
Element age = element.element("age");
String text2 = age.getText();
//可以新建一个对象类,然后把这些数据都赋值给对象的属性,就可以变成一个一个对象
System.out.println(text + "," + text1 + "," + text2);
}
}
}
b.Xpath
当我们想要获得XML文件中某一个子标签时,就可以使用Xpath路径检索。
首先我们需要将第三方库添加到我们的项目中。
下面参数中所说的表达式代表的是路径。路径有绝对路径、相对路径(用的不多)、全文检索、属性查找。
XML文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person id = "1">
<name>zhangsan</name>
<age>23</age>
</person>
<person id = "2">
<name>lisi</name>
<age>24</age>
</person>
<person id = "3">
<name>wangwu</name>
<age>23</age>
</person>
<name>zhaoliu</name>
</persons>
绝对路径:
public class XPathDemo1 {
public static void main(String[] args) throws DocumentException {
//1.创建解释器对象
SAXReader saxReader = new SAXReader();
//2.加载XML文件获得Document对象
File file = new File("day33\\src\\xpathdemo\\person.xml");
Document document = saxReader.read(file);
//检索多个
List<Element> list = document.selectNodes("/persons/person/name");
for (Element element : list) {
//获得标签中的文本内容
System.out.println(element.getText());
}
System.out.println("--------------------------------");
//检索单个
//如果有多个相同的标签,会获取到第一个
Element node = (Element) document.selectSingleNode("/persons/person/name");
System.out.println(node.getText());
}
}
全文检索:
public class XPathDemo2 {
public static void main(String[] args) throws DocumentException {
//1.创建解释器对象
SAXReader saxReader = new SAXReader();
//2.加载XML文件获得Document对象
File file = new File("day33\\src\\xpathdemo\\person.xml");
Document document = saxReader.read(file);
//全文检索 (//contact)
List<Element> list = document.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}
System.out.println("--------------------------------");
//全文检索 (//contact/name)
List<Element> list1 = document.selectNodes("//person/name");
for (Element element : list1) {
System.out.println(element.getText());
}
}
}
属性检索:
public class XPathDemo3 {
public static void main(String[] args) throws DocumentException {
//1.创建解释器对象
SAXReader saxReader = new SAXReader();
//2.加载XML文件获得Document对象
File file = new File("day33\\src\\xpathdemo\\person.xml");
Document document = saxReader.read(file);
//查找属性
List<Attribute> list = document.selectNodes("//@id");
for (Attribute attribute : list) {
System.out.println(attribute.getName());
}
System.out.println("-----------------------------------");
//查找带有指定属性的标签
List<Element> list1 = document.selectNodes("//person[@id]");
for (Element element : list1) {
System.out.println(element.getName());
}
}
}