动态网站开发讲课笔记02:Java Web概述
文章目录
- 零、本讲学习目标
- 一、 XML基础
- (一)XML概述
- 1、XML
- 2、XML与HTML的比较
- (二)XML语法
- 1、XML文档的声明
- 2、XML元素的定义
- 3、XML属性的定义
- 4、XML注释的定义
- 5、XML文件示例
- (三)DTD约束
- 1、什么是XML约束
- 2、什么是DTD约束
- 3、DTD约束文档的解释
- 4、DTD的引入
- (1)引入本地DTD文件
- (2)引入公共的DTD文件
- (3)采用内嵌方式实现DTD对XML的约束
- 5、DTD约束的语法
- (1)元素定义
- (2)元素内容
- (3)元素内容包含的符号
- (4)属性定义
- (5)属性设置说明
- (6)属性类型
- (四)Schema约束
- 1、什么是Schema约束
- 2、Schema约束的优点
- 3、Schema约束的文档
- 4、名称空间
- 5、声明名称空间的格式
- 6、引入Schema文档
- 7、Schema语法
- (1)元素定义
- (2)属性定义
- (3)简单类型
- (4)复杂类型
- 二、程序开发体系架构
- (一)C/S体系架构
- (二)B/S体系架构
- 三、Tomcat服务器
零、本讲学习目标
- 了解XML的概念
- 掌握XML语法
- 掌握DTD约束
- 掌握Schema约束
- 了解C/S体系架构与B/S体系架构
- 熟悉Tomcat的安装与启动
- 掌握在IntelliJ IDEA中配置Tomcat服务器的方法
Java Web是使用Java技术解决相关Web互联网领域的技术栈,开发一个完整的Java Web项目涉及到静态Web资源、动态Web资源的编写以及项目的部署。在Java Web中,静态Web资源开发技术包括HTML、CSS、JavaScript、XML等;动态Web资源开发技术包括JSP/Servlet等。本节将针对Java Web开发所用到的XML技术以及项目部署服务器Tomcat进行详细地讲解。
一、 XML基础
(一)XML概述
- 目标:了解XML的概念,能够知道HTML用于做什么
1、XML
- XML是EXtensible Markup Language的缩写,它是一种类似于HTML的标记语言,称为可扩展标记语言。XML用于提供数据描述格式,适用于不同应用程序之间的数据交换,而且这种交换不以预先定义的一组数据结构为前提,增强了可扩展性。
- 在现实生活中,很多事物之间都存在着一定的层次关系,例如中国有很多省份,每个省份下又有很多城市,这些中国与所辖省、市之间的层次关系可以通过一张树状结构图描述。

- 在XML文档中,通过元素的嵌套关系可以很准确地描述具有树状层次结构的复杂信息,因此,越来越多的应用程序都采用XML格式存放相关的配置信息,以便于读取和修改配置信息。
2、XML与HTML的比较
(1)HTML用于显示数据,XML用于传输和存储数据。
(2)HTML标签不区分大小写,而XML标记严格区分大小写。
(3)HTML可以有多个根元素,而格式良好的XML有且只能有一个根元素。
(4)在HTML中,空格是自动过滤的,而在XML中,空格不会自动过滤。
(5)HTML中的标签是预定义的标签,而XML中的标记可以根据需要自己定义,并且可扩展。
(二)XML语法
- 目标:掌握XML的语法,包括文档声明、元素声明、属性定义和注释
1、XML文档的声明
- 从XML 1.1开始,在一个完整的XML文档中,必须包含一个XML文档的声明,并且该声明必须位于文档的第一行。
- XML文档声明的语法格式:
<?xml version="version" encoding="value" standalone="value"?>
| 属性 | 说明 |
|---|---|
| version | 用于指定遵循XML规范的版本号。在XML声明中必须包含version属性,且该属性必须放在XML声明中其他属性之前。 |
| encoding | 用来指定XML文档所使用的编码集。 |
| standalone | 用来指定该XML文档是否和一个外部文档嵌套使用,取值为yes或no。如果设置属性值为yes,说明是一个独立的XML文档,与外部文件无关联;如果设置属性值为no,说明XML文档不独立。 |
2、XML元素的定义
- XML文档中的主体内容都是由元素(Element)组成的,元素是以树形分层结构排列的,一个元素可以嵌套在另一个元素中。XML文档中有且仅有一个顶层元素,称为文档元素或根元素。元素一般是由开始标签、属性、元素内容和结束标签构成。
<售价 单位="元">100</售价>
3、XML属性的定义
- 在XML文档中,可以为元素定义属性。属性是对元素的进一步描述和说明。在一个元素中,可以自定义多个属性,属性是依附于元素存在的,并且每个属性都有自己的名称和取值。
<售价 单位="元">100</售价>
- 需要注意的是,在XML文档中,属性的命名规范与元素相同,属性值必须要用双引号(“”)或者单引号(‘’)引起来,否则被视为错误。
4、XML注释的定义
- 注释是为了便于阅读和理解,如果想在XML文档中插入一些附加信息,比如作者姓名、地址或电话等,这些信息是对文档结构或文档内容的解释,不属于XML文档的内容,因此XML解析器不会处理注释内容。XML文档的注释以字符串“
<!--”开始,以字符串“-->”结束。
<!--注释信息-->
5、XML文件示例
- 早餐菜单
<?xml version="1.0" encoding="UTF-8"?>
<breakfast><food><name>Belgian Waffles</name><price>$5.95</price><description>two of our famous Belgian Waffles with plenty of real maple syrup</description><calories>800</calories></food><food><name>Strawberry Belgian Waffles</name><price>$4.50</price><description>light Belgian waffles covered with strawberries and whipped cream</description><calories>300</calories></food><food><name>Berry-Berry Belgian Waffles</name><price>$8.95</price><description>light Belgian waffles covered with an assortment of fresh berries and whipped cream</description><calories>900</calories></food><food><name>French Toast</name><price>$4.50</price><description>thick slices made from our homemade sourdough bread</description><calories>550</calories></food><food><name>Homestyle Breakfast</name><price>$6.95</price><description>two eggs, bacon or sausage, toast, and our ever-popular hash browns</description><calories>950</calories></food>
</breakfast>
- Spring项目的
pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>net.huawei.spring</groupId><artifactId>SpringDemo</artifactId><version>1.0-SNAPSHOT</version><dependencies><!--Spring核心--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.25</version></dependency> <!--单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>
(三)DTD约束
- 目标:掌握DTD约束的引入和DTD约束的语法
1、什么是XML约束
- XML文档中的标签是可以随意定义的,同一本书出现了两种售价,如果仅根据标签名称区分哪个是原价,哪个是会员价,这是很难实现的。为此,在XML文档中,定义了一套规则对文档中的内容进行约束,这套规则称为XML约束。对XML文档进行约束时,同样需要遵守一定的语法规则,这种语法规则就形成了XML约束语言。
2、什么是DTD约束
- DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件。在一个DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义以及实体和符号的定义。
- 通过一个案例简单认识一下DTD约束,创建
book.xml文件

<?xml version="1.1" encoding="UTF-8"?>
<书架><书><书名>徒然草</书名><作者>吉田兼好</作者><售价>34.00元</售价></书><书><书名>精通Spring框架</书名><作者>魏赫布</作者><售价>49.00元</售价></书>
</书架>
- 创建
book.dtd文件

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
book.dtd是一个简单的DTD约束文档。每个元素都是按照book.dtd文档所规定的约束进行编写的。
3、DTD约束文档的解释
(1)<!ELEMENT …>语句定义了一个元素,其中“书架”是元素的名称,“(书+)”表示书架元素中有一个或者多个名称为“书”的元素,其中字符“+”表示它所修饰的元素必须出现一次或者多次。
(2)“书”是元素名称,“(书名,作者,售价)”表示元素书包含书名、作者、售价这三个子元素,并且这些子元素要按照顺序依次出现。
(3)“书名”、“作者”和“售价”都是元素名称,“(#PCDATA)”表示元素中嵌套的内容是普通的文本字符串。
4、DTD的引入
- 在XML文档中引入外部DTD文件有两种方式
第1种方式: <!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
第2种方式: <!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
- 第1种方式用来引用本地的DTD文件;第2种方式用来引用公共的DTD文件,其中“外部DTD文件的URI”指的是DTD文件在本地存放的位置,对于第1种方式,它可以是XML文档的相对路径,也可以是一个绝对路径,对于第2种方式,它是Internet上的一个绝对URL地址。
(1)引入本地DTD文件
- 对文件
book.xml进行修改,在XML文档中引入本地的DTD文件book.dtd

<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架><书><书名>徒然草</书名><作者>吉田兼好</作者><售价>34.00元</售价></书><书><书名>精通Spring框架</书名><作者>魏赫布</作者><售价>49.00元</售价></书>
</书架>
(2)引入公共的DTD文件
- 引入一个公共的DTD文件,则需要在DOCTYPE声明语句中使用PUBLIC属性
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">
- 其中"
-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"是DTD名称,它用于说明DTD符合的标准、所有者的名称以及对DTD描述的文件进行说明,虽然DTD名称看上去比较复杂,但这完全是由DTD文件发布者去考虑的事情,XML文件的编写者只要把DTD文件发布者事先定义好的DTD标识名称进行复制就可以了。
(3)采用内嵌方式实现DTD对XML的约束
- DTD对XML文档的约束,除了通过外部引入方式实现外,还可以采用内嵌的方式。
- 在XML中直接嵌入DTD定义语句的完整语法格式
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 根元素名 [DTD定义语句……
]>
- 对
book.xml进行修改,在book.xml文档中直接嵌入book.dtd文件

<?xml version="1.1" encoding="UTF-8"?>
<!DOCTYPE 书架 [<!ELEMENT 书架 (书+)><!ELEMENT 书 (书名,作者,售价)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 售价 (#PCDATA)>
]>
<书架><书><书名>徒然草</书名><作者>吉田兼好</作者><售价>34.00元</售价></书><书><书名>精通Spring框架</书名><作者>魏赫布</作者><售价>49.00元</售价></书>
</书架>
5、DTD约束的语法
- 在编写XML文档时,需要掌握XML语法。同理,在编写DTD文档时,也需要遵循DTD的语法。DTD的结构一般由元素类型定义、属性定义、实体定义、记号定义等构成,一个典型的DTD文档类型定义会把将来要创建的XML文档的元素结构、属性类型、实体引用等预先进行定义。
(1)元素定义
- 元素是XML文档的基本组成部分,在DTD定义中,每一条
<!ELEMENT…>语句用于定义一个元素 - 基本语法格式:
<!ELEMENT 元素名称 元素内容> - 在上面元素的定义语法格式中,包含了“元素名称”和“元素内容”。其中,“元素名称”是被约束的XML文档中的元素,“元素内容”是对元素包含内容的声明,其内容包括数据类型和符号两部分。
(2)元素内容
| 元素 | 说明 |
|---|---|
| #PCDATA | 表示元素中嵌套的内容是普通文本字符串,其中关键字PCDATA是Parsed Character Data的简写。 |
| 子元素 | 说明元素包含其他元素。通常用一对小括号()将元素中要嵌套的一组子元素括起来。 |
| 混合内容 | 表示元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个。 |
| EMPTY | 表示该元素既不包含字符数据,也不包含子元素,是一个空元素。如果在文档中元素本身已经表明了明确的含义,就可以在DTD中用关键字EMPTY表明空元素。 |
| ANY | 表示该元素可以包含任何字符数据和子元素。 |
(3)元素内容包含的符号
- 在定义元素时,元素内容可以包含一些符号,不同的符号具有不同的作用
| 符号 | 作用 |
|---|---|
| 问号[?] | 表示该对象可以出现0次或1次 |
| 星号[*] | 表示该对象可以出现0次或多次 |
| 加号[+] | 表示该对象可以出现1次或多次 |
| 竖线[|] | 表示列出的对象中选择1个 |
| 逗号[,] | 表示对象必须按照指定的顺序出现 |
| 括号[()] | 用于给元素进行分组 |
(4)属性定义
- 在DTD文档中,定义元素的同时,还可以为元素定义属性。
- DTD属性定义的基本语法格式
<!ATTLIST 元素名属性名1 属性类型 设置说明属性名2 属性类型 设置说明......
>
- 在上面属性定义的语法格式中,“元素名”是属性所属元素的名字,“属性名”是属性的名称,“属性类型”则是用来指定该属性是属于哪种类型,“设置说明”用来说明该属性是否必须出现。
(5)属性设置说明
| 设置说明 | 含义 |
|---|---|
| #REQUIRED | 表示元素的该属性是必须的,例如,当定义联系人信息的DTD时,我们希望每一个联系人都有一个联系电话属性,这时,可以在属性声明时,使用REQUIRED |
| #IMPLIED | 表示元素可以包含该属性,也可以不包含该属性。例如,当定义一本书的信息时,发现书的页数属性对读者无关紧要,这时,在属性声明时,可以使用IMPLIED |
| #FIXED | 表示一个固定的属性默认值,在XML文档中不能将该属性设置为其他值。使用#FIXED关键字时,还需要为该属性提供一个默认值。当XML文档中没有定义该属性时,其值将被自动设置为DTD中定义的默认值 |
| 默认值 | 和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值。不同的是,该属性的值是可以改变的,如果XML文件中设置了该属性,新的属性值会覆盖DTD中定义的默认值 |
(6)属性类型
CDATA是最常用的一种属性类型,表明属性类型是字符数据,与元素内容说明中的#PCDATA相同。当然,在属性设置值中出现的特殊字符,也需要使用其转义字符序列表示,例如,用“&”表示字符“&”,用“<”表示字符“<”等。Enumerated(枚举类型),在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于Enumerated(枚举类型)- 一个
ID类型的属性用于唯一标识XML文档中的某个元素。ID类型的属性值必须遵守XML名称定义的规则。一个元素只能有一个ID类型的属性,而且ID类型的属性必须设置为#IMPLIED或#REQUIRED。因为ID类型属性的每一个取值都是用来标识一个特定的元素,所以为ID类型的属性提供默认值,特别是固定的默认值是毫无意义的。 - 除了讲述的几种属性类型外,DTD约束中还有
IDREF、IDREFS、NMTOKEN、NMTOKENS、NOTATION、ENTITY和ENTITYS几种属性类型,由于篇幅有限,此处就不一一列举。
(四)Schema约束
- 目标:掌握Schema约束的名称空间,如何引入Schema文档,以及Schema语法
1、什么是Schema约束
- 同DTD一样,XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,它的出现克服了DTD 的局限性。
2、Schema约束的优点
(1)DTD采用的是非XML语法格式,缺乏对文档结构、元素、数据类型等全面的描述。XML Schema采用的是XML语法格式,而且它本身也是一种XML文档,因此,XML Schema语法格式比DTD更好理解。
(2)XML有非常高的合法性要求,XML DTD对XML的描述,往往也被用作验证XML合法性的一个基础,但是XML DTD本身的合法性却缺少较好的验证机制,必需独立处理。XML Schema则不同,它与XML有着同样的合法性验证机制。
(3)XML Schema对名称空间支持得非常好,而DTD几乎不支持名称空间。
(4)DTD支持的数据类型非常有限。
(5)DTD定义约束的能力非常有限,无法对XML实例文档作出更细致的语义限制。
3、Schema约束的文档
- XML Schema的功能比DTD强大很多,但相应的语法也比DTD复杂很多。
- 看一个简单的Schema文档
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><xs:element name="root" type="xs:string"/>
</xs:schema>
- Schema文档,以
xsd作为后缀名,以xs:schema作为根元素,表示模式定义的开始。

4、名称空间
- 一个XML文档可以引入多个约束文档,但是,由于约束文档中的元素或属性都是自定义的,所以在XML文档中,极有可能出现代表不同含义的同名元素或属性,导致名称发生冲突。为此,在XML文档中,提供了名称空间,它可以唯一标识一个元素或者属性。这就好比打车去小营,由于北京有两个地方叫小营,为了避免司机走错,我们就会说“去亚运村的小营”或者“去清河的小营”。这时的亚运村或者清河就相当于一个名称空间。
5、声明名称空间的格式
- 名称空间的声明就是在XML文档中为某个模式文档的名称空间指定一个临时名称,它通过一系列的保留属性来声明,这种属性的名字必须是以“
xmlns”或者以“xmlns:”作为前缀。它与其他任何XML属性一样,都可以通过直接或者使用默认的方式给出。 - 名称空间声明的语法格式:
<元素名 xmlns:prefixname="URI"> - 注意:元素名指的是在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性,以及该元素中嵌套的所有元素及其属性。
xmlns:prefixname指的是该元素的属性名,它所对应的值是一个URI引用,用来标识该名称空间的名称。需要注意的是,如果有两个URI并且其组成的字符完全相同,就可以认为它们标识的是同一个名称空间。 - 创建
book2.xml,在book2.xml文档中学习名称空间的使用。

<?xml version="1.1" encoding="UTF-8"?>
<lzy:书架 xmlns:lzy="http://www.lzy.org/xmlbook/schema"><lzy:书><lzy:书名>徒然草</lzy:书名><lzy:作者>吉田兼好</lzy:作者><lzy:售价>34.00元</lzy:售价></lzy:书><lzy:书><lzy:书名>精通Spring框架</lzy:书名><lzy:作者>魏赫布</lzy:作者><lzy:售价>49.00元</lzy:售价></lzy:书>
</lzy:书架>
- 注意:在声明名称空间时,有两个前缀是不允许使用的,它们是
xml和xmlns。xml前缀被定义为与名称空间名字http://www.w3.org/XML/1998/namespace绑定,只能用于XML 1.0规范中定义的xml:space和xml:lang属性。前缀xmlns仅用于声明名称空间的绑定,它被定义为与名称空间名字http://www.w3.org/2000/xmlns绑定。
6、引入Schema文档
| 引入方式 | 说明 |
|---|---|
| 使用名称空间引入XML Schema文档 | 在使用名称空间引入XML Schema文档时,需要通过属性xsi:schemaLocation来声明名称空间的文档,xsi:schemaLocation属性是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的,在该属性中,包含了两个URI,这两个URI之间用空白符分隔。其中,第一个URI是名称空间的名称,第二个URI是文档的位置。 |
| 通过xsi:noNamespaceSchemaLocation属性直接指定 | 通过xsi:noNamespaceSchemaLocation属性直接指定,noNamespaceSchemaLocation属性也是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的,它用于定义指定文档的位置。 |
7、Schema语法
(1)元素定义
- Schema和DTD一样,都可以定义XML文档中的元素。
- 在Schema文档中,元素定义的语法格式:
<xs:element name="名称" type="类型"/> element用于声明一个元素,名称指的是元素的名称,类型指元素的数据类型。- 在XML Schema 中有很多内建的数据类型,最常用的类型如下表
| 类型 | 说明 |
|---|---|
| xs:string | 表示字符串类型 |
| xs:decimal | 表示小数类型 |
| xs:integer | 表示整数类型 |
| xs:boolean | 表示布尔类型 |
| xs:date | 表示日期类型 |
| xs:time | 表示时间类型 |
- 使用元素的定义的XML示例代码
<lastname>Smith</lastname>
<age>28</age>
<dateborn>1980-03-27</dateborn>
- 这三个元素对应的Schema定义如下所示
<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 name="xxx" type="yyy"/> xxx指的是属性名称,yyy指的是属性的数据类型。其中,属性的常用数据类型与元素相同,都使用的是XML Schema中内创建的数据类型。
(3)简单类型
- 在XML Schema文档中,只包含字符数据的元素都是简单类型的。简单类型使用
xs:simpleType元素来定义。如果想对现有元素内容的类型进行限制,则需要使用xs:restriction元素。接下来通过以下几种情况详细介绍如何对简单类型元素的内容进行限定。 - xs:minInclusive和xs:maxInclusive元素对值的限定
例如,当我们定义一个雇员的年龄时,雇员的年龄要求是18~58周岁之间,这时,需要对年龄“age”这个元素进行限定,具体示例代码如下所示:
<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>
- xs:enumeration元素对一组值的限定
如果希望将 XML 元素的内容限制为一组可接受的值,可以使用枚举约束(enumeration constraint),例如,要限定一个元素名为Car的元素,可接受的值只有:Audi、Golf、BMW,具体示例如下:
<xs:element name="car"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="Audi"/><xs:enumeration value="Golf"/><xs:enumeration value="BMW"/></xs:restriction></xs:simpleType>
</xs:element>
- xs:pattern元素对一系列值的限定
如果希望把 XML 元素的内容限制定义为一系列可使用的数字或字母,可以使用模式约束(pattern constraint)。例如,要定义一个带有限定的元素“letter”,要求可接受的值只能是字母a-z其中一个,具体示例如下:
<xs:element name="letter"><xs:simpleType><xs:restriction base="xs:string"><xs:pattern value="[a-z]"/></xs:restriction></xs:simpleType>
</xs:element>
- xs:restriction元素对空白字符的限定
在XML文档中,空白字符比较特殊,如果需要对空白字符(whitespace characters)进行处理,可以使用whiteSpace元素。whiteSpace元素有三个属性值可以设定,分别是preserve、replace和collapse。其中,preserve表示不对元素中的任何空白字符进行处理,replace表示移除所有的空白字符,collapse表示将所有的空白字符缩减为一个单一字符。接下来以preserve为例,学习如何对空白字符进行限定,具体示例如下:
<xs:element name="address"><xs:simpleType><xs:restriction base="xs:string"><xs:whiteSpace value="preserve"/></xs:restriction></xs:simpleType>
</xs:element>
(4)复杂类型
- 在定义复杂类型时,需要使用xs:complexContent元素来定义。复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素。在定义复合元素时,如果元素的开始标签和结束标签之间只包含字符数据内容,那么这样的内容是简易内容,需要使用xs:simpleContent元素来定义。反之,元素的内容都是复杂内容,需要使用xs:complexContent元素来定义。复合元素有4种基本类型,接下来针对这4种基本类型分别进行讲解。
- 空元素
这里的空元素指不包含内容,只包含属性的元素,具体示例如下:
<product prodid="2023001" />
- 在上面的元素定义中,没有定义元素“product”的内容,这时,空元素在XML Schema文档中对应的定义方式如下所示:
<xs:element name="product"><xs:complexType><xs:attribute name="prodid" type="xs:positiveInteger"/></xs:complexType>
</xs:element>
- 包含其他元素的元素
对于XML文档中包含其他元素的元素,例如下面的示例代码:
<person><firstname>John</firstname><lastname>Smith</lastname>
</person>
- 元素person嵌套了两个元素,分别是“firstname”和“lastname”。这时,在Schema文档中对应的定义方式如下所示:
<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>
- 仅包含文本的元素
对于仅含文本的复合元素,需要使用“simpleContent”元素添加内容。在使用简易内容时,必须在“simpleContent”元素内定义扩展或限定,这时,需要使用“extension”或“restriction”元素来扩展或限制元素的基本简易类型。请看一个XML的简易例子,其中,“shoesize”仅包含文本,具体示例如下:
<shoesize country="france">35</shoesize>
- 元素“shoesize”包含了属性以及元素内容,针对这种仅包含文本的元素,需要使用extension来对元素的类型进行扩展,在Schema文档中对应的定义方式如下所示:
<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>
- 包含元素和文本的元素
在XML文档中,某些元素经常需要包含文本以及其他元素,例如,下面的这段XML文档:
<letter>Dear Mr.<name>John Smith</name>.Your order <orderid>1032</orderid>will be shipped on <shipdate>2001-07-13</shipdate>.
</letter>
- 在Schema文档中对应的定义方式如下所示:
<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>
- 注意:为了使字符数据可以出现在“letter”元素的子元素之间,使用了mixed属性,该属性用来规定是否允许字符数据出现在复杂类型的子元素之间,默认情况下mixed的值为false。
二、程序开发体系架构
- 目标:了解C/S体系架构和B/S体系架构
(一)C/S体系架构
- C/S是Client/Server的缩写,即客户端/服务器架构。在开发的过程中,客户端需要安装相应的软件才能连接服务器,并且客户端软件承担所有的逻辑和运算,服务器只提供数据交互的一种体系架构。

- C/S架构的局限性

(二)B/S体系架构
- B/S是Browser/Server的缩写,即浏览器/服务器架构。在开发过程中,客户端只需要一个浏览器,即可以实现与服务器交互,服务器承担所有的逻辑和计算,浏览器只负责将结果显示在屏幕上的一种体系架构。B/S架构最大的优点是客户机上无需安装专门的客户端程序,程序中的业务逻辑处理都集中到了Web服务器上,客户机只要安装一个浏览器就能通过Web服务器与数据库进行交互,并将交互的结果以网页的形式展现在浏览器中。

- 浏览器并不是直接与数据库服务器建立连接,而是通过Web服务器与数据库服务器需要建立连接。由此可见,B/S架构可以有效地解决数据库并发数量有限的问题。
- B/S架构的工作原理

三、Tomcat服务器
相关文章:
动态网站开发讲课笔记02:Java Web概述
文章目录零、本讲学习目标一、 XML基础(一)XML概述1、XML2、XML与HTML的比较(二)XML语法1、XML文档的声明2、XML元素的定义3、XML属性的定义4、XML注释的定义5、XML文件示例(三)DTD约束1、什么是XML约束2、…...
如何保护 IP 地址的隐私问题
是不是只有运营商才能查到某个人的住址信息呢?在大数据时代的今天,各种互联网应用收集了大量的数据信息,它们其实也可以根据这些信息,推断出某个人的大致地址位置。例如百度地图会一直用 App SDK 以及网页的方式记录 IP 和地址位置…...
高并发系统设计之限流
本文已收录至Github,推荐阅读 👉 Java随想录 文章目录限流算法计数器算法滑动窗口漏桶算法令牌桶算法限流算法实现Guava RateLimiter实现限流令牌预分配预热限流Nginx 限流limit_connlimit_req黑白名单限流这篇文章来讲讲限流,在高并发系统中…...
ZCMU--5286: Rose的字符串(C语言)
Description 一天Rose同学想得到一个仅由01组成的字符串S,Jack同学为了让Rose同学开心,于是打算去商店购买另一个也仅由01组成的字符串T。而商店的字符串价格由它的长度决定,比如字符串011售价3元,001011售价6元,商店…...
MAC下搭建hadoop
一:简介 Hadoop是一个用Java开发的开源框架,它允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器,每个都提供本地计算和存储。特别适合写一次,读多次的场景。 Hado…...
Python如何实现自动登录和下单的脚本,请看selenium的表演
前言 学python对selenium应该不陌生吧 Selenium 是最广泛使用的开源 Web UI(用户界面)自动化测试套件之一。Selenium 支持的语言包括C#,Java,Perl,PHP,Python 和 Ruby。目前,Selenium Web 驱动…...
华为OD机试真题Python实现【关联子串】真题+解题思路+代码(20222023)
关联子串 题目 给定两个字符串str1和str2 如果字符串str1中的字符,经过排列组合后的字符串中 只要有一个是str2的子串 则认为str1是str2的关联子串 若不是关联子串则返回-1 示例一: 输入: str1="abc",str2="efghicaibii" 输出: -1 预制条件: 输入的…...
Flutter+【三棵树】
定义 在Flutter中和Widgets一起协同工作的还有另外两个伙伴:Elements和RenderObjects;由于它们都是有着树形结构,所以经常会称它们为三棵树。 这三棵树分别是:Widget、Element、RenderObject Widget树:寄存烘托内容…...
若依系统【SpringBoot】如何集成qq邮件发送【超详细,建议收藏】
若依系统的部署博主就不在这儿阐述了,默认大家的电脑已经部署好了若依系统,这里直接开始集成邮件系统,首先我们得需要对qq邮箱进行配置;一套学不会你来打我😀; 一、开启我们的qq邮箱发送邮件的配置 1、先进…...
kettle使用--1.mysql多表关联导入mongoDB
文章目录1. 初步体验:csv 转为excelKettle概念配置mysql链接mysql 一对多关联查询结果保存到mongodb中1. 初步体验:csv 转为excel Windows环境下安装pdi-ce-8.0.0.0-28.zip ,解压后执行lib下的Spoon.bat 将csv输入拖入 双击拖进去的csv&…...
2023年CDGA考试-第10章-参考数据和主数据(含答案)
2023年CDGA考试-第10章-参考数据和主数据(含答案) 单选题 1.实现主数据中心环境的三种基本方法中不包括哪种? A.参考目录 B.注册表 C.交易中心 D.混合模式 答案 A 2.参考数据还具有很多区别于其他主数据 (例如,企业结构数据和交易结构数据)的特征。以下哪项目描述错误的…...
2023年,什么行业更有发展前景?
关于有前景有发展的行业推荐,小课今天还是推荐咱们IT互联网行业。 很多人会说现在懂电脑的那么多,这个行业都饱和了,很多学电脑的找不到工作都改行了。但事实是现在每个行各业都需要互联网,需要懂电脑的技术人才,尤其是在云计算、大数据到来…...
致盛咨询携手亚马逊云科技进一步开拓中国市场
作为医疗保健领域的咨询公司,ZS需要保证服务可靠性、敏捷性和安全性的同时,获得经济效益。亚马逊云科技丰富的云服务产品简化了ZS基础架构的搭建,为ZS节省了大量的人力与资金成本。同时,缩短了ZS扩展基础设施的周转时间࿰…...
ts之 命名空间 namespace、三斜线指令、声明文件(declare 声明ts的变量函数第三方模块等 )
目录ts之 命名空间 namespacets之 命名空间 namespacets之 三斜线指令 ( 引入其他.ts文件 )app.tsindex.tsts之 声明文件 d.ts - declare01:declare声明express第三方模块typings 为代码或者第三方模块 编写声明文件index.ts02:de…...
Day898.Join语句执行流程 -MySQL实战
Join语句执行流程 Hi,我是阿昌,今天学习记录的是关于Join语句执行流程的内容。 在实际生产中,关于 join 语句使用的问题,一般会集中在以下两类: 不让使用 join,使用 join 有什么问题呢?如果有…...
ChatGPT商业前景如何?人工智能未来会如何发展?
ChatGPT不仅在互联网和多个行业引发人们的关注,在投资界还掀起了机构对人工智能领域的投资热潮。人工智能聊天程序ChatGPT在去年11月亮相之后,在推出仅两个月后,今年1月份的月活用户已达到了1亿,成为史上增长最快的消费者应用程序…...
代码随想录第十六天(347、194、195、94)
347. 前 K 个高频元素 答案 思路: 1、首先,用到了每个值对应的出现次数,想到要用哈希map存放 2、还需要将出现频率从大到小进行排序,找出前k个元素 3、时间复杂度应该比O(nlogn)小 如果想用快速排序&…...
< elementUI组件样式及功能补全: 实现点击steps组件跳转对应步骤 >
文章目录👉 前言👉 一、效果演示👉 二、点击steps跳转效果实现👉 三、实现案例往期内容 💨👉 前言 在 Vue elementUi 开发中,elementUI中steps步骤条组件只提供了change方法,并未提…...
【学习笔记】互联网金融:芝麻信用分的建模过程
学习资料: 数据分析学习随记 | 互联网金融行业2C授信模型(芝麻信用) 1. 背景 互联网金融的本质是风控。 1.1 数据分析师的角色 数据分析师在金融行业基本上有两种角色: 1.1.1 数据建模师 偏算法,但要很懂业务。要求对算法的理解较深&am…...
Linux C/C++或者嵌入式开发到底有没有35岁危机?
一个读者问了一个问题: 我现在25岁,双非一本本科。在深圳上班,做嵌入式开发,打算走Linux C/C开发,工资目前一般。读了前辈写的很多博客之后,觉得很棒。我现在有一些疑问。 1.最近互联网裁员很厉害嘛&#x…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
