XML基础

XML概述

XML(exiensile markup language,可扩展标记语言)是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,可以定义其他与特定领域有关的、语义的、结构化的标记。
XML与 HTML 都是标记语言,结构上大致相同,都是基于文本编辑修改的。但实际上它们有着本质的区别。

1.语法要求不同

(1)HTML 不区分大小写,而 XML 严格区分。

(2)HTML语法有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾那么可以省略

或者之类的结束标记。在 XML中,是严格的树状结构,不能省略结束标记。

(3)XML拥有单个标记而没有匹配的结束标记的元素必须用一个“/”字符作为结尾这样分析器就知道不用查找结束标记了。

(4)XML属性值必须分装在引号中,HTML的引号是可用可不用的。

(5)HTML中可以拥有不带值的属性名,XML中的所有属性都必须带有相应的值

(6)XML文档中的空白部分不会被解析器自动删除,HTML 会过滤掉空格。

2.标记不同

HTML语言定义了一套固定的标记,用来描述一定数目的元素。例如,HTML文档包括格式化、结构和语义的标记。就是 HTML中的一种格式化标记,它使标记中的内容变为粗体。而XML标记是用户根据自己的需要定义的。这些标记必须根据某些通用的规则来创建,标记的意义具有很大的灵活性。

3.作用不同

HTML是用来显示数据的,XML是用来描述数据、存放数据的。XML不是HTML的替代品,XML和HTML是两种不同用途的语言。XML不是要替换HTML;实际上XML可以看作对 HTML的补充。XML和HTML的设计目标不同:HTML的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容。

XML语法

首先来看一个XML文档,代码定义如下:

Java Web设计与开发教程张三zhangsan@qq.com20170329

XML声明

“<?“表示该行是一个命令;在“<?”后面紧跟“xml”(必须小写),表示该文件是一份XML,文件,这是处理指令的名称,用于声明XML的版本和采用字符集。在“”之间以及第一个“?”和“xm!”之间不能有空格。
声明语句中的 version 属性为必需项,表示 XML的版本,因为解析器对不同版本的解析会有区别,声明中还有两个可选属性,分别是 emcoding和 standalone。encoding 属性表示该文档所使用的字符集。如果XML声明中没有设置encoding属性来明确指定文档所用的字符编码方式,则默认使用 Unicode 编码。standalone 属性定义了是否可以在不读取其他任何文件的情况下处理该文档。如果XML文档没有引用其他任何文件,则指定standalone=“yes”,standalone 的默认值为“no”。
对于含有中文字符的 XML,其中的字符可以采用Unicode 编码或 GB2312编码来表示。如果文档中的字符使用的是 GB2312编码,则必须设置encoding属性为 GB2312,下面通过一个实例来说明这个问题。
创建一个 chapter02 文件夹,在 chapter02 文件夹下使用 Windows 自带的记事本程序创建一个名为 demo2-1.xml的文件,文件内容如例 2-1所示。

XML元素

XML 元素指 XML 文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式:
(1)包含标签体:www.cnblogs.com。
(2)不含标签体;,可简写为:
一个标签中也可以嵌套若干子标签。但所有标签必须合理嵌套,绝对不允许交叉套,例如下面的写法是错误的:

welcome to www. cnblogs. com

XM工文档必须有一个根元素,用来包含其他内容。XML文档中的所有内容都应该出现在根元素的内部。在遵守XML命名规则的前提下,用户可以为元素和属性选择任何名字。XML 文档内容的主体部分一般由根元素、子元素、属性、注释和内容组成。

在XML中,基本上没有什么保留字,可以用任何字符串作为元素名称,但是XML元素的命名必须遵守下列规范:
(1)元素的名字可以包含子母、数字和其他字符,且区分大小写。
(2)元素的名字不能以数字或者标点符号开头。
(3)元素的名字不能以 XML(或者xml,Xml,xMl 等)开头。
(4)元素的名字不能包含空格,并且避免使用“-”“.”“:”等特殊字符。

XML属性

XML元素可以在开始标签中包含属性。属性(attibute)提供关于元素的额外(附加)信一个XML标签可以有多个属性。XML中的属性与HTML中的属性是一样的,每个属性都有它自己的名称和取值,例如:

李四

属性值一定要用双引号(“)或单引号(‘)引起来,属性中不能包含 XML 标签,属性名称必须遵循 XML 命名规范。

XML注释

在 XML, 中编写注释的语法与 HTML 的语法很相似,也是以“”结束,用于对文档中的内容进行解释说明。注释内的任何标记都被忽略。如果希望除去XM文档中的一块较大部分,只需要用注释标记括住这部分即可。

DTD约束

经过对XML的使用发现,只要遵守XML的语法规定,编写一个结构良好的XML还是很轻松的。但是之前所做的操作全都是对文档结构的要求,而没有在语法语义上对文档进行约束。

代码如下:

Java Web设计与开发教程张三zhangsan@qq.com2017032920170429

为此,在 XML 文档中,可以编写一个文档来约束一个 XML 的书写规范,约束文档定义了在 XML 中允许出现的元素名称、属性及元素出现的顺序等。常见约束有XMLDTD束和 XML Schema 约束。Mybatis 中使用的是 DTD 约束,Spring 中使用的是 Schema 约束。

DTD语法

在编写 DTD 文档时,需要遵循一定的语法。DTD 一般由元素类型定义、属性定义和实体定义组成。

1)元素类型定义

元素是XML的核心与灵魂。在DTD中,元素类型是通过ELEMENT 标记声明的DTD中使用元素类型声明来声明所有有效的文档元素。其基本语法格式如下:

!ELEMENT 表示开始元素设置,注意此处ELEMENT关键字必须大写element-name表示要设置的元素名称。element-definition指明要对此元素进行怎样的定义XML中按元素的内容可以将元素划分为5类,分别是EMPTY、ANY、#PCDATA、子元素型和混合型

1.#PCDATA

声明为#PCDATA 类型的元素不包含其他子元素而只能有文本数据。语法格式如下:

注意元素名和括号之间必须使用空格隔开,否则运行时将出现错误。例如:,表明元素“姓名”嵌套的内容是字符串类型

2.子元素型

元素可以包含一系列的子元素,子元素内容用于指定某个元素可以包含哪些子元素及其出现次序,其语法格式如下:

例如,“”表示 XML 文档中元素“员工”包含一个子元素“姓名”。根据子元素间的关系,子元素内容有两种可能的结构:序列和选择

序列定义了子元素所要遵循的顺序,子元素之间要用逗号(,)隔开,而且所有子元素出现的次数可以进行具体指定。通过在子元素列表中每个子元素的后面添加限定符号来限定该子元素出现的次数。元素限定符,也被称为元素指示符。如果子元素没有限定符号那么该子元素必须出现且仅能出现一次。常见的元素限定符有:
①问号(?):表示该对象可以出现0次或1次。

②星号(*):表示该对象可以出现0次或多次。

③加号(+):表示该对象可以出现1次或多次。

上述声明指定元素“员工”必须包含子元素“姓名”、“性别”和“出生日期”,而且三个子元素必须出现且仅能出现一次,在XML文档中子元素必须按照指定的顺序出现。

3.混合型

混合型内容说明元素既可以包含子元素又可以包含字符数据(即文本数据)。混合型的语法格式如下:

混合型内容中可能出现的子元素类型只需声明一次,在混合型最后面必须追加限定指示符。元素的频率(即出现的次数)使用加号(+)、星号(*)或问号(?)来限定。

4.EMPTY

关键字 EMPTY用于定义空元素,该元素只有属性而不会有元素内容。声明空元素的语法如下:

例如,就声明是一个空元素,在符合该声明的XML文档中,元素“员工”的标记为:或。

5.ANY

声明类型为 ANY的元素可以包含DTD中定义的其他任何元素或已编译的字符数据,包括PCDATA、元素或元素与PCDATA的混合内容。另外,内容为ANY的元素也可以是空元素。

2)属性定义

在DTD文档中,定义元素的同时,还可以为元素定义属性。其基本格式为:

“元素名称”是属性所属元素的名字,“属性名称”是要定义的属性名字,“属性类型则用来指定该属性属于哪种类型,“属性特点”用来说明该属性是否必须出现。定义DTD属性时,属性特点有4种类型可以选择、如表2-1所示。

属性类型用来指定DTD中定义的属性的具体类型,共有10种,如图:

代码例子如图:

Java Web 设计与开发教程张三zhangsan@ qq. com20170329

在上述代码中,元素添加了一个属性名为authorid 的属性,并给该属性赋值为z1234。

3)实体定义

实体即ENTITY,可以理解为模板。可以预先定义一个ENTITY,然后在一个文档中多次调用,或者在多个文档中调用同一个ENTTTY。

实体定义的语法格式为:在 XML 中引用实体的方式为:“&实体名称;”.

DTD的引用

DTD 分为内部 DTD 和外部 DTD 两类。一个 XML 文档如果包含 DTD 声明,则把这DTD 声明叫作内部 DTD。这样的 DTD 所定义的文档类型只能应用在该 XML,文档中,其XML 文档不能使用它所定义的文档类型。

引入内部 DTD 的语法格式为:

引人内部 DTD实例:

<!DOCTYPE myook[]>Java Web 设计与开发教程张三zhangsan@ qq.com20170329

上述代码中,直接将 demo2-3.did的约束语句嵌人XML 文件中,使用标记进行引入。
与内部 DTD 相反,外部 DTD可以方便而高效地被多个XML文档共享。XML声明中必须说明这个XML 文档不是自成一体的,即 standalone 属性的值应为“no”。

引入外部 DT的语法格式为:

上述两种引人 DTD 的方式中,第1种方式是引入本地的DTD 文件,第2种方式是引人公共的 DTD 文件,其中“外部 DTD 文件的 URI”指 DTD 文件的存放位置,第1种方式的DTD 文件存放位置可以是相对地址或绝对地址,第2种方式的DTD 文件存放位置一般是互联网上的一个绝对 URL地址。

Schema 约束

XML Schema 和 DTD 都是用来定义各种文件中 XML,标记的使用规范。但 Schema 是针对 DTD 缺点设计的,其优点如下:
(1)XMLSchema符合 XML语法结构。

(2)DOM,SAX等XML API很容易解析出XML Schema 文档中的内容。

(3)XML Schema 对名称空间支持得非常好。

(4)XMLSchema比DTD支持更多数据类型,并支持用户自定义新的数据类型。

(5)XML Schema定义约束的能力非常强大,可以对 XM,文档进行细致的语义限制。

(6)XML Schema 不能像 DTD 一样定义实体,比 DTD 更复杂,但 XML Schema 现在已是W3C组织的标准,正逐步取代DTD。

Schema 文档的结构如下所示:

<xs:schema xmlns:xs=" http://www.w3.org/2001/XMLSchema"

要引人的名称空间是在 schema中定义的,就是targetNamespace 的值。在上述 Schema约束文件中,在 http://www.hunau.edu.cn/mybook/schema 名称空间中定义了一个根元素mybook,mybook 包含子元素 book,max0ccurs=”unbounded”表示子元素 book 可以出现多次。book 包含title,author,email,date 四个子元素。

在使用名称空间引人XML Schema 文档时,需要通过属性 xsi:schemaLoeation 来声明名称空间的文档,该属性包含两个URI,这两个URI之间用空白符分隔。其中,第一个URI是名称空间的名称,第二个URI是 Schema 文档的位置

接下来,通过一个案例来演示如何使用名称空间引人 XML Schema 文档,如例 所示

Java Web 设计与开发教程张三zhangsan@ qq.com2017-03-29

在例子中,schemaLocation 属性第一个URI就是上一个代码中targetNamespace 属性定义的名称空间“http://www.hunau.edu.cn/mybook/schema”;第二个 URI是自定义 Schema文档的路径,这里是本地路径 demo2-6.xsd。xsi:schemaLocation 属性是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的,xmlns:xsi 用于声明 schema-Location 属性所属的命名空间,这是必需的。

2)不使用名称空间引入XML Schema文档

在 XML 文档中引人 XML Schema 文档,不仅可以通过 xsi:schemaLocation属性引入名称空间的文档,还可以通过 xsi:noNamespaceSchemaLocation 属性直接指定,noNamespaceSchemaLocation 属性也是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的,它包含一个 URI,用于定义指定 Schema 文档的位置。

HTTP 协议

HTTP 概述

HTTP 协议( hyper text transfer protocol,超文本传输协议)和 TCP/IP 协议族内的其他众多协议相同,用于客户端和服务器之间的通信。请求访问文本或图像等资源的一端称为客户端,而提供资源响应的一端称为服务器端。

HTTP协议的特点主要有:
(1)简单快速。当客户端向服务器端发送请求时,只是简单地填写请求路径和请求方法,然后通过浏览器或其他方式将该请求发送即可。

(2)灵活。HTTP协议允许客户端和服务器端传输任意类型、任意格式的数据对象。

(3)无状态。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即客户端发送HTTP请求后,服务器根据请求,会发送数据,发送完后,不会记录信息。

HTTP 请求地址

HTTP 使用统一资源标识符(unifomm resource identfer,URI)来传输数据和建立连接URL是一种特殊类型的URI,包含用于查找某个资源的足够信息。

URL的基本格式为:protocol: //hostname[ : port ]/website/path[ ? query ] [ #tfragment ]

一个完整的 URL包括以下几部分:
(1)protocol:通信协议,常用的有 http,fp,htps等。
(2)hostmame:主机名、服务器域名系统(DNS)主机名或IP地址。
(3)port:端口号,可选,省略时使用默认端口,如htp 的默认端口为 80。
(4)website:网站名称,主要是web应用程序上下文或者网站根目录。
(5)path:路径,由0或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
(6)?query:查询,可选,用于给动态网页传递参数,如果有多个参数则用“&”符号隔开,每个参数的名和值用“=”符号隔开。
(7)#fragment:网页锚点,可选,用于指定网络资源中的信息片段。

HTTP 消息

当用户在浏览器中访问某个URL地址、单击网页的某个超链接或者提交网页上的2.2.3 HTTP 消息fomm 表单时,浏览器都会向服务器发送请求数据,即HTTP请求消息。服务器接收到请求数据后,会将处理后的数据返回给客户端,即HTTP响应消息。HTTP请求消息和HTTP响应消息统称为 HTTP 消息。

HTTP 请求消息

客户端通过发送HTTP请求向服务器请求对资源的访问。HTTP请求由三部分组成:请求行、消息报头、请求正文。每个部分都有各自不同的作用。

1)请求行

请求行以一个 method 符号开头,后面跟着请求URI和协议的版本,基本格式如下:

method request-URI http-version

method 表示请求的方法,request-URI是一个统一资源标识符,标识了要请求的资源http-version 表示请求的 HTTP 协议版本。具体示例如下:

GET /chapter02/index. html HTTP/1. 1

在该示例中,客户端的请求方式是CET方式,请求的资源为/chapler02/index.himHTTP 协议版本是1.1。

在HTTP的请求消息中,请求方式有CET,POST,HEAD,OPTIONS,DELETETRACE,PUT和CONNECT8种,每种方式都指明了操作服务中制定URI资源的方式。

(1)OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,允许客户端查看服务器的性能。

(2)HEAD:类似于 GET请求,只不过响应体将不会被返回,用于获取报头。

(3)GET:向特定的资源发出请求,并返回实体主体。

(4)POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。

(5)PUT:向指定资源位置上传其最新内容。

(6)DELETE:请求服务器删除请求 URL,所标识的资源。

(7)TRACE:回显服务器收到的请求,主要用于测试或诊断。

(8)CONNECT:保留将来使用。

HTTP的8种请求方式中,GET和POST方式最常用。要想发送CET方式请求、可以采用几种操作:①在浏览器地址栏中直接输入请求的URL地址:②单击网页上的一个超链接;③在表单提交时将 method 属性设置为“GET”或者不设置 method 属性。而要想发送POST方式请求,需要在表单提交时将method属性设置为“POST”。

(1)POST比CET请求方式更安全。

GET方式传递的参数会在 URL中用明文显示,写在“?”的后面并用“&”分隔多个参数。中文在 URL中是不能直接传递的,如果参数值是中文,则会转换成百分号(%)后面跟对应字符的 ASCI(16 进制)码值。而POST方式是通过实体内容传递数据的,参数不会显示在 URL 中。可以看出 POST的安全性要更高。

因此,GET方式用来传输一些可以公开的参数信息,解析也比较方便。而POST方式用来提交用户的敏感信息。但无论是CET还是POST方式其实都是不安全的,因为HTTP协议是明文传输,只要拦截封包便能轻易获取重要资讯。想要安全传输资料,必须使用SSL/TLS 协议来加密封包,也就是 HTTPS。

(2)POST传输数据更大。

CET方法提交的数据大小长度没有限制,但IE浏览器处理的URL最大长度为2048个字符(不同浏览器不一样),所以GET方式提交的参数长度受到限制,当用户向 web 服务器发送一个长的参数字符串时,参数字符串会被截断。

而POST方式提交的数据会附在正文上,一般请求正文的长度是没有限制的,但表单中所能处理的长度一般为100k,而且需要考虑下层报文的传输效率,所以不推荐过长。

2)HTTP 请求消息报头

在 HTTP请求消息中,请求行之后就是请求消息报头。HTTP的请求消息报头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。具体的示例如下所示:

Host:localhost.8080User-Agent: Mozilla/5.0( Windows NT 10.0; Win64;x64;rv:96.0)Gecko/20100101 Firefox/96. 0Accept : text/html , application/xhtml+xml ,application/xml ; image/avif, image/webp, */* ;Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding :gzip, deflateConnection :keep-aliveIf-Modified-Since:Tue, 18 Jan 2022 08 :42:55 GMTCache-Control:max-age=0

要想查看 HTTP请求消息和响应消息,可以使用开发者调试工具。开发者调试工具-套按需采用的工具,网站开发人员可以随时在任何网页上使用开发者调试工具,从面速调试 JavaScript,HTML和 CSS 代码,还可以跟踪并查明网页或网络的性能问题。调试时使用最多的功能页面是:查看器、控制台、调试器、网络等。

(1)查看器。用于查看页面代码,在右边可以修改样式。
(2)控制台。控制台一般用于执行一次性代码、査看JavaScript 对象、查看调试日志信息或异常信息。
(3)调试器。该页面用于查看页面的HTML文件源代码、JavaScript源代码、CSS源代码,此外在调试器中可以给JavaScript 代码添加断点、可以调试 JavaScript 源代码。

(4)网络。网络页面主要用于查看header等与网络连接相关的信息。
(5)存储。查看本地资源的 cookie,local storage,session storage 等信息。

根据功能需求不同,HTTP请求消息头也会不相同,常用的请求头字段如表所示:

3)请求正文

请求正文用于封装POST请求消息的请求参数。一个页面表单中的参数是通过param=value 的键值对形式编码成一个格式化字符串的,多个请求参数可以通过符号“&”进行连接

例如:“paraml=valuel&param2= value2”。

HTTP 响应消息

服务器接收并处理客户端发来的请求后会返回一个HTTP响应消息。HTTP响应消息也由3个部分组成:状态行、消息报头和响应正文。

1)状态行

状态行是由 HTTP版本、状态码和状态代码的文本描述组成的

其语法格式为:HTTP-Version Status-Code Reason-Phrase

HTTP 状态码共分为5种类型:
(1)1xx:表示服务器收到请求,需要请求者继续执行操作。
(2)2xx:表示请求被成功接收并处理
(3)3xx:表示客户端需要进一步操作以完成请求,
(4)4xx:表示请求包含语法错误或无法完成请求
(5)5xx:表示服务器在处理请求的过程中发生了错误

2)HTTP 响应消息报头

在 HTTP 响应消息中,响应行之后就是响应消息报头。服务器端通过响应消息报头向客户端传递附加信息,包括服务程序名、客户端请求资源最后修改时间、重定向地址等。

具体的示例如下所示:

Server:Apache-Coyote/1.1Accept-Ranges : bytesETag:W/"148-1642495689415"Last-Modified:Tue, 18 Jan 2022 08 :48:09 GMTContent-Type : text/htmlContent-Length:148Date: Tue, 18 Jan 2022 08 :48:12 GMT

响应消息报头的格式和请求消息报头的格式一样,也是采用“属性名:属性值”的方式,服务器端据此向客户端返回信息。根据情况不同,服务器端发送的响应消息报头也不相同。

常用的响应消息报头字段如图:

3)响应正文

HTTP响应消息的正文部分实际上就是服务器返回资源的内容。