一、XML

1 什么是XML

XML全称为Extensible Markup Language,意思是可扩展的标记语言。XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的

2、应用常见

<1>配置文件

32fdce3af8d729e60c445bfcf41ccce7.jpg

<2>存放数据

81169d7e52bb0f65074af825cfaa16ed.jpg

3、XML语法

<1>XML文档声明

19c29484c754bfbfd172aee04f6309f4.jpg

①文档声明必须为<?xml开头,以?>结束;

②文档声明必须从文档的0行0列位置开始

③文档声明只有三个属性

    a)version:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0

    b)encoding:指定当前文档度的编码。可选属性,默认值是utf-8

<2>元素element

2aecdc35c625f7222c2521c84e5c91a2.jpg

①元素是XML文档中最重要的组成部分

②普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

③元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a></b>

④空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合,例如:<c/>

⑤元素命令:

    a)区分大小写

    b)不能使用空格,不能使用冒号;

    c)不建议以XML、xml、Xml开头

⑥格式化良好的XML文档,必须只有一个根元素

<3>属性

a999f9c6b9301f5bb999037b9a1ec70b.jpg

①属性是元素的一部分,它必须出现在元素的开始标签中

②属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引

③一个元素可以有0~N个属性,但一个元素中不能出现同名属性

④属性名不能使用空格、冒号等特殊字符,且必须以字母开头

<4>注释

XML的注释与HTML相同,即以“<!--”开始,以“-->”结束。注释内容会被XML解析器忽略

<5>转义字符

XML中的转义字符与HTML一样

因为很多符号已经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:“<”、“>”、“&”

2a4664f4c263f8bb3928495664d2a9fa.jpg

<6>CDATA区

4d9f85ec8dbc984ff2b35e89042aeb53.jpg

当大量的转义字符出现在xml文件中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些

在CDATA段中出现的“<”、“>”、“&”,都无需使用转义字符,这可以提高xml文档的可读性

在CDATA段中不能包含“]]>”,即CDATA段的结束定界符


4、DTD约束

常见的xml约束:DTD、Schema

<1>什么是DTD

DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等

<2>DTD重点

开发中,我们很少自己编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2、hibernate等

通过提供的DTD“web-app_2_3.dtd”编写XML

5b5c43a072b6bbe5f180ff44c7714e3d.jpg

<3>案列实现

①步骤1:创建web.xml,并将“web-app_2_3.dtd”拷贝相同目录下

    3dc4d5f5ded09e61bf0a631965336271.jpg

②步骤2:从DTD文档开始处,拷贝需要的“文档声明”

    36258b1f42f3685bdf326c2a340d1f76.jpg

③步骤3:完成xml内容编写

89d9b48beb2183729b3405ec7e8ce5d9.jpg

1bdacb637a34e37756a9c74a276947c6.jpg

<4>DTD语法

①文档申明

内部DTD,在XML文档内部嵌入DTD,只对当前XML有效

75121c36af06c37d8a82bfc4ee0de109.jpg

外部DTD-本地DTD,DTD文档在本地系统上,公司内部自己项目使用

6be55c214a6333736ff68f1832a5f0e9.jpg

外部DTD-公共DTD,DTD文档在网络上,一般都有框架提供

1ccb02503545ee8717d6d005fac6e3ba.jpg

②元素声明

6f01de98e167a7ffc7044d9004b925db.jpg

实例

283c6de01568d3db00bdaaaf9c31af37.jpg

③属性声明

63ed536e8771288295c44dab395f824b.jpg

e54d49b328d1ee53e1100d0a2adf1320.jpg

实例

3664b60ca269a796a008ae9de8bb7037.jpg

5、Schema约束

<1>什么是Schema

Schema是新的XML文档约束

Schema要比DTD强大很多,是DTD替代者

Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml

Schema功能更强大,数据类型更完善

Schema支持名称空间

<2>Schema重点要求

与DTD一样,要求可以通过Schema约束文档编写xml文档。常见框架使用Schema的有:Spring等

通过提供“web-app_2_5.xsd”编写xml文档

63cb7303351a9d8da859fa13d0819b5d.jpg

f569d4774f35680e01148cda636212e2.jpg

c3efcf2705688b15bac3bfe896faef3f.jpg

3f3f16a6a1fdfe21a4772dc6784a7a5e.jpg

案例文档中同一个“命令空间”分别使用“默认命令空间”和“显示命令空间”进行引入,所以文档中<schema>和<xsd:schema>作用一样

c7ba19f6308a0bde0cbb3bf812b375b7.jpg

<3>案例实现

①步骤1:创建web.xml,并将“web-app_2_5.xsd”拷贝到同级目录

    83e12103b47cf2a01febef0b0bca82a1.jpg

②步骤2:从xsd文档中拷贝需要的“命令空间”

7242602c238d2b7855035369baf87627.jpg

③完成xml内容编写

5e87cb320934cc135bd47bd16d07b234.jpg

d3c6b6b7df42066629871e1d6cf50b6e.jpg

<4>命令空间(语法)

①什么是命令空间

如果一个XML文档中使用多个Schema文件,而这些Schema文件定义了相同名称的元素时就会出现名字冲突,这就像一个java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪个包下的Date了

名称空间就是用来处理元素和属性的名称冲突问题,与java中的包是同一用途。如果每个元素和属性都有自己的名称空间,那么就不会出现名字冲突问题,就像是每个类都有自己所在的包一样,那么类名就不会出现冲突

②约束文档和XML关系

当W3C提出Schema约束规范时,就提供“官方约束文档”。我们通过官方文档,必须“自定义schema约束文档”,开发中“自定义文档”由框架编写者提供,我们提供“自定义文档”限定,编写出自己的xml文档

aa9f72e09d1eb65ed76e06a5d245f5a0.jpg

③声明命令空间

bc3a47a7e4d26023d0cb5b609cd57e32.jpg

实例:web-app_2_5.xsd

5d490ea9ba8212e17eaee177ecb56e0d.jpg

实例:web.xml

c4459feff05c9b21bb33fd6c502640f4.jpg

④其他介绍

自定义约束:web-app_2_5.xsd

cb12299b76af5b6e8147145e10848489.jpg

xml文档:web.xml

9f571c2ceabcdf39ae8593636ac14d22.jpg

综合案例:

ebf3b7d380e67c7e05d01a5a4fec4f61.jpg

综合案例目的是:一个“命令空间”必须在schemaLocation中有一个成对描述信息(名称 路径)

4a9b17e532597fc47a87fdb2774fc937.jpg

6、dom4j解析

<1>XML解析概述

当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用java基础所学习的IO知识是可以完成的,不过需要非常繁琐的操作才可以完成,且开发中会遇到不同的问题(只读、读写)。人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML

<2>解析方式和解析器

①开发中比较常见的解析方式有三种,如下

Ⅰ、DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象

    a)优点:元素与元素之间保留结构关系,故可以进行增删改查操作

    b)缺点:XML文档过大,可能出现内存溢出现象

Ⅱ、SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式     进行具体解析,每执行一行,都将触发对应的事件

    a)优点:处理速度快,可以处理大文件

    b)缺点:只能读,逐行后将释放资源

Ⅲ、PULL:Android内置的XML解析方式,类似SAX

②解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包

7ff9f80d8090c4a165792f7df2de73fc.jpg

③常见的解析开发包:

a)JAXP:sun公司提供支持DOM和SAX开发包

b)JDom:dom4j兄弟

c)jsoup:一种处理HTML特定解析开发包

d)dom4j:比较常用的解析开发包,hibernate底层采用

<3>DOM解析原理及结构模型

XML DOM和HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作

21971ef227882e0537fb61b04b3c9320.jpg

be9ce977a09d1f723ac069e0c7e4100e.jpg

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点

660d00157fe91e0553dc3ec4be424669.jpg

<4>API使用

如果需要使用dom4j,必须导入jar包

1df4d143fd9a95ca0e026278090fa230.jpg

dom4j必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了

常用API如下:

①SaxReader对象

  a)read(...)加载执行xml文档

②Document对象

  a)getRootElement()获得根元素

③Element对象

  a) elements(...) 获得指定名称的所有子元素。可以不指定名称

  b) element(...) 获得指定名称第一个子元素。可以不指定名称

  c) getName() 获得当前元素的元素名

  d) attributeValue(...) 获得指定属性名的属性值

  e) elementText(...) 获得指定名称子元素的文本值

  f) getText() 获得当前元素的文本内容

6fb579ac77bec732a762022568ea0e65.jpg

9d9193388babbb107f3386987bc03c9c.jpg

二、反射

1、什么是反射

<1>JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一   个对象,都能够调用它的任意一个方法和属性

<2>使用反射,可以在运行时对类Class、构造方法Constructor、普通方法Method、字段Field进行操作

2、Class对象

<1>Class对象,是对class文件(字节码文件)的描述对象

<2>获得Class对象

    ①已知类的完整路径名(字符串):Class.forName(...)

    ②已知类型:String.class,确定参数列表

    ③已知对象:obj.getClass()

<3>常用方法

    ①使用默认构造方法创建实例:newInstance()

3、Constructor对象

<1>Constructor对象,是构造方法的描述对象

<2>获得构造方法

    ①公共的构造方法:Constructor<T> getConstructor(Class<?>...parameterTypes),可变参数用       于确定形式参数列表

    ②已经声明的构造方法:

        Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes),获得私有的构造

<3>实例化对象实例

    ①newInstance(Object...initargs),可变参数用于确定实际参数列表

4、Method对象

<1>Method对象,是普通方法的描述对象

<2>获得方法:

    ①获得公共方法:Method getMethod(String name,Class<?>...parameterTypes)通过方法name获得       方法,可变参数为方法的形参参数列表

    ②获得声明方法:Method getDeclaredMethod(String name,Class<?>...parameterType)方法操         作;

<3>执行指定方法:

    ①Object invoke(Object obj,Object...args)执行指定对象obj,指定方法,可变参数为方法的实       际参数列表

5、Field对象

<1>Field对象,是字段的描述对象

<2>获得方法

    ①所有字段:Field getField(String name),通过字段名称

    ②声明字段:Field getDeclaredField(String name)

<3>操作

    ①获得内容:Object get(Object obj)

    ②设置内容:void set(Object obj,Object value),确定实例对象

5、案例实现

<1>准备工作

为了模拟服务器程序,且可以同时存在多个类似程序。故提供接口,接口中有3个方法,我们人为约定三个方法的调用顺序

29c8e9fb84c243af70877d87968d0a15.jpg

再为接口编写实现类

378e88ef21fc669a6f11dee2c8f0e50d.jpg

8c1ce7a64ab599364382774c895cefdd.jpg

34687735081ea1f362df98975d3e85da.jpg

测试,创建实现类实例对象

3f11dbd5582101bb0bd9cb4a9f3d12e7.jpg

<2>反射执行

测试程序我们直接new HelloServlet,这种编程方式我们称为硬编码,即代码写死了。为了后期程序的可扩展,开发中通常使用实现类的全限定类名(cn.itcast.e_web.HelloMyServlet),通过反射加载字符串指定的类,并通过反射创建实例

c1f5743f531d62c9ea0977dc0968334a.jpg

b0ab2f8fe7a53b179aab619ab80ebcf3.jpg

<3>解析xml

使用反射我们已经可以创建对象的实例,此时我们使用的全限定类名,但程序是仍写死了,我们将其配置到xml文档中。

xml文档内容

6718cb1f0f120899e7d0739ddf2221b0.jpg

解析实现

c4f02c3300fc19dcc48b30182efc27b9.jpg

08c7481ee41c781f9f0e5f19cf839a70.jpg

<4>模拟浏览器路径

上面我们已经解析xml,不过我们获得内容是固定的。我们希望如果用户访问的路径是/hello,将执行cn.itcast_web.HelloMyServlet程序,如果访问是/hello2,将执行cn.itcast.e_web.HelloMyServlet2程序。

在执行测试程序前(@Before),解析xml文件,将解析的结果存放在Map中,map中数据的格式为:

路径=实现类

1f0399ed66ec1b166f8c1819cb6e4e43.jpg

解析xml思路:先解析<servlet>,将结果存放map,name=class,然后再解析<servlet-mapping>

通过name获得class,再将url=class存放到map,最后将name=class移除

5b7043784ad8a94b0f7612d148486072.jpg

250defbe7b61627b0aa9011667f631ed.jpg

模拟浏览器请求路径,通过url从map获得class,并使用反射执行实现类

d6220253e84623df7529da045410661b.jpg

f9f7b97960b5cc612103cd5d371f483a.jpg