xml
XML是作为配置文件存在的可扩展标记语言
可扩展:标签完全由用户自定义
标记语言:xml由标签以及属性组成
标签分类:
围堵标签:由开始标签和结束标签组成:
格式<student> </student>
自闭和标签:不是成对出现的
<student/>
注意:标签中可以定义属性,值必须由引号引起来, 单双都可以
<student id="xxx001"/>
语法:
1.xml的文档声明必须在第一行第一列
2.xml文档有且只能有一个跟标签
3.编写注释
<!-- 注释内容 -->
4.CDATA区:用来处理大量特殊的字符
<![CDATA[ 转义的内容 ]]>
XML解析:DOM4J 步骤
1.导入dom4j的jar包
2.创建核心对象SaxReader saxReader = new SaxReader()
3.使用核心对象的Document read(参数): 作用, 将硬盘上的xml文件读到内存中, 返回Document ;(参数可以是File对象或流)
4.使用Document的功能Element getRootElement();
5.解析Element
-
获取属性:String attributeValue(“属性的键”)
-
获取标签体:String getText()
-
获取子标签
-
获取单个的
Element element();//如果真的有多个, 默认返回第一个
Element element(String 标签名);
//根据标签名获取单个标签, 如果有多个, 默认返回第一个
- 获取多个的
List elements();//获取所有的子标签,不包含后代标签
List elements(String 标签名);
//根据标签名获取满足的所有的子标签, 不包含后代标签
标签的约束
DTD:
缺点:
1.不能对文本进行更细节的控制, 比如, age只能约束是文本数据,不能约束其只能是数字
2. 一个xml文件只能引入dtd, 不能引用多个dtd, 没有办法区分多个dtd中相同的元素!
Schema:可以完美解决DTD约束的弊端,但是编写相对复杂
//编写约束
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.这是一个约束文档.com"
elementFormDefault="qualified">
<element name="users">
<complexType>
<sequence maxOccurs="unbounded">
<element name="user">
<complexType>
<sequence >
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
<attribute name="id" type="string" use="optional"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
//引入约束
<?xml version="1.0" encoding="UTF-8" ?>
<users
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.meijunjian.com"
xsi:schemaLocation="http://www.这是一个被约束文档.xsd"
>
<user>
<name>aaa</name>
<age>10</age>
</user>
</users>
enum:枚举
作用: 用来表示固定几个值, 这些值由于是对象, 不能进行基本的算数运算, 比较安全
原理: 枚举本身就是多例, 保证一个类只有某几个对象
使用场景: 一般在注解中使用, 表示固定几个选项, 其他地方基本用不到
定义格式:
public enum 枚举名 {
枚举项1, 枚举项2 ....;
}
特点:
- 枚举中如果不给定构造, 维护的是一个私有的空参构造
- .枚举中只能定义私有的构造函数
- 枚举项必须放在第一行有效语句
- 枚举中本质上就是一个类, 类中可以定义的内容, 枚举中都可以定义, 但是枚举一般只会定义几个枚举项, 表示固定几个值, 主要不让这几个固定值做运算!
单例设计模式:引入扩展内容
作用: 保证一个类有且只能创建一个对象
使用场景: 可以用来共享数据
实现方式:
方式1 : 程序员式:
1.私有化构造
2.维护一个public final static 本类对象
3.通过类名.对象名
public class Person {
//私有化构造函数!!!!!
private Person(){}
//必须在本类中想办法调用构造造一个对象
public final static Person person = new Person();
}
方式2: 饿汉式
1.私有化构造
2.维护一个private static 本类对象
3.提供一个public 静态的方法返回本类对象
4. 类名.静态方法获取本类对象
public class Person1 {
//私有化构造函数!!!!!
private Person1(){}
//必须在本类中想办法调用构造造一个对象
private static Person1 person = new Person1();
//提供一个公共静态的方法返回该对象
public static Person1 getInstance(){
return person;
}
}
方式3: 懒汉式(延时加载):
1.私有化构造
2.维护一个private static 本类引用
3.提供一个public 静态的方法返回本类对象,方法体中判断对象是为null, 如果为null创建对象
4. 类名.静态方法获取本类对象
注意: 多线程访问可能出现线程安全问题,可以给方法加锁来解决
public class Person2 {
//私有化构造函数!!!!!
private Person2() {
}
//必须在本类中想办法调用构造造一个引用
private static Person2 person;
//提供一个公共静态的方法返回该对象
public synchronized static Person2 getInstance() {
if (person == null) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
person = new Person2();
}
return person;
}
}
注解:annotation
注解本质上是一个接口, 而且JDK1.5出现的, 1.5的时候最重要是定义抽象方法
格式
public @interface 注解名{
}
注解也可以定义抽象方法
public abstract 返回值类型 方法名() default 默认值;
返回类型必须是以下类型:
- 基本类型
- String
- 字节码类型
- 枚举类型
- 注解类型
- 以上类型的一维数组
使用注解:@注解名(要对注解中所有的抽象方法进行重写)
- 重写的格式: 方法名 = 返回值
- 当方法名是value的时候, 而且仅仅只对value赋值的时候, value可以省略
- 如果我们的返回值类型是数组, 但是赋值的只有一个值的时候, { }也可以省略
作用:
1.编译检查(JDK帮我们已经做好!)
2.携带数据取代部分的xml文件, 来和框架进行对话的工具!
JDK提供了三大注解:
@Override 方法重写
@Deprected 提示方法已过时
@SusspressWaining("all") 压制警告
注解解析:
注解是属于字节码层面,注解加载什么地方, 就获取那个地方对象(Class, Filed, Method, Constructor)
这四个对象都有这两个方法可以判断注解和获取注解
isAnnotationPresent(Class 注解类型)//返回true/false
//因为一个对象可以放多个注解, 你要给人家指定判断注解的类型
getAnnotation(Class 注解类型)//返回接口对象
//因为一个对象可以放多个注解, 你要给人家指定要获取的注解的类型,但是获取出来的是注解的实现类, 接口的实现类!
元注解:修饰注解的注解
常用的元注解:
@Target 如果不写, 默认你的注解修饰能修饰的任何东西
- ElementType.METHOD:注解只能定义在方法上
- ElementType.TYPE:注解只能定义在类上
- ElementType.FIELD:注解只能定义在成员变量上
@Retention如果不写, 默认值是RetentionPolicy.SOURCE,只有在源码中生效
- RetentionPolicy.CLASS 代码能在源码中和字节码文件中都生效
- RetentionPolicy.RUNTIME 代码能在源码中, 字节码文件中, 以及加载到内存的字节码对象中都存在
- RetentionPolicy.SOURCE 代码只能在源码中
@Inherited标注该注解可以被子类继承
@Documented标注抽成API文档。