目标:了解XML的概念,能够知道HTML用于做什么
(1)HTML用于显示数据,XML用于传输和存储数据。
(2)HTML标签不区分大小写,而XML标记严格区分大小写。
(3)HTML可以有多个根元素,而格式良好的XML有且只能有一个根元素。
(4)在HTML中,空格是自动过滤的,而在XML中,空格不会自动过滤。
(5)HTML中的标签是预定义的标签,而XML中的标记可以根据需要自己定义,并且可扩展。
属性 | 说明 |
---|---|
version | 用于指定遵循XML规范的版本号。在XML声明中必须包含version属性,且该属性必须放在XML声明中其他属性之前。 |
encoding | 用来指定XML文档所使用的编码集。 |
standalone | 用来指定该XML文档是否和一个外部文档嵌套使用,取值为yes或no。如果设置属性值为yes,说明是一个独立的XML文档,与外部文件无关联;如果设置属性值为no,说明XML文档不独立。 |
<售价 单位="元">100售价>
<售价 单位="元">100售价>
(“”)
或者单引号(‘’)
引起来,否则被视为错误。注释是为了便于阅读和理解,如果想在XML文档中插入一些附加信息,比如作者姓名、地址或电话等,这些信息是对文档结构或文档内容的解释,不属于XML文档的内容,因此XML解析器不会处理注释内容。XML文档的注释以字符串“”
结束。
<breakfast>
<food>
<name>Belgian Wafflesname>
<price>$5.95price>
<description>two of our famous Belgian Waffles with plenty of real maple syrupdescription>
<calories>800calories>
food>
<food>
<name>Strawberry Belgian Wafflesname>
<price>$4.50price>
<description>light Belgian waffles covered with strawberries and whipped creamdescription>
<calories>300calories>
food>
<food>
<name>Berry-Berry Belgian Wafflesname>
<price>$8.95price>
<description>light Belgian waffles covered with an assortment of fresh berries and whipped creamdescription>
<calories>900calories>
food>
<food>
<name>French Toastname>
<price>$4.50price>
<description>thick slices made from our homemade sourdough breaddescription>
<calories>550calories>
food>
<food>
<name>Homestyle Breakfastname>
<price>$6.95price>
<description>two eggs, bacon or sausage, toast, and our ever-popular hash brownsdescription>
<calories>950calories>
food>
breakfast>
pom.xml
配置文件
XML文档中的标签是可以随意定义的,同一本书出现了两种售价,如果仅根据标签名称区分哪个是原价,哪个是会员价,这是很难实现的。为此,在XML文档中,定义了一套规则对文档中的内容进行约束,这套规则称为XML约束。对XML文档进行约束时,同样需要遵守一定的语法规则,这种语法规则就形成了XML约束语言。
DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件。在一个DTD文件中,可以包含元素的定义、元素之间关系的定义、元素属性的定义以及实体和符号的定义。
book.xml
文件
<书架>
<书>
<书名>徒然草书名>
<作者>吉田兼好作者>
<售价>34.00元售价>
书>
<书>
<书名>精通Spring框架书名>
<作者>魏赫布作者>
<售价>49.00元售价>
书>
书架>
语句定义了一个元素,其中“书架”是元素的名称,“(书+)”
表示书架元素中有一个或者多个名称为“书”的元素,其中字符“+”表示它所修饰的元素必须出现一次或者多次。“(书名,作者,售价)”
表示元素书包含书名、作者、售价这三个子元素,并且这些子元素要按照顺序依次出现。“(#PCDATA)”
表示元素中嵌套的内容是普通的文本字符串。在XML文档中引入外部DTD文件有两种方式
第1种方式: DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
第2种方式: DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
book.xml
进行修改,在XML文档中引入本地的DTD文件book.dtd
DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>徒然草书名>
<作者>吉田兼好作者>
<售价>34.00元售价>
书>
<书>
<书名>精通Spring框架书名>
<作者>魏赫布作者>
<售价>49.00元售价>
书>
书架>
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标识名称进行复制就可以了。DTD对XML文档的约束,除了通过外部引入方式实现外,还可以采用内嵌的方式。
在XML中直接嵌入DTD定义语句的完整语法格式
DOCTYPE 根元素名 [
DTD定义语句
……
]>
book.xml
进行修改,在book.xml
文档中直接嵌入book.dtd
文件
DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>徒然草书名>
<作者>吉田兼好作者>
<售价>34.00元售价>
书>
<书>
<书名>精通Spring框架书名>
<作者>魏赫布作者>
<售价>49.00元售价>
书>
书架>
“元素名称”
是被约束的XML文档中的元素,“元素内容”
是对元素包含内容的声明,其内容包括数据类型和符号两部分。元素 | 说明 |
---|---|
#PCDATA | 表示元素中嵌套的内容是普通文本字符串,其中关键字PCDATA是Parsed Character Data的简写。 |
子元素 | 说明元素包含其他元素。通常用一对小括号()将元素中要嵌套的一组子元素括起来。 |
混合内容 | 表示元素既可以包含字符数据,也可以包含子元素。混合内容必须被定义零个或多个。 |
EMPTY | 表示该元素既不包含字符数据,也不包含子元素,是一个空元素。如果在文档中元素本身已经表明了明确的含义,就可以在DTD中用关键字EMPTY表明空元素。 |
ANY | 表示该元素可以包含任何字符数据和子元素。 |
符号 | 作用 |
---|---|
问号[?] | 表示该对象可以出现0次或1次 |
星号[*] | 表示该对象可以出现0次或多次 |
加号[+] | 表示该对象可以出现1次或多次 |
竖线[ | ] |
逗号[,] | 表示对象必须按照指定的顺序出现 |
括号[()] | 用于给元素进行分组 |
<!ATTLIST 元素名
属性名1 属性类型 设置说明
属性名2 属性类型 设置说明
......
>
“元素名”
是属性所属元素的名字,“属性名”
是属性的名称,“属性类型”
则是用来指定该属性是属于哪种类型,“设置说明”
用来说明该属性是否必须出现。设置说明 | 含义 |
---|---|
#REQUIRED | 表示元素的该属性是必须的,例如,当定义联系人信息的DTD时,我们希望每一个联系人都有一个联系电话属性,这时,可以在属性声明时,使用REQUIRED |
#IMPLIED | 表示元素可以包含该属性,也可以不包含该属性。例如,当定义一本书的信息时,发现书的页数属性对读者无关紧要,这时,在属性声明时,可以使用IMPLIED |
#FIXED | 表示一个固定的属性默认值,在XML文档中不能将该属性设置为其他值。使用#FIXED关键字时,还需要为该属性提供一个默认值。当XML文档中没有定义该属性时,其值将被自动设置为DTD中定义的默认值 |
默认值 | 和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值。不同的是,该属性的值是可以改变的,如果XML文件中设置了该属性,新的属性值会覆盖DTD中定义的默认值 |
同DTD一样,XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,它的出现克服了DTD 的局限性。
(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实例文档作出更细致的语义限制。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="xs:string"/>
xs:schema>
xsd
作为后缀名,以xs:schema
作为根元素,表示模式定义的开始。 <元素名 xmlns:prefixname="URI">
book2.xml
,在book2.xml
文档中学习名称空间的使用。
<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 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”中定义的,它用于定义指定文档的位置。 |
Schema和DTD一样,都可以定义XML文档中的元素。
在Schema文档中,元素定义的语法格式:
类型 | 说明 |
---|---|
xs:string | 表示字符串类型 |
xs:decimal | 表示小数类型 |
xs:integer | 表示整数类型 |
xs:boolean | 表示布尔类型 |
xs:date | 表示日期类型 |
xs:time | 表示时间类型 |
<lastname>Smithlastname>
<age>28age>
<dateborn>1980-03-27dateborn>
这三个元素对应的Schema定义如下所示
<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>
<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: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>
“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
元素对空白字符的限定
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>
在定义复杂类型时,需要使用xs:complexContent元素来定义。复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素。在定义复合元素时,如果元素的开始标签和结束标签之间只包含字符数据内容,那么这样的内容是简易内容,需要使用xs:simpleContent元素来定义。反之,元素的内容都是复杂内容,需要使用xs:complexContent元素来定义。复合元素有4种基本类型,接下来针对这4种基本类型分别进行讲解。
<product prodid="2023001" />
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
xs:complexType>
xs:element>
<person>
<firstname>Johnfirstname>
<lastname>Smithlastname>
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>
<shoesize country="france">35shoesize>
```xml
- 元素“shoesize”包含了属性以及元素内容,针对这种仅包含文本的元素,需要使用extension来对元素的类型进行扩展,在Schema文档中对应的定义方式如下所示:
```xml
<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>
<letter>
Dear Mr.<name>John Smithname>.
Your order <orderid>1032orderid>
will be shipped on <shipdate>2001-07-13shipdate>.
letter>
<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>
目标:了解C/S体系架构和B/S体系架构
C/S是Client/Server的缩写,即客户端/服务器架构。在开发的过程中,客户端需要安装相应的软件才能连接服务器,并且客户端软件承担所有的逻辑和运算,服务器只提供数据交互的一种体系架构。
B/S是Browser/Server的缩写,即浏览器/服务器架构。在开发过程中,客户端只需要一个浏览器,即可以实现与服务器交互,服务器承担所有的逻辑和计算,浏览器只负责将结果显示在屏幕上的一种体系架构。B/S架构最大的优点是客户机上无需安装专门的客户端程序,程序中的业务逻辑处理都集中到了Web服务器上,客户机只要安装一个浏览器就能通过Web服务器与数据库进行交互,并将交互的结果以网页的形式展现在浏览器中。
Tomcat运行稳定、可靠、效率高,不仅可以和目前大部分主流的Web服务器(如Apache、IIS服务器)一起工作,还可以作为独立的Web服务器软件。
https://tomcat.apache.org/
https://tomcat.apache.org/download-80.cgi
可以将压缩包解压到任意位置,最后路径不要包含中文和空格,比如解压到D盘根目录,解压后会产生了一个apache-tomcat-8.5.86
文件夹。
apache-tomcat-8.5.86
文件夹,会看到里面有7个目录CATALINA_HOME
环境变量,然后修改Path
变量,添加%CATALINA_HOME%\bin;
startup.bat
命令,以此启动Tomcat服务器)org.apache.catalina.startup.Catalina.start Server startup in 1167 ms
信息,表明Tomcat服务器启动成功http://127.0.0.1:8080
(localhost和127.0.0.1都表示本地计算机)访问Tomcat服务器。关闭Tomcat
服务器之后,再访问http://localhost:8080/
,就会报错
大家可以看到启动Tomca
t服务器之后弹出的窗口里出现了中文乱码
将涉及编码的五条语句全部注释掉
重启Tomcat
服务器,查看启动窗口里的信息,看还有没有中文乱码
双击bin
目录中的startup.bat
脚本文件时,命令行窗口一闪而过。在这种情况下,由于无法查看到错误信息,所以无法对Tomcat
进行诊断,分析出错原因。这时,可以先启动一个命令行窗口,在这个命令行窗口中,将目录切换到Tomcat
安装目录中的bin
目录,然后在该窗口中执行startup.bat
命令,就会看到错误信息。
看到错误提示为“JRE_HOME环境变量配置不正确,运行该程序需要此环境变量”
。这是因为Tomcat服务器是由Java语言开发的,它在运行时需要根据JAVA_HOME
或JRE_HOME
环境变量来获得JRE
的安装位置,从而利用Java虚拟机来运行Tomcat
。要解决这个问题,只需要将JAVA_HOME
环境变量配置成JDK的安装目录。
需要注意的是,配置完JAVA_HOME
后,可将原来配置在Path环境变量中的JDK安装路径替换为“%JAVA_HOME%\bin;”
,其中%JAVA_HOME%
代表环境变量JAVA_HOME
的当前值。路径末尾用英文半角分号(;)
结束,与其他Path变量值路径隔开。这样做的好处是,当JDK的版本或安装路径发生变化时,只需修改JAVA_HOME
的变量值,而Path
环境变量和其他引用“JAVA_HOME
”的位置不需要改变。
此时再启动Tomcat服务器,就没有一闪而过的错误了,当然也可以在命令行窗口里通过执行startup.bat
命令来启动Tomcat服务器。
Tomcat在启动时可能会出现启动失败的情况,这种情况还可能是因为Tomcat服务器所使用的网络监听端口被其他服务程序占用所导致。现在很多安全工具都提供查看网络监听端口的功能,如360安全卫士、QQ管家等。此外,也可以通过在命令行窗口中输入“netstat -na”
命令,查看本机运行的程序都占用了哪些端口,如果有程序占用了8080
端口,则可以在任务管理器的“进程”选项卡中结束它的进程,之后重新启动Tomcat服务器,在浏览器中输入http://localhost:8080
就能看到Tomcat的首页。
如果在“进程”选项卡中无法结束占用8080端口的程序,就需要在Tomcat
的server.xml
的配置文件中修改Tomcat监听的端口号。使用记事本打开server.xml
文件,在server.xml
文件中有一个
元素,该元素中有一个port属性,这个属性就是用于配置Tomcat服务器监听的端口号。Tomcat
监听的端口号可以是0~65535之间的任意一个整数,如果出现端口号被占用的情况,就可以修改这个port属性的值来修改端口号。
如果将Tomcat服务器的端口号修改为80,那么在浏览器地址栏中输入http://localhost:80
访问Tomcat服务器,此时会发现80端口号自动消失了,这是因为HTTP规定Web服务器使用的默认端口为80,访问监听80端口的Web应用时,端口号可以省略不写,即输入http://localhost
就可访问Tomcat服务器。
配置其它信息
Tomcat
服务器上 index.html
index.html
,为什么可以访问到首页?index.html
,也是一样的效果Java Enterprise
项目,选中Web Application (4.0)
tomcat
服务器WebDemo02
项目index.jsp
文件,设置网页标题,添加一个一级标题显示欢迎信息和一个三级标题显示当前日期时间index.jsp
,也是一样的效果