目录
1 xml 1.1 概述 1.2 标签的规则 1.3 语法规则 1.4 xml解析 1.5 DTD约束 1.6 schema约束
2 注解
3 单元测试 3.1 概述 3.2 特点 3.3 使用步骤 3.4 相关注解
1 xml
1.1 概述
万维网联盟(W3C) 官网:https://www.w3school.com.cn
万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆·伯纳斯·李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南,
如广为业界采用的超文本标记语言HTML(标准通用标记语言下的一个应用)、 可扩展标记语言XML(标准通用标记语言下的一个子集) 以及帮助残障人士有效获得Web信息的无障碍指南(WCAG)等 xml概述
XML的全称为(EXtensible Markup Language),是一种可扩展 的标记语言 标记语言: 通过标签来描述数据的一门语言(标签有时我们也将其称之为元素) 可扩展:标签的名字是可以自定义的 可以理解为: XML文件是由很多标签组成的,而标签名是可以自定义的 作用
作为配置文件的优势
1.2 标签的规则
< student>
< student> < / student>
* * 前边的是开始标签,后边的是结束标签* *
< address/ >
标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来
< student id= "1" > < / student>
这是正确的: < student id= "1" > < name> 张三< / name> < / student>
这是错误的: < student id= "1" > < name> 张三< / student> < / name>
1.3 语法规则
XML文件的后缀名为:xml 文档声明必须是第一行第一列
<?xml version=“1.0” encoding=“UTF-8” standalone=“yes”?>
version:该属性是必须存在 的 encoding:该属性不是必须 的
standalone: 该属性不是必须 的,描述XML文件是否依赖其他的xml文件,取值为yes/no 必须存在一个根标签,有且只能有一个 XML文件中可以定义注释信息 XML文件中可以存在以下特殊字符
& lt; < 小于
& gt; > 大于
& amp; & 和号
& apos; ' 单引号
& quot; " 引号
<?xml version="1.0" encoding="UTF-8" ?>
< students>
< student id = " 1" >
< name> 张三</ name>
< age> 23</ age>
< info> 学生< > > > > > > > > > > > 的信息</ info>
< message> <![CDATA[内容 <<<<<< >>>>>> ]]]> </ message>
</ student>
< student id = " 2" >
< name> 李四</ name>
< age> 24</ age>
</ student>
</ students>
1.4 xml解析
概述
常见的解析思想
DOM(Document Object Model)文档对象模型
会把xml文件全部加载到内存
常见的解析工具
JAXP: SUN公司提供的一套XML的解析的API JDOM: 开源组织提供了一套XML的解析的API-jdom DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java
官网:https://dom4j.github.io/ pull: 主要应用在Android手机端解析XML 需求
解析xml文件 将解析到的数据封装到学生对象中 并将学生对象存储到ArrayList集合中 遍历集合
<?xml version="1.0" encoding="UTF-8" ?>
< students>
< student id = " 1" >
< name> 张三</ name>
< age> 23</ age>
< info> 学生< > > > > > > > > > > > 的信息</ info>
< message> <![CDATA[内容 <<<<<< >>>>>> ]]]> </ message>
</ student>
< student id = " 2" >
< name> 李四</ name>
< age> 24</ age>
</ student>
</ students>
public class Student {
private String id;
private String name;
private int age;
public Student ( ) {
}
public Student ( String id, String name, int age) {
this . id = id;
this . name = name;
this . age = age;
}
public String getId ( ) {
return id;
}
public void setId ( String id) {
this . id = id;
}
public String getName ( ) {
return name;
}
public void setName ( String name) {
this . name = name;
}
public int getAge ( ) {
return age;
}
public void setAge ( int age) {
this . age = age;
}
@Override
public String toString ( ) {
return "Student{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}' ;
}
}
import org. dom4j. Attribute ;
import org. dom4j. Document ;
import org. dom4j. DocumentException ;
import org. dom4j. Element ;
import org. dom4j. io. SAXReader ;
import java. io. File ;
import java. util. ArrayList ;
import java. util. List ;
public class XmlParse {
public static void main ( String [ ] args) throws DocumentException {
SAXReader saxReader = new SAXReader ( ) ;
Document document = saxReader. read ( new File ( "myxml\\xml\\student.xml" ) ) ;
Element rootElement = document. getRootElement ( ) ;
List < Element > studentElements = rootElement. elements ( "student" ) ;
ArrayList < Student > list = new ArrayList < > ( ) ;
for ( Element element : studentElements) {
Attribute attribute = element. attribute ( "id" ) ;
String id = attribute. getValue ( ) ;
Element nameElement = element. element ( "name" ) ;
String name = nameElement. getText ( ) ;
Element ageElement = element. element ( "age" ) ;
String age = ageElement. getText ( ) ;
Student s = new Student ( id, name, Integer . parseInt ( age) ) ;
list. add ( s) ;
}
for ( Student student : list) {
System . out. println ( student) ;
}
}
}
1.5 DTD约束
什么是约束
约束的分类
编写DTD约束
步骤
创建一个文件,这个文件的后缀名为.dtd 看xml文件中使用了哪些元素
判断元素是简单元素还是复杂元素
< !ELEMENT persons (person) >
< !ELEMENT person (name,age) >
< !ELEMENT name (#PCDATA) >
< !ELEMENT age (#PCDATA) >
引入DTD约束
引入DTD约束的三种方法
引入本地dtd
< ! DOCTYPE 根元素名称 SYSTEM ‘DTD文件的路径’> 在xml文件内部引入
< ! DOCTYPE 根元素名称 [ dtd文件内容 ]> 引入网络dtd
< ! DOCTYPE 根元素的名称 PUBLIC “DTD文件名称” “DTD文档的URL”> 代码实现
//这是persondtd.dtd文件中的内容
< !ELEMENT persons (person) >
< !ELEMENT person (name,age) >
< !ELEMENT name (#PCDATA) >
< !ELEMENT age (#PCDATA) >
//这是person.xml文件中的内容
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE persons SYSTEM 'persondtd.dtd' >
< persons>
< person>
< name> 张三</ name>
< age> 23</ age>
</ person>
</ persons>
<?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>
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE persons PUBLIC "dtd文件的名称" "dtd文档的URL" >
< persons>
< person>
< name> 张三</ name>
< age> 23</ age>
</ person>
</ persons>
DTD语法
定义元素
定义一个元素的格式为:<!ELEMENT 元素名 元素类型>
简单元素:
EMPTY: 表示标签体为空 ANY: 表示标签体可以为空也可以不为空 PCDATA: 表示该元素的内容部分为字符串 复杂元素:
直接写子元素名称. 多个子元素可以使用",“或者”|"隔开; ","表示定义子元素的顺序 ; “|”: 表示子元素只能出现任意一个 "?"零次或一次, "+"一次或多次, "*"零次或多次;如果不写则表示出现一次
定义属性
格式
定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的约束:
#REQUIRED: 必须的 #IMPLIED: 属性不是必需的 #FIXED value:属性值是固定的
< !ELEMENT persons (person+) >
< !ELEMENT person (name,age) >
< !ELEMENT name (#PCDATA) >
< !ELEMENT age (#PCDATA) >
< !ATTLIST person id CDATA #REQUIRED >
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE persons SYSTEM 'persondtd.dtd' >
< persons>
< person id = " 001" >
< name> 张三</ name>
< age> 23</ age>
</ person>
< person id = " 002" >
< name> 张三</ name>
< age> 23</ age>
</ person>
</ persons>
1.6 schema约束
schema和dtd的区别
schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd 一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名) dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型 schema 语法更加的复杂
编写schema约束
步骤
创建一个文件,这个文件的后缀名为.xsd。 定义文档声明 schema文件的根标签为: < schema > 在< schema >中定义属性:
xmlns=http://www.w3.org/2001/XMLSchema 在< schema >中定义属性 :
targetNamespace =唯一的url地址,指定当前这个schema文件的名称空间。 在< schema >中定义属性 :
elementFormDefault="qualified“,表示当前schema文件是一个质量良好的文件。 通过element定义元素 判断当前元素是简单元素还是复杂元素
<?xml version="1.0" encoding="UTF-8" ?>
< schema
xmlns = " http://www.w3.org/2001/XMLSchema"
targetNamespace = " http://www.itheima.cn/javase"
elementFormDefault = " qualified"
>
< element name = " persons" >
< complexType>
< sequence>
< element name = " person" >
< complexType>
< sequence>
< element name = " name" type = " string" > </ element>
< element name = " age" type = " string" > </ element>
</ sequence>
</ complexType>
</ element>
</ sequence>
</ complexType>
</ element>
</ schema>
引入schema约束
步骤
在根标签上定义属性
xmlns=“http://www.w3.org/2001/XMLSchema-instance” 通过xmlns引入约束文件的名称空间 给某一个xmlns属性添加一个标识,用于区分不同的名称空间
通过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>
<?xml version="1.0" encoding="UTF-8" ?>
< schema
xmlns = " http://www.w3.org/2001/XMLSchema"
targetNamespace = " http://www.itheima.cn/javase"
elementFormDefault = " qualified"
>
< element name = " persons" >
< complexType>
< sequence>
< element name = " person" >
< complexType>
< sequence>
< element name = " name" type = " string" > </ element>
< element name = " age" type = " string" > </ element>
</ sequence>
< attribute name = " id" type = " string" use = " required" > </ attribute>
</ complexType>
</ element>
</ sequence>
</ complexType>
</ element>
</ schema>
<?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 id = " 001" >
< name> 张三</ name>
< age> 23</ age>
</ person>
</ persons>
2 注解
2.1 概述
注解名 说明 @Override 描述子类重写父类的方法 @Deprecated 描述方法过时 @SuppressWarnings 压制警告
public class Fu {
public void show ( ) {
System . out. println ( "父类的方法" ) ;
}
}
@SuppressWarnings ( value = "all" )
public class Zi extends Fu {
@Override
public void show ( ) {
System . out. println ( "子类的方法" ) ;
}
@Deprecated
public void method ( ) {
System . out. println ( "method......." ) ;
}
public void function2 ( ) {
int a = 10 ;
}
@SuppressWarnings ( value = "all" )
public void function ( ) {
int a = 10 ;
int b = 20 ;
}
}
2.2 自定义注解
public @interface 注解名称 {
public 属性类型 属性名( ) default 默认值 ;
}
public @interface Test {
public inta ( ) default 23 ;
}
属性类型
注意
如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
public @interface Anno1 {
int a ( ) default 23 ;
public String name ( ) default "itheima" ;
public Class clazz ( ) default Anno2 . class ;
public Anno2 anno ( ) default @Anno2 ;
public Season season ( ) default Season . SPRING;
public int [ ] arr ( ) default { 1 , 2 , 3 , 4 , 5 } ;
public Season [ ] seasons ( ) default { Season . SPRING, Season . SUMMER} ;
public String value ( ) ;
}
public @interface Anno2 {
}
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
@Anno1 ( "abc" )
public class AnnoDemo {
}
自定义注解案例
需求
自定义一个注解@Test,用于指定类的方法上,如果某一个类的方法上使用了该注解,就执行该方法 实现步骤
自定义一个注解Test,并在类中的某几个方法上加上注解 在测试类中,获取注解所在的类的Class对象 获取类中所有的方法对象 遍历每一个方法对象,判断是否有对应的注解
import java. lang. annotation. Retention ;
import java. lang. annotation. RetentionPolicy ;
@Retention ( value = RetentionPolicy . RUNTIME)
public @interface Test {
}
public class UseTest {
public void show ( ) {
System . out. println ( "UseTest....show...." ) ;
}
@Test
public void method ( ) {
System . out. println ( "UseTest....method...." ) ;
}
@Test
public void function ( ) {
System . out. println ( "UseTest....function...." ) ;
}
}
import java. lang. reflect. InvocationTargetException ;
import java. lang. reflect. Method ;
public class AnnoDemo {
public static void main ( String [ ] args) throws ClassNotFoundException , IllegalAccessException , InstantiationException , InvocationTargetException {
Class clazz = Class . forName ( "com.itheima.myanno3.UseTest" ) ;
UseTest useTest = ( UseTest ) clazz. newInstance ( ) ;
Method [ ] methods = clazz. getDeclaredMethods ( ) ;
for ( Method method : methods) {
if ( method. isAnnotationPresent ( Test . class ) ) {
method. invoke ( useTest) ;
}
}
}
}
2.3 元注解
元注解名 说明 @Target 指定了注解能在哪里使用 @Retention 可以理解为保留时间(生命周期) @Inherited 表示修饰的自定义注解可以被子类继承 @Documented 表示该自定义注解,会出现在API文档里面。
import java. lang. annotation. * ;
@Target ( { ElementType . FIELD, ElementType . TYPE, ElementType . METHOD} )
@Retention ( RetentionPolicy . RUNTIME)
public @interface Anno {
}
@Anno
public class Person {
}
public class Student extends Person {
public void show ( ) {
System . out. println ( "student.......show.........." ) ;
}
}
public class StudentDemo {
public static void main ( String [ ] args) throws ClassNotFoundException {
Class clazz1 = Class . forName ( "com.itheima.myanno4.Person" ) ;
Class clazz2 = Class . forName ( "com.itheima.myanno4.Student" ) ;
boolean result1 = clazz1. isAnnotationPresent ( Anno . class ) ;
boolean result2 = clazz2. isAnnotationPresent ( Anno . class ) ;
System . out. println ( result1) ;
System . out. println ( result2) ;
}
}
3 单元测试
3.1 概述
JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具
3.2 特点
JUnit是一个开放源代码的测试工具。 提供注解来识别测试方法。 JUnit测试可以让你编写代码更快,并能提高质量。 JUnit优雅简洁。没那么复杂,花费时间较少。 JUnit在一个条中显示进度。如果运行良好则是绿色 ;如果运行失败则变成红色
3.3 使用步骤
使用步骤
将junit的jar包导入到工程中 编写测试方法该测试方法必须是公共的无参数无返回值的非静态方法 在测试方法上使用@Test 注解标注该方法是一个测试方法 选中测试方法右键通过junit运行该方法
import org. junit. Test ;
public class JunitDemo1 {
public static void main ( String [ ] args) {
}
@Test
public void add ( ) {
System . out. println ( 2 / 0 ) ;
int a = 10 ;
int b = 20 ;
int sum = a + b;
System . out. println ( sum) ;
}
}
3.4 相关注解
注解 含义 @Test 表示测试该方法 @Before 在测试的方法前运行 @After 在测试的方法后运行
import org. junit. After ;
import org. junit. Before ;
import org. junit. Test ;
public class JunitDemo2 {
@Before
public void before ( ) {
System . out. println ( "before" ) ;
}
@Test
public void test ( ) {
System . out. println ( "test" ) ;
}
@After
public void after ( ) {
System . out. println ( "after" ) ;
}
}