

第 2 章 Java Web 概述
学习目标
- 了解 XML 的概念
- 掌握 XML 语法
- 掌握 DTD 约束
- 掌握 Schema 约束
- 了解 C/S 体系架构与 B/S 体系架构
- 熟悉 Tomcat 的安装与启动
- 掌握在 IntelliJ IDEA 中配置 Tomcat 服务器的方法
Java Web 是使用 Java 技术解决 Web 领域相关问题的技术栈,开发一个完整的 Java Web 项目涉及静态资源、动态 Web 资源的编写以及项目的部署。在 Java Web 中,静态 Web 资源开发技术包括 HTML、JavaScript、XML 等;动态 Web 资源开发技术包括 JSP 和 Servlet 等。本章将详细介绍 Java Web 开发所用的相关技术,以及项目部署服务器 Tomcat 的使用。
2.1 XML 基础
在实际开发中,不同语言(例如 Java、JavaScript 等)的应用程序之间,数据传递的格式可能不同,导致语言之间的数据交换变得困难。为了应对这个问题,W3C 组织推出了一种通用的数据交换格式——XML,它可以使数据在各种应用程序之间轻松实现格式交换。本节将对 XML 进行详细讲解。
2.1.1 XML 概述
XML(eXtensible Markup Language)是一种类似于 HTML 的标记语言,称为可扩展标记语言,主要用于在应用程序之间传递和存储数据,并具有很强的可扩展性。接下来我们将从两个方面对 XML 进行讲解:什么是 XML,以及 XML 与 HTML 的比较。
1. 什么是 XML
在生活中,很多事物存在一定的层次关系,例如国家、省份、市区之间的层次关系,可以通过一张树状结构图来描述,如图 2-1 所示:
中国
├── 河北
│ ├── 张家口
│ └── 石家庄
└── 山西
├── 太原
└── 大同
图 2-1 描述了国、省、市之间的层次关系。然而,对于程序而言,解析图片的内容是非常困难的,因此采用 XML 文件来保存这种具有树状结构的数据是最好的选择。
使用 XML 之前,首先要了解 XML 文档的基本结构,然后再根据该结构创建所需的 XML 文档。下面通过一个 XML 文档来描述图 2-1 中的关系,如文件 2-1 所示。
文件 2-1 city.xml:
<?xml version="1.1" encoding="UTF-8"?>
<中国>
<河北>
<城市>张家口</城市>
<城市>石家庄</城市>
</河北>
<山西>
<城市>太原</城市>
<城市>大同</城市>
</山西>
</中国>
在文件 2-1 中:
- 第 1 行是 XML 的文档声明。
- 第 2-11 行中的
<中国>、<河北>、<城市>等都是用户自定义的标签,它们被称为元素。这些元素必须成对出现,即包括开始标签和结束标签。例如,<中国>元素中的开始标签为<中国>,结束标签为</中国>。 <中国>被视为整个 XML 文档的根元素,它下面有两个子元素:<河北>和<山西>,而这两个子元素中又分别包含两个<城市>元素。
在 XML 文档中,通过元素的嵌套关系可以准确地描述具有树状层次结构的复杂信息,因此越来越多的应用程序采用 XML 格式来存放配置信息,以便于读取和修改。
2. XML 与 HTML 的比较
XML 和 HTML 都是基于文本的标记语言,二者在结构上非常相似,都是通过标签描述信息。然而,二者之间存在着本质的区别,具体如下:
-
用途不同:
- HTML 用于显示数据,用于描述网页的结构和样式。
- XML 用于传输和存储数据,使数据在不同的应用程序之间进行交换。
-
标签区分大小写:
- HTML 标签不区分大小写。
- XML 标签严格区分大小写。
-
根元素:
- HTML 可以有多个根元素。
- XML 格式良好的文档只能有一个根元素。
-
空格处理:
- 在 HTML 中,空格会被自动忽略。
- 在 XML 中,空格不会被自动过滤。
-
标签定义:
- HTML 中的标签是预定义的,如
<div>、<span>等。 - XML 中的标签可以自定义,用户可以根据需要定义自己的标签。
- HTML 中的标签是预定义的,如
总结来说,XML 不是 HTML 的升级,也不是 HTML 的替代产品,虽然两者看起来相似,但它们的应用领域和范围完全不同。XML 主要用于数据存储和传输,而 HTML 则用于展示信息。
2.1.2 XML 语法
一个 XML 文件可以包含许多内容,如文档声明、元素定义、属性定义、注释等,这些内容的编写需要遵循一定的语法规范。下面详细讲解 XML 语法的主要内容。
2.1.2.1 文档声明
从 XML 1.1 开始,在一个完整的 XML 文档中,必须包含一个 XML 文档的声明,并且该声明必须位于文档的第一行。XML 声明用于表示该文档是一个 XML 文档,从而判断需要遵循哪个 XML 版本的规范。
XML 文档声明的语法格式如下:
<?xml version="版本号" encoding="编码格式" standalone="是否独立"?>
文档声明以符号 <? 开头,以符号 ?> 结束,中间可以包含版本信息、编码方式和独立性声明等内容。
- version(版本号):这是一个必选项,表示 XML 文档所使用的版本,例如
version="1.1"。 - encoding(编码格式):指定 XML 文档的编码方式,常用的编码有
UTF-8、GBK、GB2312等。 - standalone(是否独立):可选项,取值为
yes或no,表示 XML 文档是否与外部文档集成。如果standalone="yes",说明是独立的 XML 文档,与外部文档无关联。
注意:
- 在
<和?之间、?和>之间不能有空格。 - version 是必需的,而 encoding 和 standalone 是可选的。
2.1.2.2 元素定义
XML 文档中的主体内容是由元素组成的,元素是 XML 文档的核心。通常一个 XML 文档有且只有一个顶层元素,称为根元素。
元素通常由开始标签、内容和结束标签组成,例如:
<城市>北京</城市>
在上述示例中:
<城市>是开始标签。北京是元素内容。</城市>是结束标签。
如果一个元素没有嵌套在其他元素中,则这个元素称为根元素。根元素是 XML 文档中定义的第一个元素。
空元素
如果一个元素没有嵌套子元素,也没有包含文本内容,则这样的元素称为空元素。空元素可以不使用结束标签,而是在开始标签的 > 前增加一个正斜杠 / 来表示,例如:
<图片 src="image.jpg"/>
相当于:
<图片 src="image.jpg"></图片>
2.1.2.3 属性定义
在 XML 文档中,可以为元素定义属性。属性用于对元素的进一步描述和说明,每个属性都有自己的名称和取值,属性必须依附于元素存在。
例如:
<售价 单位="元">68</售价>
在上述示例中,<售价> 元素中定义了一个属性 单位,其属性值为 "元"。
注意:
- 在 XML 中,属性的命名规范与元素相同。
- 属性值必须使用双引号 (
") 或单引号 (') 包围,否则会被视为语法错误。
2.1.2.4 注释
注释是为了便于阅读和理解,会在 XML 文档中插入的一些附加信息,例如作者姓名、联系方式等。这些信息是对文档结构或内容的解释,不属于 XML 文档的内容,因此 XML 解析器不会处理这些注释。
XML 注释的语法格式如下:
<!-- 注释信息 -->
示例:
<!-- 这是一个 XML 文档的注释,用于描述 XML 的结构 -->
<城市>北京</城市>
总结
XML 语法的编写包括文档声明、元素定义、属性定义和注释等,这些元素共同构成了一个完整的 XML 文件。XML 的设计目标是以简洁的方式描述结构化的数据,严格遵循 XML 语法规范可以确保数据在各种应用程序之间的顺利传输和使用。
2.1.3 DTD 约束
在前两个小节中,我们了解了如何编写结构良好的 XML 文档,但这些文档的内容并没有被语法语义进行约束。DTD(Document Type Definition)是一种早期的 XML 约束方式,可以用于松散地对 XML 文档中的内容进行约束,并通过解析器验证 XML 文档是否符合该约束。
2.1.3.1 什么是 XML 约束
XML 文档不仅需要遵循语法规则,还需要满足一定的内容约束。例如,一篇语法正确的文章如果包含违法言论或逻辑错误,也是不合格的。同样,对于 XML 文档而言,内容必须满足特定条件的约束,这些约束就是 XML 约束。
XML 约束通过约束语言来实现,DTD 是一种常见的 XML 约束语言,用于定义 XML 文档的结构、属性及实体。
2.1.3.2 什么是 DTD 约束
DTD(Document Type Definition)是一种早期出现的 XML 约束模式语言,用于定义 XML 文档的结构、元素之间的关系、属性的定义等内容。DTD 文件可以用来约束 XML 文档的内容,以确保文档符合特定的规则。
下面通过一个案例简单认识一下 DTD 约束,如文件 2-2 和文件 2-3 所示。
文件 2-2 book.xml:
<?xml version="1.1" encoding="UTF-8"?>
<书架>
<书>
<书名>Java基础案例教程</书名>
<作者>黑马程序员</作者>
<售价>54.00元</售价>
</书>
<书>
<书名>Java基础入门</书名>
<作者>黑马程序员</作者>
<售价>59.00元</售价>
</书>
</书架>
文件 2-3 book.dtd:
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名, 作者, 售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
在文件 2-3 中,book.dtd 是一个简单的 DTD 约束文档。在文件 2-2 中,每个元素都按照 book.dtd 文档规定的约束进行编写。
约束文档解析
-
第 1 行:
<!ELEMENT 书架 (书+)>定义了一个名为
书架的元素,其中(书+)表示书架元素中可以包含一个或多个书元素,+表示必须出现一次或多次。 -
第 2 行:
<!ELEMENT 书 (书名, 作者, 售价)>定义了
书元素,包含书名、作者和售价这三个子元素,且这些子元素必须按照顺序依次出现。 -
第 3 至第 5 行:
<!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>定义了
书名、作者和售价元素,它们都包含普通文本内容,#PCDATA表示解析后的字符数据(Parsed Character Data)。
2.1.3.3 DTD 的引入
要在 XML 文档中使用 DTD 进行约束,必须在 XML 文档中引入 DTD 文件。引入外部 DTD 文件有两种方式:
- 引用本地 DTD 文件:
<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI"> - 引用公共 DTD 文件:
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
在第一种方式中,URI 可以是 XML 文档的相对路径或绝对路径;在第二种方式中,URI 必须是一个互联网 URL 地址。
示例代码
文件 2-4 book.xml 引入了本地的 DTD 文件:
<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java基础案例教程</书名>
<作者>黑马程序员</作者>
<售价>54.00元</售价>
</书>
<书>
<书名>Java基础入门</书名>
<作者>黑马程序员</作者>
<售价>59.00元</售价>
</书>
</书架>
2.1.3.4 内嵌 DTD 语法
除了通过外部引用的方式引入 DTD 文件,还可以采用内嵌方式,将 DTD 直接嵌入到 XML 文档中。
内嵌 DTD 的完整语法格式如下:
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 根元素名称 [
DTD定义语句
...
]>
示例代码(文件 2-5 book.xml):
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名, 作者, 售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java基础案例教程</书名>
<作者>黑马程序员</作者>
<售价>54.00元</售价>
</书>
<书>
<书名>Java基础入门</书名>
<作者>黑马程序员</作者>
<售价>59.00元</售价>
</书>
</书架>
2.1.3.5 DTD 约束语法
DTD 文档的结构由元素定义、属性定义、实体定义、符号定义等部分组成。一个典型的 DTD 文档通常用于定义将来创建的 XML 文档的元素结构、属性类型、实体引用等内容。
元素定义
在 DTD 中,每个元素的定义通过 <!ELEMENT> 语句来实现,基本语法格式如下:
<!ELEMENT 元素名称 元素内容>
- 元素名称:被约束的 XML 文档中的元素名称。
- 元素内容:声明元素包含的内容类型。
元素内容形式:
#PCDATA:普通文本内容。<!ELEMENT 书名 (#PCDATA)>- 子元素:说明元素包含其他元素。
<!ELEMENT 书 (书名, 作者, 售价)> - 混合内容:既可以包含字符数据,也可以包含子元素。
EMPTY:表示该元素为空。ANY:表示该元素可以包含任何内容(不推荐使用)。
符号说明:
?:出现 0 次或 1 次。*:出现 0 次或多次。+:出现 1 次或多次。|:表示选择。,:按照顺序出现。():用于分组。
属性定义
在 DTD 文档中,属性通过 <!ATTLIST> 语句来定义,基本语法格式如下:
<!ATTLIST 元素名 属性名1 属性类型 设置说明 属性名2 属性类型 设置说明 ...>
设置说明:
#REQUIRED:必须存在。#IMPLIED:可选。#FIXED:固定值,不能更改。- 默认值:如果属性没有设置,使用默认值。
属性类型:
- CDATA:字符数据。
- Enumerated(枚举类型):值只能从指定列表中选择。
- ID:唯一标识 XML 文档中的某个元素。
- IDREF/IDREFS:用于引用其他元素的 ID,建立一对一或一对多的关系。
总结
DTD 约束用于定义 XML 文档的结构和内容约束,以确保 XML 文档符合特定的规则。通过元素定义、属性定义、内嵌 DTD 或外部引用 DTD 文件,可以有效地约束 XML 文档的内容,确保数据的准确性和一致性。DTD 是一种早期的 XML 约束方式,虽然比较简单,但在验证 XML 文档的结构时仍然十分有效。
2.1.4 Schema 约束
XML Schema(简称 Schema)是一种用于定义和描述 XML 文档结构和内容的模式语言。与 DTD 相比,Schema 更加灵活和强大,其语法更符合 XML 标准,且支持更复杂的数据类型和语义约束。下面对 Schema 约束进行详细讲解。
2.1.4.1 什么是 Schema 约束
XML Schema 与 DTD 相似,都是用于定义和描述 XML 文档结构与内容的模式语言,但 XML Schema 克服了 DTD 的一些局限性。与 DTD 相比,XML Schema 具有以下显著优点:
-
基于 XML 语法格式:DTD 使用非 XML 语法,而 XML Schema 采用 XML 语法格式,这使得 Schema 更加易于阅读和理解,同时它本身也是一种 XML 文档。
-
高合法性验证机制:XML Schema 具有与 XML 相同的合法性验证机制,这样可以确保文档结构和内容的规范性。DTD 本身缺乏有效的验证机制,必须独立处理。
-
良好的名称空间支持:XML Schema 对名称空间支持得非常好,而 DTD 几乎不支持名称空间。
-
丰富的数据类型支持:DTD 只能支持字符数据,而 XML Schema 支持更多的数据类型,例如非负整数(
nonNegativeInteger)、布尔类型等,还允许用户自定义数据类型。 -
更细致的语义约束能力:XML Schema 能对 XML 文档中的内容进行更细致的约束,例如限定元素出现的次数范围(如 7 到 12 次),而 DTD 无法实现这些复杂的限制。
下面通过一个简单的 Schema 文档(文件 2-10)来了解 XML Schema:
文件 2-10 simple.xsd:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="xs:string"/>
</xs:schema>
在文件 2-10 中,<xs:schema> 定义了模式的开始,根元素 <root> 必须是字符串类型的数据。
2.1.4.2 名称空间
在 XML 文档中,可能会引用多个约束文档,由于这些文档中的元素或属性是自定义的,容易发生名称冲突。名称空间(Namespace)提供了唯一标识元素或属性的方法,以避免同名元素或属性的冲突。
名称空间的声明语法格式如下:
<元素名 xmlns:prefixname="URI">
- 元素名:在该元素上声明名称空间,适用于该元素及其嵌套的所有子元素和属性。
- xmlns:用于定义名称空间的前缀。
- URI:用于标识该名称空间的名称。
下面通过一个案例(文件 2-11)来学习名称空间的使用:
文件 2-11 book.xml:
<?xml version="1.1" encoding="UTF-8"?>
<it315:书架 xmlns:it315="http://www.it315.org/xmlbook/schema">
<it315:书>
<it315:书名>Java基础案例教程</it315:书名>
<it315:作者>黑马程序员</it315:作者>
<it315:售价>54.00元</it315:售价>
</it315:书>
</it315:书架>
在文件 2-11 中,it315 作为元素的前缀,通过 xmlns:it315 声明了名称空间,唯一标识这些元素属于特定的模式文档。
2.1.4.3 引入 Schema 文档
XML 文档要使用 Schema 进行约束,必须在 XML 文档中引入 Schema 文件。有以下两种方式:
-
使用名称空间引入 XML Schema 文档: 使用
xsi:schemaLocation属性来声明名称空间。属性schemaLocation包含两个 URI:第一个是名称空间名称,第二个是 Schema 文件的位置。例如:文件 2-12 book.xml:
<?xml version="1.1" encoding="UTF-8"?> <书架 xmlns="http://www.it315.org/xmlbook/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd"> <书> <书名>Java基础案例教程</书名> <作者>黑马程序员</作者> <售价>54.00元</售价> </书> </书架> -
通过
xsi:noNamespaceSchemaLocation属性直接指定 Schema 文件: 如果没有名称空间,可以使用xsi:noNamespaceSchemaLocation属性。例如:文件 2-14 xmlbook02.xml:
<?xml version="1.1" encoding="UTF-8"?> <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xmlbook.xsd"> <书> <书名>Java基础案例教程</书名> <作者>黑马程序员</作者> <售价>54.00元</售价> </书> </书架>
2.1.4.4 Schema 语法
XML Schema 也有一套语法规则,用于定义 XML 文档中的元素和属性。
1. 元素定义
Schema 中使用 <xs:element> 元素来声明 XML 文档中的元素,语法格式如下:
<xs:element name="名称" type="类型"/>
常用的数据类型:
- xs:字符串类型。
- xs:小数类型。
- xs:整数类型。
- xs:布尔类型。
- xs:日期类型。
- xs:时间类型。
示例:
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
2. 属性定义
Schema 中使用 <xs:attribute> 元素来定义属性,语法格式如下:
<xs:attribute name="属性名称" type="属性类型"/>
示例:
<xs:attribute name="lang" type="xs:string"/>
3. 简单类型
简单类型使用 <xs:simpleType> 元素来定义,包含字符数据的元素属于简单类型。例如:
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="58"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
这段代码定义了一个 age 元素,其值必须在 18 到 58 之间。
4. 复杂类型
复杂类型的元素可以包含子元素或属性,需要使用 <xs:complexType> 元素来定义。
-
空元素:不包含内容,只包含属性。
<xs:element name="product"> <xs:complexType> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType> </xs:element> -
包含其他元素的元素:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> -
仅包含文本的元素:
<xs:element name="shoesize"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> -
包含元素和文本的元素:
<xs:element name="letter"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType> </xs:element>
mixed="true" 表示该元素可以包含字符数据和子元素。
总结
Schema 约束用于描述 XML 文档的结构和内容约束,具有高合法性、支持复杂数据类型、良好的名称空间支持等优点。通过元素和属性定义、简单和复杂类型的约束,XML Schema 提供了对 XML 文档的更强的描述和验证能力。Schema 比 DTD 更灵活、更适合实际开发中的需求。


479

被折叠的 条评论
为什么被折叠?



