个人理解:

  知晓XML与HTML的不同,知道其的自由性和约束的方式(规范)!数据按Schema约束写到XML里,然后通过dom4j解析出所有的元素,再用反射创建对象接着调出其所有的方法!!!特别要熟练掌握反射的3种创建对象的方法!

一、模拟Servlet执行

了解WEB服务器就是另一台计算机。

  为了灵活实现的不同路径(/hello)执行不同的资源( HeIIoMyServlet)我们需要使用XML进行配置;为了限定XML内容,我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。然后可以通过反射进行创建对象,获取其中的方法。

二、XML介绍:

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

  W3C在1998年2月发布1.0版本,2004年2月义发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本!!!

三、XML语法:

1、文档声明:

<?xml version="1.0" encoding="UTF-8"?>

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

②、文档声明必须从文档的0行0列位置开始:(注释也不能加!!!)

③、文档声明只有属性:

a)     versioin:指定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、属性:

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

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

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

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

4、注释:

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

5、转义字符:

XML中的转义字符与HTML一样。

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

6、CDATA区:

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

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

<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person class="黑色" height="192">
<name>熊二</name>
<age>22</age>
</person>
<person>
<name>熊大</name>
<age>
<!-- 转义字符出现在以下区域内,会自动转义! -->
<![CDATA[
if(10>9&&9>8){
aaaa;
}
]]>
</age>
</person>
</persons>

四、DTD:

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

2、我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:struts2,  hibernate等。

<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
格式如下:
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)> <!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)> <!ATTLIST web-app version CDATA #IMPLIED>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.oracle.demo01.HelloServlet</servlet-class> </servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> </web-app>

3、文档声明:

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

②、外部DTD——本地DTD,DTD文档在本地系统system上,公司内部自己项目使用。

③、外部DTD——公共DTD,DTD文档在网络public+网址上,一般都有框架提供。

4、元素声明:

定义元素语法:<!ELEMENT元素名 元素描述>

元素名:自定义

元素描述包括 : 符号和数据类型

常见符号: ?  *  +  ()  |  ,

常见类型:#PCDATA表示内容是文本,不能是子标签

五、Schema约束:

1、介绍:

①、Schema是新的XML文档约束:

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

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

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

⑤、Schema支持名称空间

2、通过schema约束文档编写xml文档。常见框架使用schema的有:Spring等通过提供”web-app_ 2_ 5.xsd"编写xml文档

<?xml version="1.0" encoding="UTF-8"?>
<!--
模拟servlet2.5规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
-->
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/web-app_2_5"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.example.org/web-app_2_5"
elementFormDefault="qualified"> <xsd:element name="web-app">
<xsd:complexType>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="servlet">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="servlet-class"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="servlet-mapping">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="servlet-name"></xsd:element>
<xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="welcome-file-list">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:choice>
<xsd:attribute name="version" type="double" use="optional"></xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
</web-app>

六、dom4j解析:

1、XML的解析方式:

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

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

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

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

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

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

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

③、PULL:  Android内置的XML解析方式,类似SAX。(了解)

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

常见的解析开发包:

①、 JAXP: sun公司提供支持DOM和SAX开发包

②、 JDom:dom4j兄弟

③、 jsoup:一种处理HTML特定解析开发包

④、dom4j:比较常用的解析开发包,hibernate底层采用。

3、DOM解析原理及结构模型:

  XML DOM和HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,

并获得一个Document对象,通过Document对象就可以对DOM进行操作。

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

4、API使用:

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

七、解析步骤:

1.创建解析器对象

2.使用解析器加载web.xml文件得到document对象

3.获取根元素节点

4.根据元素名称获取子元素节点

5.根据元素名称获取servlet-class的文本节点

6.通过类全名获取字节码文件

7.创建实例对象

8.调用实例对象里面的方法

package com.oracle.demo04;

public class MyServlet {
public void init(){
System.out.println("init()正在执行");
}
public void service(){
System.out.println("service()正在执行");
}
public void destroy(){
System.out.println("destory()正在执行");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.oracle.demo04.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/my</url-pattern>
</servlet-mapping>
</web-app>
package com.oracle.demo04;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
//将数据按Schema约束写到XML里,然后通过dom4j解析出所有的元素,再用反射创建对象再调出其所有的方法!!!
public class Demo {
public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
// 1.获取解析器
SAXReader sax=new SAXReader();
// 2.获得document文档对象
Document doc=sax.read("src/com/oracle/demo04/web.xml");
// 3.获取根元素
Element element=doc.getRootElement();
// 4.判断元素名称为servlet的元素
Element servlet=element.element("servlet");
// 5.获取servlet-class元素
Element className=servlet.element("servlet-class");
//System.out.println(className.getText());获取当前元素的文本内容
//开始反射获取MyServlet的字节码文件对象
Class c=Class.forName(className.getText());
//快速创建对象
Object obj=c.newInstance();
//向下转型
MyServlet my=(MyServlet) obj;
my.init();
my.service();
my.destroy();
}
}

JAVA基础之XML相关的更多相关文章

  1. java基础之XML

    目录 java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3. ...

  2. JAVA基础知识xml,date

    虽然说看文档最好是看官方原来的文档,但是呢,下面是我看别的人的总结,算做抛砖引玉吧,如果有不对的,我会在后期给更正或者自己来写一篇 1,JAVA中对xml的操作,包括schema,dtd等相关知识:标 ...

  3. 【Java基础】String 相关知识点总结

    String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final ...

  4. java基础74 XML解析中的SAX解析相关知识点(网页知识)

    1.SAX解析工具 SAX解析工具:是Sun公司提供的,内置JDK中.org.xml.sax.*         点击查看: DOM解析相关知识:以及DOM和SAX解析的原理(区别) 2.SAX解析的 ...

  5. java基础71 XML解析中的【DOM和SAX解析工具】相关知识点(网页知识)

    本文知识点(目录):本文下面的“实例及附录”全是DOM解析的相关内容 1.xml解析的含义    2.XML的解析方式    3.xml的解析工具    4.XML的解析原理    5.实例    6 ...

  6. java基础篇---XML解析(一)

    XML是可扩展标记语言 在XML文件中由于更多的是描述信息的内容,所以在得到一个xml文档后应该利用程序安装其中元素的定义名称去除对应的内容,这样的操作称为XML解析. 在XML解析中W3C定义SAX ...

  7. java基础篇---XML解析(二)

    XML解析之最流行的方式:DOM4J dom4j是使用java语言编写的,用于读,写,操作XML的一套组件 dom4j是一个开源的java组件,可从http://sourceforge.net/pro ...

  8. Java基础--面向对象以及相关知识

    一. 面向对象特征与原则 1.三大特征:封装.继承.多态. (1)封装:将客观的事物封装成抽象的类,封装代码逻辑,并通过访问控制符来控制访问的方式,从而保护程序(使用反射时,可以获取对象的私有方法和成 ...

  9. Java基础 - Date的相关使用(获取系统当前时间)

    前言: 在日常Java开发中,常常会使用到Date的相关操作,如:获取当前系统时间.获取当前时间戳.时间戳按指定格式转换成时间等.以前用到的时候,大部分是去网上找,但事后又很快忘记.现为方便自己今后查 ...

随机推荐

  1. 将lol人物模型导入到Unity3d

      接下来我打算将提取出来的lol人物模型导入到Unity3D中,这样会更加好玩!(不知道如何提取lol人物模型的话请看该链接)   首先我们已经把dae文件导入到c4d中了,可以看到这是一只吹笛子的 ...

  2. flask 开发用户登录注册功能

    flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...

  3. Python执行时间的计算方法

    # CPU的执行时间start = time.clock()#end = time.clock()print(end-start) # 程序执行时间:start = datetime.datetime ...

  4. activiti 自定义用户

    https://blog.csdn.net/meng564764406/article/details/53789958 此文目的: 对网络上的关于对activiti 使用做一个总结,因为很难找到一个 ...

  5. sass、less和stylus 相同与不同

    sass.less和stylus的安装使用和入门实践 https://www.jianshu.com/p/1eaf366814e2 stylus 基础教程 https://blog.csdn.net/ ...

  6. Nginx - 代理后端通过域名访问

    目录- 前言- Nginx 根据域名反向代理- Nginx proxy_pass 关于 '/' 的作用 1. 前言 接到一个需求,通过nginx 代理互联网上某一个页面,刚开始的时候觉得很简单的,直接 ...

  7. [LeetCode] 227. Basic Calculator II 基本计算器 II

    Implement a basic calculator to evaluate a simple expression string. The expression string contains ...

  8. [LeetCode] 452. Minimum Number of Arrows to Burst Balloons 最少箭数爆气球

    There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...

  9. [LeetCode] 654. Maximum Binary Tree 最大二叉树

    Given an integer array with no duplicates. A maximum tree building on this array is defined as follo ...

  10. 解决在manjaro下,vscode无法将chrome作为默认浏览器打开

    Same issue. The solution is simple. Find the name of the exec command, for google chrome in arch lin ...