码迷,mamicode.com
首页 > 其他好文 > 详细

第三天:XML&反射

时间:2017-10-28 11:10:51      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:xml

一、XML

1 什么是XML

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

2、应用常见

<1>配置文件

技术分享

<2>存放数据

技术分享

3、XML语法

<1>XML文档声明

技术分享

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

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

③文档声明只有三个属性

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

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

<2>元素element

技术分享

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

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

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

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

⑤元素命令:

    a)区分大小写

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

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

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

<3>属性

技术分享

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

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

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

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

<4>注释

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

<5>转义字符

XML中的转义字符与HTML一样

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

技术分享

<6>CDATA区

技术分享

当大量的转义字符出现在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

技术分享

<3>案列实现

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

    技术分享

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

    技术分享

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

技术分享

技术分享

<4>DTD语法

①文档申明

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

技术分享

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

技术分享

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

技术分享

②元素声明

技术分享

实例

技术分享

③属性声明

技术分享

技术分享

实例

技术分享

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文档

技术分享

技术分享

技术分享

技术分享

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

技术分享

<3>案例实现

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

    技术分享

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

技术分享

③完成xml内容编写

技术分享

技术分享

<4>命令空间(语法)

①什么是命令空间

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

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

②约束文档和XML关系

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

技术分享

③声明命令空间

技术分享

实例:web-app_2_5.xsd

技术分享

实例:web.xml

技术分享

④其他介绍

自定义约束:web-app_2_5.xsd

技术分享

xml文档:web.xml

技术分享

综合案例:

技术分享

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

技术分享

6、dom4j解析

<1>XML解析概述

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

<2>解析方式和解析器

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

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

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

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

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

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

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

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

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

技术分享

③常见的解析开发包:

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进行操作

技术分享

技术分享

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

技术分享

<4>API使用

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

技术分享

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() 获得当前元素的文本内容

技术分享

技术分享

二、反射

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个方法,我们人为约定三个方法的调用顺序

技术分享

再为接口编写实现类

技术分享

技术分享

技术分享

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

技术分享

<2>反射执行

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

技术分享

技术分享

<3>解析xml

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

xml文档内容

技术分享

解析实现

技术分享

技术分享

<4>模拟浏览器路径

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

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

路径=实现类

技术分享

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

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

技术分享

技术分享

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

技术分享

技术分享


本文出自 “鹏哥的博客” 博客,谢绝转载!

第三天:XML&反射

标签:xml

原文地址:http://pengge666.blog.51cto.com/11766700/1976898

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!