掌握内容
1,元注解的概念用法
2,注解属性值的注入
3,会写xml标签,能看懂xml约束
注解
注解概念:用来说明程序的,是给计算机看的
注释概念:用文字描述程序,给程序员看的,不需要被程序读取
注解定义:
annotation,也称为元数据,是一种代码级别的说明,是jdk1.5之后引入的一个新特性,和类、接口、枚举在同一个层次的
可以声明在包、类、字段、方法、局部变量、方法参数...的前 面,用来对这些元素进行说明,注释。
总结:
1,1.5之后的新特性
2,说明程序
3,使用注解 : @注解名称
作用分类
1,编写文档:通过代码里标识的元数据生成文档,生成一个 类的说明文档,类似于API文档 在桌面上新建个文件夹->里面编写一个java文件->保存 ANSI格式
public class AnnotationDemo {
/**
* 计算两个数的和
* @param a 整数
* @param b 整数
* @return 两个的数的和
*/
public int add(int a,int b){
return a+b;
}
}
在文件夹位置,打开cmd窗口,输入命令 : javadoc java 文件名
可以生成说明的文档
2,代码分析:通过代码里标识的元数据对代码进行分析(使用反 射)
3,编译检查:通过代码里标识的元数据,让编译器能够实现基本 的编译,比如@Override 注解,可以检查方法的重写是否正确
JDK中预定义的一些注解
1,@Override :检测被该注解标注的方法,是否继承自 父类 (接口)
2,@Deprecated:标注该内容已经过时了
3,@SuppressWarnings("all") 压制警告,一般传递参数all
自定义注解
看了注解的原码,分为两个部分
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
注解格式:
上面部分: 元注解
下面部分:注解名称,注解声明
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
public @interface MyAnnotation {
}
通过对注解的原码的反编译,得出,注解本质其实就是一个接口 接口中只能定义抽象方法,所以注解中也只能定义对应的内容 注解中可以定义的属性 :接口中定义的抽象方法,我们在注解 中,称为注解的属性 要求:
1,属性的返回值类型
- 基本数据类型
- String类型
- 枚举
- 注解
- 以上类型的数组
public @interface MyAnnotation {
//注解的属性
String show(); // 接口中称为show()方法,注解中称为show 属性
//void show1(); // 注解中不能定义返回值为空的属性
int show1();
Person person(); //定义枚举类型返回值
MyAnnotation2 annotation2();
String[] strs(); //返回值是字符串数组
}
注解的使用
枚举类
public enum Person {
P1,P2
}
注解
public @interface MyAnnotation {
//注解的属性
// int age();
// String name();
// //如果属性加了default,使用的时候可以不指定值
// String gender() default "男";
//int value();
//Person person();
String[] strs();
}
测试类
//@MyAnnotation(age = 20)
//@MyAnnotation(age = 20,name="张三",value = 100)
//@MyAnnotation(value = 100) //注解中只有一个value属性可以这么写
//@MyAnnotation(value = 100,person = Person.P1)
@MyAnnotation(strs = {"a","b"})
public class Student {
}
注解使用的特点:
1,在注解中定义了属性,使用注解的时候,需要给对应的属 性赋值,定义什么类型,赋值什么类型
2,如果定义属性的时候,使用了default关键字给属性默认 初始值了,可以不进行赋值,自动取默认值
3,如果只有一个属性需要赋值,且属性名是value,那么 value可以省略
4,数组赋值的时候,需要使用{}包裹起来,如果数组只有一 个值,{}可以省略
元注解:用来描述注解的注解
如:
@Target() 描述注解可以用在哪些位置
属性是:ElementType[] value();
使用的时候,需要取ElementType的值,ElementType 包含的值表示一些位置
TYPE:如果取值为type,表示这个注解只能用在类 上
FIELD:表示注解注解用在成员属性上
METHOD:表示注解用在成员方法上
CONSTRUCTOR:表示注解用在构造方法上
@Retention() 描述注解被保留的阶段
属性:RetentionPolicy value();
取值范围是 :RetentionPolicy的值,三个值,分别表
示阶段
SOURCE: 原码阶段
CLASS:字节码阶段
RUNTIME:运行阶段
@Documented() :描述注解是否被抽取到api文档中
@Inherited() :描述注解是否被子类继承
注解使用
使用注解,获取全类名、方法名,结合反射,调用不同类的不同 方法
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String className();
String methodName();
}
public class Person {
/*
Person类
*/
public void eat(){
System.out.println("eat-----");
}
}
public class Student {
public void study(){
System.out.println("study-----");
}
}
@MyAnnotation(className = "com.javaweb.zhujie.myannotation.Person",methodName = "eat")
public class ReflectName {
public static void main(String[] args) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, NoSuchMethodException {
//1、先获取类对象
Class<ReflectName> demo = ReflectName.class;
//通过类对象,可以获取到注解
MyAnnotation annotation = demo.getAnnotation(MyAnnotation.class);
//2、获取配置文件中的数据
String className = annotation.className();
String methodName = annotation.methodName();
//3、获取Class类对象
Class cls = Class.forName(className);
//4、创建对象
Object obj = cls.newInstance();
//5、通过Class类对象获取到方法
Method method = cls.getMethod(methodName);
//6、执行方法
method.invoke(obj);
}
}
XML
1,概念: Extensible Markup Language 可扩展标记语言 可扩展:标签是自定义的。 比如 HTML是预 先定义的
2,功能: 存储数据
1,配置文件使用
常用的配置文件:
properties 文件:
name=xxx
age=xxx
xml文件 :
<user>
<name> xxxx</name>
<age> xxx</age>
2,在网络中传输
3,xml与html的区别
1,xml标签都是自定义的,html标签是预定义的
2,xml语法严格,html语法松散,xml想写对很难,html想写错 很难
3,xml是存储数据的,html是展示数据的
4,语法
基本语法:
1,xml文档的后缀名是 .xml
2,xml第一行必须定义为文档声明
3,xml文档中有且仅有一个根标签
4,属性值必须使用引号(单双都可)引起来
5,标签必须正确关闭,双标签,可以定义自闭和标签
6,xml标签名称区分大小写 写一个users.xml
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>20</age>
<gender>nan</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>22</age>
<gender>nv</gender>
</user>
</users>
组成部分
1,文档声明
格式: <?xml version='1.0'?>
属性列表:
version:版本号,必须的属性
encoding:编码方式,告知解析引擎当前文档使用的字
符集,默认值:ISO-8859-1(格式要和文件格式相符才 能解析中文,idea中是可以实现自动更改)
standalone:是否独立
取值:
yes:不依赖其他文件
no:依赖于其他文件
2,指令(了解):结合css的
<?xml-stylesheet type = "text/css" href="a.css">
3,标签:标签名称是自定义的
规则 :
名称可以包含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字母 xml(或者 XML、Xml 等等)开始
名称不能包含空格
4,属性: id属性值唯一
5,文本
<code>
if(a>b && a<c){}这样直接就会报错
if(a>b&&a<c){}
</code>
cdata区:在该区域中的数据会被原样展示
<![CDATA[
if(a>b && a<c){}
]]
约束:规定xml文档的书写规则
作为框架的使用者:
1,能够在xml中引入约束文档
2,能够简单的读懂约束文档
分类:
dtd,schema
1,DTD:一种简单的约束技术
外部文件约束
student.dtd
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
student.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>zhangsan</name>
<age>22</age>
<sex>nan</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>23</age>
<sex>nv</sex>
</student>
</students>
2,将约束定义在内部
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE students [
<!ELEMENT students (student*)>
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
]>
<students>
<student number="s001">
<name>zhangsan</name>
<age>22</age>
<sex>nan</sex>
</student>
<student number="s002">
<name>lisi</name>
<age>23</age>
<sex>nv</sex>
</student>
</students>
2,schema:一种复杂的约束技术
student.xsd
<?xml version="1.0"?>
<!--xmlns:xsd="http://www.w3.org/2001/XMLSchema" 表示数据类型等定义来自w3-->
<!-- targetNamespace 表示文档中要定义的元素来自什么命名空间-->
<!-- xmlns="http://www.w3schools.com"表示此文档的默认命名空间是什么-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified"><!--表示要求xml文档的每一个元素都要有命名空间指定-->
<!--定义主体部分-->
<!-- 定义一个元素,名称是students,类型是自定义的studnetsType类型,所以下面要把studentType类型定义-->
<xsd:element name="students" type="studentsType"/>
<!--自定义类型studentType,和上面对应-->
<xsd:complexType name="studentsType">
<!-- sequence表示按顺序出现student元素,类型为自定义类型studentType,最少0最多不限次数-->
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--定义自定义复杂类型studentType-->
<xsd:complexType name="studentType">
<!--依次出现-->
<xsd:sequence>
<!--name元素 类型是string-->
<xsd:element name="name" type="xsd:string"/>
<!-- age元素,类型是自定义ageType类型-->
<xsd:element name="age" type="ageType"/>
<!-- sex元素,类型是自定义的sexType类型-->
<xsd:element name="sex" type="sexType"/>
</xsd:sequence>
<!-- number属性,类型是自定义numberType类型-->
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<!--简单类型ageType-->
<xsd:simpleType name="ageType">
<!--基本格式是integer-->
<xsd:restriction base="xsd:integer">
<!--最小值-->
<xsd:minInclusive value="0"/>
<!--最大值-->
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<!-- 自定义简单类型sexType-->
<xsd:simpleType name="sexType">
<!--基本格式是string-->
<xsd:restriction base="xsd:string">
<!--选值1-->
<xsd:enumeration value="man"/>
<!--选值2-->
<xsd:enumeration value="women"/>
</xsd:restriction>
</xsd:simpleType>
<!-- 自定义简单类型sexType-->
<xsd:simpleType name="numberType">
<!--基本格式是string-->
<xsd:restriction base="xsd:string">
<!--选值1-->
<xsd:pattern value="airui_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
1,填写xml文档的根元素
2,引入 xsi前缀,固定格式,w3c提供的约束文档 xmlns:xsi="http://www.w3.org/2001
3,引入xsd文件命名空间 xsi:schemaLocation="http://www.w3schools.com student
schemaLocation,表示文档路径,student.xsd称为命名空间 如果要使用,每次都需要加
4,为每一个xsd约束声明一个前缀,作为表示 xmlns:a="http://www.w3schools.com" 表
不写的话,表示忽略
如果被多个文档共同约束,有多个不同的命名空间
xsi:schemaLocation="http://www.w3schools.com1 student1.xsd"
xsi:schemaLocation="http://www.w3schools.com2 student2.xsd"
就需要写多个前缀
xmlns:a="http://www.w3schools.com"
xmlns:b="http://www.w3schools.com"
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com student.xsd"
xmlns="http://www.w3schools.com"
>
<student number="airui_1234">
<name>zhangsan</name>
<age>11</age>
<sex>man</sex>
</student>
</students>
解析:操作xml文档,将文件中的数据读取到内存中
操作xml文档
1,解析: 将文档中的数据读取到内存中
2,写入:将内存中的数据保存到xml文档中,持久化存储
解析xml的方式
1,DOM:将标记语言文档一次性加载进内存,在内存中形成一 颗dom树
优点:操作方便,可以对文档进行CRUD操作
缺点:比较消耗内存,文档1M可能有1000-10000倍
2,SAX:逐行读取,基于事件驱动是。
优点:不占内存,比如手机用的较多
缺点:只能读取,不能增删改
服务器端一般只用DOM方式,安卓等客户端使用的SAX JAVAEE主要是做服务器端开发,所以了解DOM思想
XML常见的解析器
1,JAXP:sun公司提供的解析器,支持dom和sax两种思想,性 能不好,用的少
2,DOM4J:一款非常优秀的解析器,基于DOM思想解析的dom4j是一个Java的XML API,是jdom的升级品,用来读写 XML文件的。dom4j是一个十分优秀的Java_百度百科 (baidu.com)XML API,具有 性能优异、功能强大和极其易使用的特点,它的性能超过sun公 司官方的dom技术,同时它也是一个开放源代码_百度百科 (baidu.com)的软件,可 以在SourceForge上找到它。在IBM developerWorks上面还可 以找到一篇文章,对主流的Java XML API进行的性能、功能和易 用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色 的。如今可以看到越来越多的Java软件都在使用dom4j来读写 XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经 是必须使用的jar包, Hibernate也用它来读写配置文件。
3,Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个 URL地址、HTML文本内容。它提供了一套非常省力的API,可通 过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。 4,PULL:Android操作系统内置的解析器,sax方式的
/*
读取xml文档信息
*/
public class XMLDemo01 {
public static void main(String[] args) throws DocumentException {
//创建Reader对象
SAXReader saxReader = new SAXReader();
//通过对象去读取文件
Document document = saxReader.read(new File("src/main/java/com/javaweb/zhujie/xml/student.xml"));
//通过document对象获取元素
Element rootElement = document.getRootElement();
System.out.println(rootElement);
//通过根节点去获取其他的子元素,返回节点的迭代器
Iterator iterator = rootElement.elementIterator();
//遍历
while (iterator.hasNext()){
Element element = (Element) iterator.next();
//获取节点的名称
System.out.println(element.getName());
//获取节点的属性
Attribute attribute = element.attribute("number");
//获取student接地点的子字节
Element name = element.element("name");
Element age = element.element("age");
Element sex = element.element("sex");
System.out.println(name.getText());
System.out.println(age.getText());
System.out.println(sex.getText());
}
}
}
写一个xml文档内容
/*
写一个xml文档信息
*/
public class XMLdEMO02 {
public static void main(String[] args) throws IOException {
writeXML(new File("src/main/java/com/javaweb/zhujie/xml/student1.xml"));
}
public static void writeXML(File file) throws IOException {
//创建document对象
Document document = DocumentHelper.createDocument();
//通过document对象,添加根节点
Element root = document.addElement("students");
//通过根节点,添加子节点
Element student = root.addElement("student");
//student节点再继续加属性,子节点
Element number = student.addAttribute("number", "tongda_1234");
//加name子节点
Element name = student.addElement("name");
Element age = student.addElement("age");
//给name、age节点加点内容
name.addText("张三");
age.addText("12");
//指定文档的写入格式
OutputFormat format = OutputFormat.createPrettyPrint();
//写入xml文件
XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
//将document节点传入writer对象
writer.write(document);
System.out.println("xml写入完成");
}
}