第一章:JavaWeb概述
OVERVIEW
一、XML基础
在实际开发中,不同语言开发的项目之间数据传递的格式有可能不兼容,为此W3C推出了一种新的数据交换标准即XML
,XML
是一种通用的数据交换格式,使数据在各种应用程序之间轻松实现数据交换。
1.xml概念&语法
(1)xml概念:
可扩展标记语言(XML,Extensive Markup Language)是一种类似于HTML的标记语言,在XML文档中通过元素的嵌套关系可以很准确的描述具有树状层次结构复制信息,因此很多应用程序都采用XML格式来存放相关配置信息,便于读取和修改。
XML与HTML的区别:
- 应用领域不同:HTML设计是用于显示数据的,XML设计是用于传输和存储数据的。
- 语言语法不同:例如HTML可以有多个根元素&格式良好的XML只有一个根元素,HTML不区分大小写自动过滤空格/XML则相反
- 标记
Extensive
:HTML标记是预定义的不能够自定义/XML则能够自定标记,并且可扩展
(2)xml语法:
- 文档声明:
在一个完整的XML文档中,第一行必须包含一个XML文档声明。声明该文档是一个XML文档,遵循的XML版本规范。
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
注意:在一个XML文档声明中,版本信息不能省略,其他属性是可选的
- 元素定义:
在XML文档中,主体内容都是由元素(Element)组成的,元素一般都是由开始标记、属性、元素内容和结束标记构成的。
<city>beijing</city>
如果一个元素没有嵌套在其他元素内,则这个元素称为根元素;如果一个元素中没有嵌套子元素也不包含文本内容,则称为空元素。
注意:空元素可以不使用结束标记,但必须在起始标记前添加一个正斜杠
/
,例如:<img></img>
可以简写为<img/>
- 属性定义:
在XML文档中可以为元素自定义属性,属性是对元素的进一步描述和说明。
<city population="2000w">beijing</city>
注意:属性的命名规范与元素相同,并且属性值必须要使用双引号 or 单引号引起来,否则被视为错误。
- 注释:XML注释与HTML注释写法一致
<!-- 注释内容 -->
在XML文档中,定义了一套规则来对文档内容进行约束,这套规则称为XML约束。
在书写XML约束时需要遵循一些语法规则,这些语法规则就形成了XML约束语言,目前常用的约束语言是DTD约束和Schema约束。
2.DTD约束
DTD是早期出现的一种xml约束模式语言,根据其语法创建的文件称为DTD文件。
(1)DTD文档的引入:
要使用DTD文件约束xml文档,必须在xml文档中引入DTD文件,在xml文档中引入外部DTD文件有两种方式,如下:
case1:外部DTD文件引入
<!-- 本地DTD文件的引用 -->
<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URL">
<!-- 公共DTD文件的引用 -->
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URL">
case2:内嵌DTD文件
DTD对xml文档的约束,除了外部引用方式实现外,还可以采用内嵌方式,如下:
<!-- DTD内部引用 -->
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
<!DOCTYPE root_name [
<!-- DTD定义语句... -->
]>
(2)DTD语言语法:
point1:元素定义
元素是xml文档的基本组成部分,在DTD定义中每一条<!ELEMENT...>
语句用于定义一个元素,其基本格式如下:
<!ELEMENT element-name element-content>
-
element-name
:元素名称 -
element-content
:元素内容
有关于元素内容:元素内容是对元素包含内容的声明,包括数据类型和符号两部分,具体如下:
数据类型 | 说明 |
---|---|
#PCDATA | Parsed Character Data,表示元素中嵌套的内容是普通文本字符串 |
子元素 | 说明元素包含的子元素,例如<!ELEMENT book (title, author, price)> |
混合内容 | 表示元素既可以包含字符数据,也可包含子元素,例如<!ELEMENT book (title, author, price)> |
EMPTY | 该元素既不包含字符数据,也不包含子元素,是一个空元素 |
ANY | 表示该元素可包含任何字符数据和子元素 |
在实际开发中应尽量避免使用ANY,因为除了根元素外其他元素使用ANY都将失去DTD对xml文档的约束效果。
在定义元素时,元素内容中可适当的添加一些符号,具体如下:
符号 | 说明 |
---|---|
? | 表示该对象可出现0次 or 1次 |
* | 表示该对象可以出现0次 or 多次 |
+ | 表示该对象可以出现1次 or 多次 |
| | 表示在列出的对象中选择1个 |
, | 表示对象必须按指定顺序出现 |
() | 用于给元素进行分组 |
point2:属性定义
在DTD文档中定义元素的同时,还可以定义元素属性,其基本格式如下:
<!ATTLIST element-name attribute-name attribute-type config>
-
element-name
:定义属性所属元素名称 -
attribute-name
:属性名称 -
attribute-type
:属性类型 -
config
:设置说明
有关config设置说明,具体如下:
设置说明 | 含义 |
---|---|
#REQUIRED | 表示元素的该属性是不可缺少的 |
#IMPLIED | 表示元素的该属性不是必须的,可包含、也可不包含 |
#FIXED | 表示一个固定的属性默认值,在xml文档中不能将该属性设为其他值 |
默认值 | 表示一个默认属性值,在xml文档中能将该属性设为其他值 |
在DTD中定义元素属性时,有10种属性类型可选择,具体如下:
属性类型 | 说明 |
---|---|
CDATA | 常用的一种属性类型,表示属性类型是字符数据,与#PCDATA类似 |
Enumerated | 在声明属性时,限值属性的取值只能从一个列表中选择 |
ID | 一个ID类型的属性用于唯一标识xml文档中的一个元素,一个元素只能有一个ID类型的属性 |
IDREF | 使两个元素之间建立一对一的关系 |
IDREFS | 使两个元素之间建立一对多的关系 |
3.Schema约束
同DTD一样,XML Schema也是一种用于定义和描述xml文档结构和内容的模式语言,它的出现克服了DTD的局限性。
(1)Schema文档的引入:
若想通过XML Schema文件约束xml文档,必须将xml文档与Schema文件进行关联,在xml文档中引入Schema有两种方式,如下:
point1:有关于名称空间
一个xml文档可以引入多个约束文档,为了避免自定义名称之间同名发生冲突,在xml文档中提供了名称空间唯一表示一个元素或属性。
<!-- 命名空间的声明格式 -->
<element-name xmlns:tempname="URI">
在使用名称空间时,必须先声明名称空间,即在xml实例文档中为某个Schema文档的名称空间指定一个临时的名称。
临时名称通过一系列的保留属性来声明,这种属性的名字必须是以xmlns
或 xmlns:
作为前缀。
element-name
:声明的命名空间所在的元素xmlns:tempname
:该元素的属性名,所对应的值URI用于唯一标识该名称空间的名称
注意:如果有两个URI并且其组成的字符完全相同,则认为他们是同一个名称空间
<!-- 命名空间的声明使用实例 -->
<?xml version="1.0" encoding="UTF-8"?>
<it315:bookshelf xmlns:it315="http://www.it315.org/xmlbook/schema">
<it315:book>
<it315:title>JavaWeb</it315:title>
<it315:author>heima</it315:author>
<it315:price>$28.00</it315:price>
</it315:book>
</it315:bookshelf>
程序分析:
it315
作为多个元素名称的前缀部分,必须通过名称空间声明将其关联到唯一表示的某个名称空间的URI上- 将绑定的前缀
it315
添加到多个元素名称的前面,以此说明该元素属于哪个Schema文档
特别注意:在声明名称空间时,
xml
和xmlns
不可作为前缀(tempname
)使用。因为xml前缀已经与URI为http://www.w3.org/XML/1998/namespace的名称空间进行绑定,只能用于XML1.0规范中定义的
xml:space
和xml:lang
属性。而前缀xmlns仅用于声明名称空间的绑定,已经与URI为http://www.w3.org/2000/xmlns的名称空间进行绑定。
case1:使用名称空间引入XML Schema文档
在使用名称空间引入XML Schema文档时,需要通过属性xsi:schemaLocation
来声明名称空间的文档。
xsi:schemaLocation
属性是在标准名称空间http://www.w3.org/2001/XMLSchema-instance
中定义的,该属性中包含了两个URI用空格分开,URI1为命名空间的名称,URI2为URL文档的位置。
<?xml version="1.0" encoding="UTF-8"?>
<bookshelf
xmlns="http://www.it315.org/xmlbook/schema"
<!-- 使用schemaLocation属性前先声明其所在命名空间 -->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd">
<book>
<title>JavaWeb</title>
<author>heima</author>
<price>$28.00</price>
</book>
</bookshelf>
程序分析:
schemaLocation
属性用于指定名称空间所对应的XMLSchema文档的位置- 由于schemaLocation属性定义在另外一个公认的标准命名空间中,故使用前需要先声明该属性所属的命名空间
补充:一个xml实例文档可能引用多个名称空间,这时可以在schemaLocation属性值中包含多对名称空间(URI)与它们所对应的xmlSchema文档的存储位置,使用如下例
<?xml version="1.0" encoding="UTF-8"?>
<bookshelf
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">
<book>
<title>JavaWeb</title>
<author>heima</author>
<price>$28.00</price>
</book>
</bookshelf>
case2:不用名称空间引入XML Schema文档
在xml文档中引入XML Schema文档时,不仅可以通过属性xsi:schemaLocation
引入名称空间文档,也可以通过属性xsi:noNamespaceSchemaLocation
直接指定。
xsi:noNamespaceSchemaLocation
属性也是在标准名称空间http://www.w3.org/2001/XMLSchema-instance
中定义的,用于定义指定文档的位置。
<?xml version="1.0" encoding="UTF-8"?>
<bookshelf
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
<book>
<title>JavaWeb</title>
<author>heima</author>
<price>$28.00</price>
</book>
</bookshelf>
注意:这里Schema文档xmlbook.xsd与引用它的实例文档位于同一目录中
(2)Schema语言语法:
point1:元素定义
在Schema文档中,元素定义的语法格式如下:
<xs:element name="xxx" type="yyy"/>
在XML Schema中有很多内建的数据类型,其中最常用的有以下几种:
内建数据类型 | 说明 |
---|---|
xs:string | 字符串类型 |
xs:decimal | 小数类型 |
xs:integer | 整数类型 |
xs:boolean | 布尔类型 |
xs:date | 日期类型 |
xs:time | 时间类型 |
实际使用:
<!-- schema文档 -->
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="birthday" type="xs:date"/>
<!-- xml文档 -->
<name>Smith</name>
<age>20</age>
<birthday>2000-12-01</birthday>
point2:属性定义
在Schema文档中,属性定义的语法格式如下:
<xs:attribute name="xxx" type="yyy"/>
其中属性的常用数据类型与元素相同,都是使用XML Schema中内建的数据类型
实际使用:
<xs:attribute name="lang" type="xs:string"/>
<name lang="EN">Smith</name>
point3:简单类型定义
在Schema文档中,只包含字符数据类型都属于简单类型,使用xs:simpleType
元素来定义。
如果想对现有元素内容的类型进行限制,则需要使用xs:restriction
元素,以下是几种常见情况对简单类型元素进行限定。
注:使用方式详见黑马JavaWebP55
point4:复杂类型定义
除了简单类型其他的类型都是复杂类型,使用xs:complex-Content
元素来定义。
复杂类型的元素可以包含子元素和属性,这样的元素称为复合元素。
如果复合元素的内容为简易内容(元素开始、结束标记之间只含有字符数据内容)则使用xs:simpleContent
元素来定义复合元素。
如果复合元素的内容为复杂内容,则需要使用xs:complexContent
元素来定义复合元素。
注:使用方式详见黑马JavaWebP57
(3)Schema约束与DTD约束间的比较:
同DTD一样,XML Schema也是用于定义和描述XML文档结构与内容的模式语言,XML Schema克服了DTD的局限性。主要如下:
- DTD采用的是非XML语法格式,缺乏对文档结构、元素、数据类型的全面描述,而XML Schema本身也是一种XML文档
- XML有非常高的合法性要求,DTD的合法性验证机制与XML Schema不同,后者采用与XML相同的验证机制
- XML Schema对名称空间支持非常好,而DTD几乎不支持名称空间
- DTD支持的数据类型非常有限,XML Schema比XML DTD支持更多数据类型,包括用户自定义类型
- DTD定义约束的能力非常有限,无法对XML实例文档做出更细致的语义限制
总结:XML Schema比DTD功能强大很多,相应的语法也复杂很多
二、HTTP协议
在浏览器与服务器的交互过程中,需要遵循一定的规则,即HTTP规则。HTTP规则专门由于定义浏览器与服务区之间交换数据的过程、以及数据本身的格式。
1.HTTP简述
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种请求&响应式的协议。
客户端与服务器建立连接后,向服务端发送请求被称为HTTP请求;服务器端接受到请求后对其作出响应称为HTTP响应。
HTTP通信协议的特点:
- 支持客户端/服务端模式(C/S)
- 简单快速:客户端向服务器请求服务时,只需传送请求方式和路径。由于HTTP简单,其服务器程序规模小、通信速度快
- 灵活:HTTP允许传输任意类型的数据,正在传输的数据类型由Content-Type加以标记
- 无状态:HTTP是无状态协议,协议对于事务处理没有记忆能力;若后续处理需要前置信息则导致连接传送数据量增大
HTTP发展:HTTP1.1克服了1.0版的缺陷,在一个TCP连接上可传送多个HTTP请求和响应,减少了消耗和延时
2.HTTP请求消息
在HTTP中,一个完整的请求消息是由请求行、请求头和实体内容三部分组成的,每部分有各自的作用。
(1)HTTP请求行:
HTTP请求行位于请求消息的第1行,包括3个部分:请求方式、资源路径以及所使用的HTTP版本。
GET /index.html HTTP/1.1
注意:请求行中的每个部分使用空格隔开,最后以回车换行
在HTTP的请求消息中,请求方式有GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT和CONNECT共8种,其中两种具体如下:
请求方式 | 说明 |
---|---|
GET | 请求获取请求行URL所标识的资源 |
POST | 向指定资源提交数据,请求服务器进行处理 |
HEAD | 请求获取URL所标识资源的响应消息头 |
PUT | 将网页放置到指定URL位置 |
DELETE | 请求服务器删除URL所标识资源 |
TRACE | 请求服务器回收收到的请求消息(test or diagnosis) |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器性能,或查询与资源相关的选项和需求 |
GET方式:
当用户在浏览器地址栏直接输入某个URL地址或点击网页上的一个链接时,浏览器将使用GET方式发送请求。
如果浏览器请求的URL中有参数部分,在浏览器生成的请求信息中,参数部分将附加在请求中的资源路径之后,例如:
http://www.itcast.cn/javaForum?name=lee&psd=hnxy
在上述URL中,?
后面的内容为参数信息,参数是由参数名和参数值组成的,中间使用 =
连接。若URL地址中有多个参数,则参数之间需要使用 &
分隔。
当浏览器向服务器发送请求时,URL后的参数会附加在要访问的URI资源后面,具体如下:
GET /javaForum?name=lee&psd=hnxy HTTP/1.1
POST方式:
若网页上的form表单的method属性设置为POST,当用户提交表单时,浏览器将使用POST方式提交表单内容。
并将各个表单元素及数据作为HTTP消息的实体内容发送给服务器,而不是作为URL地址的参数传递。
另外在使用POST方式传输数据时,Content-Type消息头会自动设置为application/x-www-form-urlencoded
,Content-Length消息头会自动设置为实体内容的长度。如下:
POST /javaForum HTTP/1.1
Host: www.itcast.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
name=lee&psd=hnxy
POST与GET对比:
在实际开发中,通常都使用POST方式发送请求,原因主要有两个如下:
- POST传输数据大小没有限制,GET方式传输数据最多不能超过2KB
- POST比GET请求方式更安全
GET请求方式的参数信息都会在URL地址栏明文显示,而POST请求方式传递的参数隐藏在实体中,用户透明故POST更安全
(2)HTTP请求消息头:
在HTTP请求消息中,请求行之后便是若干请求消息头,主要用于向服务端传递附加消息。实例如下:
Host: localhost:8080
Accept: image/gif, image/x-xbitmap, *
Referer: http://localhost:8080/itcast/
Accept-Language: zh-cn,zh; q=0.8,en-us; q=0.5,en; q=0.3;
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6.5; CIBA)
Cache-Control: no-cache
当浏览器发送请求给服务器时,根据功能需求不同发送的请求消息头也不同,常用请求消息头字段如下:
具体参见黑马JavaWebP63-64,有关请求消息头字段的介绍,此处不做赘述
3.HTTP响应消息
一个完整的响应消息主要包括响应状态行、响应消息头和实体内容,每个组成部分都代表了不同含义。
(1)HTTP响应状态行:
HTTP响应状态行位于响应消息的第1行,包括3个部分:HTTP版本、状态码以及对状态码进行描述的文本信息。
HTTP/1.1 200 OK
注意:请求行中的每个部分使用空格隔开,最后以回车换行
在响应消息组成中,状态码由3位数字组成表示请求是否被理解或满足。HTTP响应状态码第一个数字定义了响应的类别:
1xx:表示请求已接收,需要继续处理
2xx:表示请求已成功被服务器接收、理解并接受
3xx:为完成请求,客户端需进一步细化请求
4xx:客户端的请求有错误
5xx:服务器端出现错误
以下是Web开发中比较常见的几个状态码,具体如下:
状态码 | 说明 |
---|---|
200 | 表示服务器成功处理了客户端的请求,响应消息正在返回正常的请求结果 |
302 | 表示请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置起来进行以后的请求 |
304 | 304表示客户端缓存的版本是最新的,客户端应该继续使用它,否则服务器将使用状态码200返回所请求文档 |
404 | 表示服务器找不到请求的资源,例如服务器访问不存在的网页 |
500 | 表示服务器发生了错误,无法处理客户端的请求,大部分情况下是服务器的CGI、ASP、JSP程序发生了错误 |
(2)HTTP响应消息头:
服务器通过响应消息头像客户端传递附加信息,包括服务程序名、被请求资源需要的认证的方式、客户端请求资源最后的修改时间、重定向地址等信息。HTTP响应消息头实例如下:
Server: Apache-Coyote/1.1
Content-Encoding: gzip
Content-Length: 80
Content-Language: zh-cn
Content-Type: text/html; charst=GB2312
Last-Modified: Mon, 18 Nov 2012 18:23:51 GMT
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
当服务器向客户端返回消息时,根据情况不同发送的响应消息头也不同,常用响应消息头字段如下:
具体参见黑马JavaWebP66-67,有关响应消息头字段的介绍,此处不做赘述
三、Tomcat
(1)Tomcat文件结构:
Tomcat是Apache组织的Jakarta项目中的一个重要子项目,是sun公司推荐的运行Servlet和JSP的容器(引擎)。Tomcat不仅具有Web服务器的基本功能,还提供了数据库连接池等许多通用组件功能。
以下是Tomcat安装目录中包含的一系列子目录:
bin:该目录用于存放Tomcat的可执行文件和脚本文件(扩展名为bat),如服务器启动脚本文件startup.bat
conf:用于存放Tomcat的各种配置文件,如web.xml、server.xml
lib:用于存放Tomcat服务器和所有web应用程序需要使用的JAR包
logs:用于存放Tomcat的日志文件
temp:用于存放Tomcat运行时产生的临时文件
webapps:web应用程序的主要发布目录,通常将要发布的应用程序放到这个目录下
work:Tomcat的工作目录,存放JSP编译生成的Servlet源文件和字节码文件
(2)Web应用:
Web应用就是多个web资源的集合,在web服务器上运行的web资源都是以web形式呈现的。
一个web应用由多个web资源或其他文件夹组成,包括HTML、CSS、JS、动态web页面、Java程序、支持JAR包、配置文件等。
下图为web应用的目录结构:
总结:一个web应用需要包含多个目录,这些目录用于存放不同类型的文件