第2章 Java Web概述
学习目标
- 了解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、Json等;动态Web资源开发技术包括ASP、PHP、JSP/Servlet、SSM、SpringBoot、SpringCloud等。
1. XML基础
1.1 XML概述
extense 英[eks'tens]
extensible 英[ɪk'stensəbl]
consort 英[kənˈsɔ:tiəm]
consortium 英[kənˈsɔ:tiəm]
quire 英[ˈkwaɪə(r)]
required 英[rɪ'kwaɪəd]
XML是EXtensible Markup Language的缩写,它是一种类似于HTML的标记语言,称为可扩展标记语言。
XML是由W3C组织推出的,它是一种通用的数据存储和交换格式,可以使数据在各种应用程序之间轻松地实现数据的交换,而且这种交换不以预先定义的数据结构为前提,增强了可扩展性。
W3C组织简介
W3C(World Wide Web Consortium),即万维网联盟。万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构,又称W3C理事会。
两种主要的树型层次结构xml和json:
在XML文档中,通过元素的嵌套关系可以很准确地描述具有树状层次结构的复杂信息,另外一种更易、更广泛应用描述树型层次结构的数据格式是JSON。
- xml https://www.w3school.com.cn/xml/index.asp https://www.w3.org/TR/xml11/
- json https://www.json.org/json-zh.html
XML与HTML的比较
XML | HTML | |
---|---|---|
1用途 | 标记用来描述信息 | 标记用来显示数据--网页显示 |
2大小写 | 严格区分大小写 | 不区分大小写 |
3空格 | 空格不会自动删除 | 空格会自动过滤或多个连续的空白符会压缩为1个空格显示 |
4标记 | 标记是可以随便定义的 | 标记是预定义的 |
5属性值 | 属性值必须放在引号中 | 属性值引号是可用可不用的,甚至可只有属性名没有属性值 |
6根元素 | 只能有一个根元素 |
1.2 XML语法
xml的语法结构:
- xml文档声明:<?xml version="1.0"?>
- 元素:<xxx>实体</xxx> 空元素如 <hr />
- 属性:属性名="属性值" 属性名2="属性值2"
- 实体: 内容可以是文本,也可以子元素
- CDATA段:
<![CDATA[ ... ]]>
(1) 文档声明
<?xml 版本信息 [编码信息] [文档独立性信息] ?>
- 文档声明必须为<?xml开头,以?>结束;
- 文档声明必须从文档的0行0列位置开始;
- 文档声明只有三个属性:
- versioin:指定XML文档版本。必选,只能选择1.0或1.1,XML 1.1允许在名称中使用几乎所有的Unicode字符。;
- encoding:指定当前文档的编码。可选,默认值是utf-8;
- standalone:指定文档独立性。可选,默认值为yes,表示当前文档是独立文档。如果为no表示当前文档不是独立的文档,会依赖外部文件。通常解析器不理睬
声明版本 必选
<?xml version="1.0"?>
<?xml version="1.1"?>
声明编码 可选
<?xml version="1.0" encoding="gb2312"?>
省路encoding,默认指utf-8
声明独立性 -- 通常解析器不理睬
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
【例1】写写与你有关联的 01_city.xml
<?xml version="1.0" ?>
<中国>
<省市 名称="北京">
<地市>朝阳区</地市>
</省市>
<省市 名称="山西">
<地市>太原</地市>
<地市>长治</地市>
<地市>晋中
<县市>平遥</县市>
</地市>
</省市>
</中国>
(2) 元素定义
XML文档中,主体内容都是由元素(Element)组成的。
元素、属性命名规则:
- 区分大小写
- 不能包含空格、冒号、分号、逗号和尖括号等,元素不能以数字开头
- 建议
- 建议不要使用点"."和减号"-","."用于引用对象的属性、"-"表达式运算冲突。
- 建议不要以字符组合xml(或XML、Xml等)开头
- 建议名称要么全部大写,要么全部小写
- 建议名称可使用英文字符,可以使用中文字符
- 普通结构:开始标签、元素体、结束标签,例如:
<姓名>许杰</姓名>
- 空元素结构:开始标签,没有元素体,和结束标签,例如:<工资/>
- 元素体:内容可以是文本,也可以子元素!例如:
<姓名> 许杰 <工资>54</工资> </姓名>
- 允许嵌套不许交叉。不能出现错误嵌套:(这是错误的!)
<a><b></a></b>
(3) 属性定义
- 属性是元素的一部分,它只能出现在元素的开始标签中。
- 一个元素可以有N个属性,其中属性的结构:属性名="属性值",其中属性值必须使用单引或双引。
多个属性中间用空格分隔。不是逗号
<学生 学号="138345744489" 姓名="许杰" 年龄="58"/>
<学生 学号="138345744489" 姓名="许杰" 年龄=58/> 不能这样属性不带引号
<学生 学号='138345744489' 姓名="许杰"><年龄>58</年龄></学生>
【例2】与你有关的书籍02_book.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书>
<书名>Java基础案例教程</书名>
<作者>黑马程序员</作者>
<售价>54.00元</售价>
</书>
<书>
<书名>Java基础入门</书名>
<作者>黑马程序员</作者>
<售价>59.00元</售价>
</书>
<书>
<书名>SQL Server数据库管理及应用技术教程与实训(第2版)</书名>
<作者>杜兆将</作者>
<售价>40.00元</售价>
</书>
</书架>
(4) 注释
以<!--开头,以-->结束。其中的内容是不会被解析器读取的!
- 注释不能出现在XML声明之前。
- 注释不能出现在标签之内。
- 字符串"--"不能在注释中出现。
- 不能以"--->"结束。
- 注释不能嵌套
(5) 特殊字符处理
字符 | 预定义实体引用 | 单词 |
---|---|---|
< | < | less than[les ðæn]较少 |
> | > | greater than[ˈgreɪtə ðæn] |
" | " | quote[kwoʊt]引用 |
' | ' | apostrophe[əˈpɒstrəfi]撇号 |
& | & | ampersand [ˈæmpərsænd] & |
(6) CDATA区 -- 一般性了解
CDATA是Character Data的简写,即字符数据----一般指代码段。如果有很多特殊字符,那么可以放到CDATA段中,CDATA段中的特殊字符无需转义。
CDATA代码段的java.xml
<?xml version="1.0" ?>
<code>
<![CDATA[
String name="hello";
int a=10;
if(a > 100 && a<1000){
system.out.println("许杰编写");
}
]]>
</code>
格式良好的XML
- 就是语法正确的!
- 必须有xml文档声明
- 不能无理嵌套
- 属性必须使用单引或双引
- 属性和元素的命名:字母(包括汉字)、数字、下划线、减号,但其中数字不能开头。
1.3 DTD约束
(1) 什么是约束
【例】成绩表.xml -- 两个分数
<?xml version="1.0" ?>
<成绩表>
<成绩>
<课程>JavaWeb程序设计</课程>
<同学>许杰</同学>
<分数>58</分数>
<分数>98</分数>
</成绩>
</成绩表>
【例】我班同学.xml -- 两人同一学号、同一身份证号
<?xml version="1.0" encoding="UTF-8"?>
<我班同学>
<同学>
<学号>20220008</学号>
<姓名>张三</姓名>
<身份证号>140101200205210002</身份证号>
</同学>
<同学>
<学号>20220008</学号>
<姓名>李四</姓名>
<身份证号>140101200205210002</身份证号>
</同学>
</我班同学>
XML文档中的标签是可以随意定义的,如同一本书出现了两种售价,同一学生同一门课程出现两个分数,同一学校出现两个同一学号的学生?为此,在XML文档中,定义了一套规则对文档中的内容进行约束,这套规则称为XML约束。对XML文档进行约束时,同样需要遵守一定的语法规则,这种语法规则就形成了XML约束语言。
对XML文档进行约束时,同样需要遵守一定的语法规则,这种语法规则就形成了XML约束语言。目前,最常用的两种约束语言是DTD约束和Schema约束。
(2) DTD约束
DTD(Document Type Definition),文档类型定义,用来约束XML文档。
理解DTD:在dtd文档中定义元素、定义属性,然后让某个xml与这个dtd关联,这时xml中只能出现在dtd中定义的元素了。
DTD的分类
1.内部DTD和外部DTD
2.外部DTD又分为:SYSTEM(本地的)和PUBLIC(网上的)
本地DTD
【例3】本地DTD的与你有关的书籍03_book.xml
book.dtd -- 与03_book.xml同一目录之下
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java基础案例教程</书名>
<作者>黑马程序员</作者>
<售价>54.00元</售价>
</书>
<书>
<书名>Java基础入门</书名>
<作者>黑马程序员</作者>
<售价>59.00元</售价>
</书>
<书>
<书名>SQL Server数据库管理及应用技术教程与实训(第2版)</书名>
<作者>杜兆将</作者>
<售价>40.00元</售价>
</书>
</书架>
公共DTD
【例4】公共DTD的与你有关的学生 04_students.xml
students.dtd 并上传到云端 http://101.42.158.247/students.dtd
<!ELEMENT students (学生+)>
<!ELEMENT 学生 (姓名,年龄?,性别)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
04_students.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE students PUBLIC "-//fjn//DTD ST1.0//ZH" "http://101.42.158.247/students.dtd">
<students>
<学生>
<姓名>张三</姓名>
<年龄>23</年龄>
<性别>男</性别>
</学生>
<学生>
<姓名>李四</姓名>
<年龄>25</年龄>
<!--性别>男</性别-->
</学生>
<学生>
<姓名>许杰</姓名>
<性别>女</性别>
</学生>
</students>
公共DTD一般来说由某个公司或权威组织发布的,供大家使用的DTD。
内部DTD
【例5】内部DTD的与你有关的书籍05_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元</售价>
</书>
<书>
<书名>SQL Server数据库管理及应用技术教程与实训(第2版)</书名>
<作者>杜兆将</作者>
<售价>40.00元</售价>
</书>
</书架>
- 位置:内部DTD在文档声明下面、在根元素上面;
- 语法格式:放到"<!DOCTYPE 根元素名称["和"]>"之间;
- 只对当前XML文档有效;
(3) DTD语法
(1) 元素定义 !ELEMENT
<!ELEMENT 元素名称 元素内容>
- #PCDATA:普通文本字符串,Parsed Character Data的简写。
- 子元素:元素包含的元素。通常用一对圆括号()将元素中要嵌套的一组子元素括起来,包含顺序。
- 混合内容:表示元素既可以包含字符数据,也可以包含子元素。如,<!ELEMENT 书(#PCDATA书名)*>。
- EMPTY:表示该元素既不包含字符数据,也不包含子元素,是一个空元素。
- ANY:表示该元素可以包含任何的字符数据和子元素。
①问号[?]:可以出现0次或1次。
②星号[*]:可以出现0次或多次。
③加号[+]:可以出现1次或多次。
④竖线[|]:表示在列出的对象中选择1个。
⑤逗号[,]:表示对象必须按照指定的顺序出现。
⑥括号[()]:用于给元素进行分组。
字符 | 次数 |
---|---|
? | 0或1次 |
* | 0或多次 |
+ | 1或多次 |
| | 其中选1 |
, | 顺序出现 |
() | 进行分组 |
(2) 属性定义 !ATTLIST
<!ATTLIST 元素名
属性名1 属性类型 设置说明
属性名2 属性类型 设置说明
...
>
4种设置说明
① #REQUIRED 必需的。
② #IMPLIED 可以包含该属性,也可以不包含该属性。
③ #FIXED 默认值。
④ 默认值
和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值、不同的是,该属性的值是可以改变的,如果XML文件中设罟了该属性,新的属性
10种属性类型
① CDATA 字符数据,与元素内容说明中的#PCDATA相同。当然,在属性设置值中出现的特殊字符,也需要使用其转义字符序列
② Enumerated 枚举
【例6】内部DTD--属性取值:枚举 购物篮 06_enum.xml
<?xml version="1.0" ?>
<!DOCTYPE 购物篮 [
<!ELEMENT 购物篮 ANY>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 (鸡肉|牛肉|猪肉|鱼肉) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉 />
</购物篮>
③ ID 唯一标识
【例7】内部DTD--属性取值:ID唯一标识 联系人列表 07_id.xml
<?xml version="1.0" ?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人 (姓名,EMAIL)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
]>
<联系人列表>
<联系人 编号="山传20220001">
<姓名>张三</姓名>
<EMAIL>zhang@itcast.cn</EMAIL>
</联系人>
<联系人 编号="山传20220002">
<姓名>李四</姓名>
<EMAIL>li@itcast.cn</EMAIL>
</联系人>
<联系人 编号="山传20220004">
<姓名>许杰</姓名>
<EMAIL>du@itcast.cn</EMAIL>
</联系人>
<!--联系人 编号="20220005">
<姓名>许杰</姓名>
<EMAIL>du@itcast.cn</EMAIL>
</联系人-->
</联系人列表>
④ IDREF 引用关系
【例8】内部DTD--属性取值:IDREF 只对一的关系---引用 联系人列表 08_iderf.xml
<?xml version="1.0" ?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人 (姓名,EMAIL)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT EMAIL (#PCDATA)>
<!ATTLIST 联系人
编号 ID #REQUIRED
爱人 IDREF #IMPLIED>
]>
<联系人列表>
<联系人 编号="山传20220001">
<姓名>张三</姓名>
<EMAIL>zhang@itcast.org</EMAIL>
</联系人>
<联系人 编号="山传20220002" 上司="山传20220001">
<姓名>李四</姓名>
<EMAIL>li@itcast.org</EMAIL>
</联系人>
<联系人 编号="山传20220003" 上司="山传20220001">
<姓名>许杰</姓名>
<EMAIL>du@itcast.cn</EMAIL>
</联系人>
</联系人列表>
⑤ IDREFS 可对多的关系引用
【例9】内部DTD--属性取值:IDREFS 一对多的关系引用 图书借阅(1人可借阅多本图书) library.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 图书室[
<!ELEMENT 图书室 (图书s,借阅记录s)>
<!ELEMENT 图书s (图书+)>
<!ELEMENT 图书 (书名)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 借阅记录s (借阅记录+)>
<!ELEMENT 借阅记录 (借阅日期,读者)>
<!ELEMENT 借阅日期 (#PCDATA)>
<!ELEMENT 读者 EMPTY>
<!ATTLIST 图书 书号 ID #REQUIRED>
<!ATTLIST 读者 姓名 CDATA #REQUIRED>
<!ATTLIST 读者 借阅书号 IDREFS #REQUIRED>
]>
<图书室>
<图书s>
<图书 书号="b0101">
<书名>Java基础案例教程</书名>
</图书>
<图书 书号="b0102">
<书名>Java Web程序开发入门</书名>
</图书>
<图书 书号="b0103">
<书名>Java基础入门</书名>
</图书>
</图书s>
<借阅记录s>
<借阅记录>
<借阅日期>2013-03-13</借阅日期>
<读者 姓名="张三" 借阅书号="b0101 b0103"/>
</借阅记录>
<借阅记录>
<借阅日期>2013-05-23</借阅日期>
<读者 姓名="李四" 借阅书号="b0101 b0102 b0103"/>
</借阅记录>
<借阅记录>
<借阅日期>2013-07-23</借阅日期>
<读者 姓名="王五" 借阅书号="b0101 b0101 b0103"/>
</借阅记录>
</借阅记录s>
</图书室>
1.4. Schema约束
(1) 什么是Schema约束
Schema是新的xml约束,它与DTD的作用是相同的。
- DTD约束文件扩展名是dtd,Schema约束文件扩展名xsd
- DTD不是xml,Schema本身就是xml
- 要比DTD强大很多倍。它有更加详细的类型。
重点:名称空间
关于schema文件,它的根元素就是schema
在schema中元素分为简单元素与复杂元素
(2) 名称空间 xmlns
一个XML文档可以引入多个约束文档,但是,由于约束文档中的元素或属性都是自定义的,因此,在XML文档中,极有可能出现代表不同含义的同名元素或属性,导致名称发生冲突。为此,在XML文档中,提供了名称空间,它可以唯一标识一个元素或者属性。
名称空间声明的语法格式
<前缀名:根元素名 xmlns:前缀名="URI">
【例18】带前缀的命名空间book18.xml
<?xml version="1.0" encoding="UTF-8"?>
<it315:书架 xmlns:it315="http://www.it315.org/xmlbook/schema">
<it315:书>
<it315:书名>《SQL Server数据库管理及应用技术教程与实训(第2版)》</it315:书名>
<it315:作者>杜兆将</it315:作者>
<it315:售价>40.00元</it315:售价>
</it315:书>
</it315:书架>
默认名称空间
<根元素名 xmlns="URI">
【例19】默认名称空间(不带前缀) book19.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.it315.org/xmlbook/schema">
<书>
<书名>《SQL Server数据库管理及应用技术教程与实训(第2版)》</书名>
<作者>杜兆将</作者>
<售价 币种="人民币">40.00元</售价>
</书>
</书架>
(3) 引入Schema文档 .xsd
1.使用名称空间引入XML Schema文档
在使用名称空间引入XML Schema文档时,需要通过属性xsi:schemaLocation来声明名称空间的文档,xsi:schemaLocation属性是在标准名称空间"http://www.w3.org/2001/XMLSchema-instance"中定义的,在该属性中,包含两个URI,这两个URI之间用空白符分隔。其中,第一个URI是名称空间的名称,第二个URI是文档的位置。
【例20】使用名称空间引入XMLSchema文档 book20.xml
<?xml version="1.0" 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">
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
<书>
<书名>《SQL Server数据库管理及应用技术教程与实训(第2版)》</书名>
<作者>杜兆将</作者>
<售价>40.00元</售价>
</书>
</书架>
需要注意的是,一个XML实例文档可能引用多个名称空间。这时,可以在schemaLocation属性值中包含多对名称空间与它们所对应的XML Schema文档的存储位置,每一对名称空间的设置信息之间采用空格分隔。
【例21】一个XML文档中引入多个名称空间名称:book21.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:demo="http://www.it315.org/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema
http://www.it315.org/xmlbook.xsd
http://www.it315.org/demo/schema
http://www.it315.org/demo.xsd">
<书>
<书名>《SQL Server数据库管理及应用技术教程与实训(第2版)》</书名>
<作者>杜兆将</作者>
<售价 demo:币种="人民币">40.00元</售价>
</书>
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价 demo:币种="人民币">28.00元</售价>
</书>
</书架>
2.不使用名称空间引入XML Schema文档
【例22】不使用名称空间引入XML Schema文档:book22.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
<书>
<书名>《SQL Server数据库管理及应用技术教程与实训(第2版)》</书名>
<作者>杜兆将</作者>
<售价>40.00元</售价>
</书>
</书架>
(4) Schema语法(了解)
Schema文档(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>
<?xml version="1.0" ?>
<xs:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lovoinfo.com"
xmlns="http://www.lovoinfo.com"
elementFormDefault="qualified">
...
</xs:schema>
book.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.com"
elementFormDefault="qualified">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='书'>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string'/>
<xs:element name='作者' type='xs:string'/>
<xs:element name='售价' type='xs:string'/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
(1) 元素定义
<xs:element name="xxx" type="yyy"/>
.xml
<姓名>史密斯</姓名>
<年龄>28</年龄>
<生日>1980-03-27</生日>
.xsd 约束
<xs:element name="姓名" type="xs:string"/>
<xs:element name="年龄" type="xs:integer"/>
<xs:element name="生日" type="xs:date"/>
(2) 属性的定义
<xs:attribute name="xxx" type="yyy"/>
.xml
<姓名 母语="英语">史密斯</姓名>
.xsd 约束
<xs:attribute name="母语" type="xs:string"/>
(3) 简单类型
在XML Schema文档中,只包含字符数据的元素都是简单类型的。简单类型使用xs:simpleType元素来定义。如果想对现有元素内容的类型进行限制,则需要使用xs:restriction元素([rɪˈstrɪkʃn]限制、约束)。
1)xs:minInclusive和xs:maxInclusive元素对值的限定
·xsd
<xs:element name="年龄">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"/>
<xs:maxInclusive value="58"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
2)xs:enumeration元素对一组值的限定
·xsd
<xs:element name="直辖市">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:xs:enumeration value="北京"/>
<xs:xs:enumeration value="上海"/>
<xs:xs:enumeration value="天津"/>
<xs:xs:enumeration value="重庆"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
3)xs:pattern元素对一系列值的限定
·xsd
<xs:element name="单词">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:xs:pattern value="[A-Za-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
4)xs:whiteSpace元素对空白字符的限定
·xsd
<xs:element name="住址">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
whiteSpace取值:
- preserve:不对元素中的任何空白字符进行处理;
- replace:移除所有的空白字符;
- collapse:将所有的空白字符缩减为一个单一字符。
(4) 复杂类型
除简单类型之外的其他类型都是复杂类型,在定义复杂类型时,需要使用xs:complexContent元素来定义。复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素。
1)空元素
.xml
<产品 产品id="1345"/>
·xsd
<xs:element name="产品">
<xs:complexType>
<xs:attribute name="产品id" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
2)包含其他元素的元素
.xml
<教师>
<姓名>杜XX</姓名>
<年龄>58</年龄>
<生日>1963-1-1</生日>
</教师>
·xsd
<xs:element name="教师">
<xs:complexType>
<xs:sequence>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="年龄" type="xs:integer"/>
<xs:element name="生日" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
3)仅包含文本的元素 extension
.xml
<shoesize country="france">35</shoesize>
·xsd
<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>
4)包含元素和文本的元素
.xml
<录取通知书>
亲爱的<姓名>杜XX</姓名>同学:
您已被我校录取。录取通知书将通过顺丰快递送达。快递单号:<快递单号>1688</快递单号>,请与<报到日期>2021年9月1日</报到日期>来校报到。
</录取通知书>
·xsd
<xs:element name="录取通知书">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="姓名" type="xs:string"/>
<xs:element name="快递单号" type="xs:positiveInteger"/>
<xs:element name="报到日期" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Schema文档中出现的元素标记
元素类型 | 描述 | * |
---|---|---|
schema | 包含一个已经定义的schema | * |
elerment | 一个元素 | * |
attribute | 一个属性 | * |
simpleType | 一个简单类型 | |
complexType | 一个复合类型 | * |
group | 组 元素声明组合,被复合类型应用 | |
attributeGroup | 组 属性声明组合,被复合类型应用 | |
simpleContent | 应用于complexType,对它的内容进行约束和扩展等 | |
choice | 从一个特定数据类型的集合中选择定义一个简单类型元素 | * |
list | 从一个特定简单数据类型的集合中选择定义一个简单类型元素 | |
union | 定义一个属性或元素值,它必须在一个特定范围内 | |
unique | 允许唯一的一个元素从一个组中被选择 | |
sequence | 一个特定的序列 | * |
restriction | 定义一个约束条件 |
XML Schema中常用的预定义类型
数据类型 | 描述 | |
---|---|---|
string | 字符串 | |
boolean | 布尔型 | |
decimal | 特定精度的数字 | |
float | 单精度32位浮点数 | |
double | 双精度64位浮点数 | |
duration | 表示持续时间 | |
dateTime | 特定的日期时间 | |
time | 代表特定的时间,但是是每天重复的 | |
date | 代表日期 | |
hexBinary | 代表十六进制数 | |
anyURI | 代表一个URI,用来定位文件 | |
NOTATION | 代表NOTATION类型 |
2. 程序开发体系架构
2.1 C/S体系架构(二层架构)
C/S是Client/Server的缩写,即客户端/服务器架构。在开发的过程中,客户端需要安装相应的软件才能连接服务器,并且客户端软件承担所有的逻辑和运算,服务器只提供数据交互的一种体系架构。
C/S架构的致命缺点
(1) C/S架构的客户端程序安装在客户机上。如果有很多人或很多台电脑使用,则安装的工作量非常巨大。
(2) C/S架构的客户端程序负责整个业务逻辑和界面显示。一旦对运行程序进行修补、升级等维护工作,则必须对整个客户端程序进行修改,不利于软件的升级与维护。
(3) C/S架构的客户端程序直接与数据库服务器端建立连接,而数据库服务器支持的并发连接数量有限,这样就限制了客户端程序可以同时运行的数量。
2.2 B/S体系架构
什么是B/S体系架构
B/S是Browser/Server的缩写,即浏览器/服务器架构。在开发过程中,客户端只需要一个浏览器,即可以实现与服务器交互,服务器承担所有的逻辑和计算,浏览器只负责将结果显示在屏幕上的一种体系架构。
B/S架构最大的优点
是客户机上无需安装专门的客户端程序,程序中的业务逻辑处理都集中到了Web服务器上,客户机只要安装一个浏览器就能通过Web服务器与数据库进行交互,并将交互的结果以网页的形式展现在浏览器中。
B/S体系架构(三层架构)
浏览器并不是直接与数据库服务器建立连接,而是通过Web服务器与数据库服务器需要建立连接。由此可见,B/S架构可以有效地解决C/S结构中客户端安装维护工作量巨大和数据库并发数量有限的问题。
3. Tomcat
3.1 Tomcat简介
什么是Tomcat?
稳定、可靠、开源、效率高的Servlet和JSP的容器(Web服务器引擎)
Tomcat是Apache组织的Jakarta项目中的一个重要子项目,它是Sun公司(已被Oracle收 购)推荐的运行Servlet和JSP的容器(引擎),其源代码是完全公开的。Tomcat不仅具有Web服务器的基本功能,还提供了数据库连接池等许多通用组件功能。
Tomcat运行稳定、可靠、效率高,不仅可以和目前大部分主流的Web服务器(如Apache、IIS服务器)-起工作, 还可以作为独立的Web服务器软件。
3.2 Tomcat的安装和启动
Tomcat的安装
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.zip
apache-tomcat-9.0.87 下载好Tomcat压缩文件之后,直接解压到指定的目录便可完成Tomcat的安装,并指定:右键【我的电脑】 --> 属性 --> 高级系统设置 --> 系统属性 --> 高级 --> 环境变量 --> 系统变量 CATALINA_HOME=安装目录(如C:\apache-tomcat-9.0.87)。
Tomcat的目录
Tomcat安装目录中包含-系列的子目录, 这些子目录分别用于存放不同功能的文件。
(1) bin: 用于存放Tomcat的可执行文件和脚本文件(打 展名为bat的文件。
(2) conf: 用于存放Tomcat的各种配置文件,如web.xml、 server.xml。
(3) lib: 用于存放Tomcat服务器和所有Web应用程序需要访问的JAR文件。
(4) logs: 用于存放Tomcat的日志文件。
(5) temp: 用于存放Tomcat运行时产生的临时文件。
(6) webapps: Web应用程序的主要发布目录,通常将要发布的应用程序放到这个目录下。
(7) work: Tomcat的工作目录, JSP编译生成的Servlet源文件和字节码文件放到这个目录下。
Tomcat的启动
双击bin目标中的startup.bat文件
浏览器的地址栏中输入http://localhost:8080
3.3 Tomcat诊断
(1) JAVA_HOME环境变量问题
The JRE_HOME environment variable is not defined correctly. This environment variable is needed to run this program. JRE_HOME环境变量定义不正确。运行此程序需要此环境变量。
JAVA_HOME jdk-8u401-windows-x64.exe
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
(2) Tomcat端口号被占用问题
netstat -na、任务管理器的“进程”选项卡中结束它的进程。或
使用记事本打开\apache-tomcat-9.0.87\conf\server.xml文件,在server.xml文件中有一个<Connector>元素,该元素中有一个port属性,这个属性就是用于配置Tomcat服务器监听的端口号。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
3.4 动手实践:在IntelliJ IDEA中配置Tomcat
(1) 启动IntelliJ IDEA开发工具,单击工具栏中的[File] →[new] →[Project] 选项,此时会弹出一个New Project界面。选新建项目,①输入项目名称:如ch02_xj;②输入或确定本次JavaWeb教学源代码存储位置,如E:\DuJavaWeb,语言和构建系统选Java和IntelliJ;③【创建】。
(2) 右击项目如[ch02_xj]选【添加框架支持...】,弹出【添加框架支持】界面,选①JavaEE;②Web应用程序;③版本4.0;④创建Web.xml;⑤【确定】。
(3) 在IDEA的工具栏中,单击[File] →[Project Structrue]选项,进入Project Structrue界面。
(4) 在Project Structrue界面中单击左侧菜单中的"Modules" 选项,单击"Source" 配置项,在项目web文件夹下的WEB-INF文件夹下创建classes和lib文件夹。
(5) 单击Project Structrue界面的"Paths" 配置项,将output path与Test output path的地址修改为Project Structrue界面中创建的classes的地址,该操作的作用是配置所有编译为.class的文件都编译输出在此文件夹下。
(6) 单击Project Structrue界面中的"Dependencies" 配置项,关联项目所需Jar包。
(7) 在Project Structrue界面中的"Dependencies" 配置项中,单击右侧[+]→[JARs or directories...],会弹出一个Select Library Files对话框。
(8) 在Select Library Files对话框中找到创建的Web项目,选中项目的Iib文件夹,单击"OK"按钮,会弹出一个"Choose Categories of Selected Files"界面。
(9) 项目配置完成之后,接下来需要配置Tomcat,将项目部署在Tomcat上。首先,在IDEA的菜单栏中单击[Run] →[Edit Configuratio.s...], 会弹出一个Run/Debug Configuration界面。
(10) 在Run/Debug Configuration界面中,单击【Run/Debug Configuration】窗口左上角的【+】按钮,会弹出一个Add New Configuration菜单栏界面。
(11) 在弹出的Add New Configuration菜单栏窗口选择【Tomcat Server】→【Local】,在IDEA配置一个Tomcat服务器。
(12) 在Add New Configuration界面中,"Name" 后的文本框用于给配置的Tomcat命名,如Tomcat 9;"HTTP port"后的文本框可以设置Tomcat的端口号,默认是8080; "Configure"--【配置...】 按钮用于配置本地Tomcat的路径,单击 "Configure" 按钮,会弹出Tomcat Servers界面。
(13) 在Tomcat Home中关联一个本地安装的Tomcat路径, 单击"OK"按钮,就成功的关联了本地Tomcat。
(14) 在Run/Debug Configuration界面,单击"Deployment"选项,进入Deployment配置项界面。
(15) 在Deployment配置项界面中,单击”Deployment ",单击右侧【+】→【Artifact】将项目部署在Tomcat,修改应用程序上下文为/ch02_xj。
(16) 在IDEA菜单栏中单击的[Run] →[Run Tomcat ]启动Tomcat进行测试。在浏览器输入项目资源地址localhost:8080/ch02_xj/index.jsp进行访问。
常见的WEB服务器
Apache http 世界上应用最多的WEB服务器,开源 重量级
Lighttpd 安全、快速、兼容性好并且灵活的WEB Server环境 轻量级
Tomcat 开源 实行了Apache-Jakarta规范,但对静态文件和高并发的处理比较弱。
IBM WebSphere 功能完善、开放的WEB应用程序服务器,应用的数量很少。
IIS 微软的WEB服务组件。
Nginx 一款高性能的HTTP和反向代理服务器,高连接并发,运行非常稳定。
Java中常见的5种WEB服务器
Tomcat Apache-Jarkarta开源项目中的一个子项目。
Resin Caucho公司的产品,是一个非常流行的支持Servlet和JSP的服务器,速度非常快。
JBoss是一个种遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,对于J2EE有很好的支持。
WebSphere IBM公司的产品,
WebLogic BEA公司的产品
附:centos安装tomcat
(1) 安装JDK
# 从老师网站上下载windows jdk安装包
wget http://www.duzhaojiang.cn/software/jdk-8u401-windows-x64.exe
# 进入用户的主目录
cd ~
# 从老师网站上下载linux jdk安装包
wget http://www.duzhaojiang.cn/software/jdk-8u401-linux-x64.tar.gz
ll
# 解压安装包到/usr/local
tar -zxvf jdk-8u401-linux-x64.tar.gz -C /usr/local
ll /usr/local
# 编辑配置文件,加入下列4行配置信息
# /etc/profile配置文件是每个用户登录时都会运行的环境变量设置,属于系统级别的环境变量,设置在里面的东西对所有用户适用。
cd ~
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_401
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
# tomcat慢 打开/usr/local/jdk1.8.0_401/jre/lib/security/java.security
securerandom.source=file:/dev/random
# 替换成
securerandom.source=file:/dev/urandom
# 使环境配置有效,测试java
source /etc/profile
java -version
javac -version
(2) 安装Tomcat
# 进入用户的主目录
cd ~
# 从清华大学镜像网站上下载tomcat安装包
wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.87/bin/apache-tomcat-9.0.87.tar.gz
ll
# 解压安装包到/usr/local
tar -zxvf apache-tomcat-9.0.87.tar.gz -C /usr/local
ll /usr/local
# 编辑配置文件,加入下列3行配置信息
vim /etc/profile
export CATALINA_HOME=/usr/local/apache-tomcat-9.0.87
export CLASSPATH={$CATALINA_HOME}/lib/servlet-api.jar:$CLASSPATH
export PATH=${CATALINA_HOME}/bin:$PATH
# 使环境配置有效,测试java
source /etc/profile
# 运行启动脚本
startup.sh &
# 显示Tomcat started表示启动成功
curl 127.0.0.1:8080
# 到阿里平台防火墙打开
# 打开浏览器,输入http://公网ip:8080,是否可以打开网页
#关闭命令
shutdown.sh