1、XML
1.1 概述
-
xml概述
XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言
标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
可扩展:标签的名字是可以自定义的,XML文件是由很多标签组成的,而标签名是可以自定义的 -
作用
- 用于进行存储数据和传输数据
- 作为软件的配置文件
-
作为配置文件的优势
- 可读性好
- 可维护性高
2.2 应用
2.2.1 语法规则
-
XML文件的后缀名为:xml
-
文档声明必须是第一行第一列
<?xml version="1.0" encoding="UTF-8" standalone="yes”?>version:该属性是必须存在的
encoding:该属性不是必须的 打开当前xml文件的时候应该是使用什么字符编码表(一般取值都是UTF-8)
standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no
-
必须存在一个根标签,有且只能有一个
-
XML文件中可以定义注释信息
-
XML文件中可以存在以下特殊字符
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
-
XML文件中可以存在CDATA区
<![CDATA[ …内容… ]]>
2.2.2 xml解析
-
概述
xml解析就是从xml中获取到数据
-
常见的解析思想
DOM(Document Object Model)文档对象模型:就是把文档的各个组成部分看做成对应的对象。
会把xml文件全部加载到内存,在内存中形成一个树形结构,再获取对应的值
常见的解析工具
- JAXP: SUN公司提供的一套XML的解析的API
- JDOM: 开源组织提供了一套XML的解析的API-jdom
- DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java
- pull: 主要应用在Android手机端解析XML
public class XMLDemo01 {
private static final Logger LOGGER = LoggerFactory.getLogger(XMLDemo01.class);
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("day09_mysql\\src\\xml\\demo1.xml"));
Element rootElement = document.getRootElement();
List<Element> studentElements = rootElement.elements("student");
LOGGER.info("studentElements"+"执行了");
//
for (Element studentElement : studentElements) {
Attribute idAttribute = studentElement.attribute("id");
String id = idAttribute.getValue();
Element nameElement = studentElement.element("name");
String text = nameElement.getText();
System.out.println(text);
Element ageElment = studentElement.element("age");
String age = ageElment.getText();
}
}
}
2.3 DTD约束
2.3.1 编写DTD约束
- 步骤
1. 创建一个文件,这个文件的后缀名为.dtd
2. 看xml文件中使用了哪些元素
<!ELEMENT> 可以定义元素
3. 判断元素是简单元素还是复杂元素
简单元素:没有子元素。
复杂元素:有子元素的元素;
2.3.2 引入DTD约束
引入本地DTD约束
// 这是persondtd.dtd文件中的内容,已经提前写好
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
// 在person1.xml文件中引入persondtd.dtd约束
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons SYSTEM 'persondtd.dtd'>
<persons>
<person>
<name>张三</name>
<age>23</age>
</person>
</persons>
在xml文件内部引入
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons [
<!ELEMENT persons (person)>
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<persons>
<person>
<name>张三</name>
<age>23</age>
</person>
</persons>
引入网络dtd
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL">
<persons>
<person>
<name>张三</name>
<age>23</age>
</person>
</persons>
2.4 schema约束
schema和dtd的区别
- schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
- 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
- dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
- schema 语法更加的复杂
编写schema约束
1,创建一个文件,这个文件的后缀名为.xsd。
2,定义文档声明
3,schema文件的根标签为:
4,在中定义属性:
xmlns=http://www.w3.org/2001/XMLSchema
5,在中定义属性 :
targetNamespace =唯一的url地址,指定当前这个schema文件的名称空间。
6,在中定义属性 :
elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件。
7,通过element定义元素
8,判断当前元素是简单元素还是复杂元素
引入schema约束
1,在根标签上定义属性xmlns=“http://www.w3.org/2001/XMLSchema-instance”
2,通过xmlns引入约束文件的名称空间
3,给某一个xmlns属性添加一个标识,用于区分不同的名称空间
格式为: xmlns:标识=“名称空间地址” ,标识可以是任意的,但是一般取值都是xsi
4,通过xsi:schemaLocation指定名称空间所对应的约束文件路径
格式为:xsi:schemaLocation = "名称空间url 文件路径“
<?xml version="1.0" encoding="UTF-8" ?>
<persons
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itheima.cn/javase"
xsi:schemaLocation="http://www.itheima.cn/javase person.xsd"
>
<person>
<name>张三</name>
<age>23</age>
</person>
</persons>
2、JUnit
2.1 概述
JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具
2.2 特点
JUnit是一个开放源代码的测试工具。
提供注解来识别测试方法。
JUnit测试可以让你编写代码更快,并能提高质量。
JUnit优雅简洁。没那么复杂,花费时间较少。
JUnit在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色。
2.3 使用步骤
1. 将junit的jar包导入到工程中 junit-4.9.jar
2. 编写测试方法该测试方法必须是公共的无参数无返回值的非静态方法
3. 在测试方法上使用@Test注解标注该方法是一个测试方法
4. 选中测试方法右键通过junit运行该方法
public class JunitDemo1 {
@Test
public void add() {
System.out.println(2 / 0);
int a = 10;
int b = 20;
int sum = a + b;
System.out.println(sum);
}
}
2.4 相关注解
注解 | 含义 |
---|---|
@test | 表示测试该方法 |
@Before | 在测试的方法前运行 |
@After | 在测试的方法后运行 |
3、 log4
3.1 概述
程序中的日志可以用来记录程序在运行的时候点点滴滴。并可以进行永久存储
-
Log4J
Log4j是Apache的一个开源项目。
通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件等位置。
我们也可以控制每一条日志的输出格式。
通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
-
Apache基金会
Apache软件基金会(也就是Apache Software Foundation,简称为ASF),为支持开源软件项目而办的一个非盈利性组织。
3.2 日志日志与输出语句的区别
输出语句 | 日志技术 | |
---|---|---|
取消日志 | 需要修改代码,灵活性比较差 | 不需要修改代码,灵活性比较好 |
输出位置 | 只能是控制台 | 可以将日志信息写入到文件或者数据库中 |
多线程 | 和业务代码处于一个线程中 | 多线程方式记录日志,不影响业务代码的性能 |
3.3 日志体系结构和Log4j
3.4 使用步骤
- 导入相关的依赖
- 将资料中的properties配置文件复制到src目录下
- 在代码中获取日志的对象
- 按照级别设置记录日志信息
3.5 配置文件详解
3.5.1 配置文件
log4j.rootLogger=debug,my,fileAppender
### direct log messages to my ###
log4j.appender.my=org.apache.log4j.ConsoleAppender
log4j.appender.my.ImmediateFlush = true
log4j.appender.my.Target=System.out
log4j.appender.my.layout=org.apache.log4j.PatternLayout
log4j.appender.my.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n
# fileAppender演示
log4j.appender.fileAppender=org.apache.log4j.FileAppender
log4j.appender.fileAppender.ImmediateFlush = true
log4j.appender.fileAppender.Append=true
log4j.appender.fileAppender.File=D:/log4j-log.log
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.fileAppender.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n
3.5.2 三个核心
- Loggers(日志记录器) 日志的级别
Loggers组件在此系统中常见的五个级别:DEBUG、INFO、WARN、ERROR 和 FATAL。
【每个Logger都被了一个日志级别(log level),用来控制日志信息的输出。日志级别从高到低分别为】
fatal 指出每个严重的错误事件将会导致应用程序的退出。
error 指出虽然发生错误事件,但仍然不影响系统的继续运行。
warn 表明会出现潜在的错误情形。
info 一般和在粗粒度级别上,强调应用程序的运行全程。
debug 一般用于细粒度级别上,对调试应用程序非常有帮助。
trace 是程序追踪,可以用于输出程序运行中的变量,显示执行的流程。
【还有两个特殊的级别】
OFF,可用来关闭日志记录。
ALL,启用所有消息的日志记录。
Log4j有一个规则:只输出级别不低于设定级别的日志信息。
- Appenders(输出端) 日志要输出的地方
把日志输出到不同的地方,如控制台(Console)、文件(Files)等。
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
- Layouts(日志格式化器)
可以根据自己的喜好规定日志输出的格式
常用的布局管理器:
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息
- patternLayout的选项
3.4 Appender的输出
3.4.1 按文件大小拆分
#指定日志的输出级别与输出端
log4j.rootLogger=INFO,rollingFile
#3、按照文件大小拆分的 appender
#日志文件输出的 appender
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
#指定消息格式layout,使用简单格式SimpleLayout ,HTML格式HTMLLayout,xml格式xml.XMLLayout
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
#指定消息格式的内容
#log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
log4j.appender.rollingFile.layout.conversionPattern =[%p] %r %l %d{yyyy-MM-dd- HH:mm:ss:SSS} %m%n
#指定日志文件的保存路径
log4j.appender.rollingFile.file = E:/code/maven/log4j_demo/logs/log4j.log
#指定日志文件的字符集
log4j.appender.rollingFile.encoding = UTF-8
#指定日志文件内容的大小
log4j.appender.rollingFile.maxFileSize = 1MB
#指定日志文件的数量【默认是一个】 超过10个,按照时间覆盖
log4j.appender.rollingFile.maxBackupIndex = 10
3.4.2 按时间拆分
#指定日志的输出级别与输出端
log4j.rootLogger=INFO.dailyFile
#日志文件输出的 appender
log4j.appender.dailyFile = org.apache.log4j.DailyRollingFileAppender
#指定消息格式layout,使用简单格式SimpleLayout ,HTML格式HTMLLayout,xml格式xml.XMLLayout
log4j.appender.dailyFile.layout = org.apache.log4j.PatternLayout
#指定消息格式的内容
#log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n
log4j.appender.dailyFile.layout.conversionPattern =[%p] %r %l %d{yyyy-MM-dd- HH:mm:ss:SSS} %m%n
#指定日志文件的保存路径
log4j.appender.dailyFile.file = E:/code/maven/log4j_demo/logs/log4j.log
#指定日志文件的字符集
log4j.appender.dailyFile.encoding = UTF-8
#指定日期拆分规则 默认【'.'yyyy-MM-dd】
log4j.appender.dailyFile.datePattern = '.'yyyy-MM-dd-HH-mm-ss
3.5 log4j的使用
public class XMLDemo01 {
private static final Logger LOGGER = LoggerFactory.getLogger(XMLDemo01.class);
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new File("day09_mysql\\src\\xml\\demo1.xml"));
Element rootElement = document.getRootElement();
List<Element> studentElements = rootElement.elements("student");
LOGGER.info("studentElements"+"执行了");
for (Element studentElement : studentElements) {
Attribute idAttribute = studentElement.attribute("id");
String id = idAttribute.getValue();
Element nameElement = studentElement.element("name");
String text = nameElement.getText();
System.out.println(text);
Element ageElment = studentElement.element("age");
String age = ageElment.getText();
}
}
}