第3章 Java Web基础 Java Web是指所有应用于Web开发的Java技术的总称。XML是由万维网联盟(W3C)创建的标记语言,用于定义、编码人类和机器可以读取的文档的语法。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。HTTP是专门用于定义浏览器与服务器之间交互数据的过程以及数据本身的格式。对于Web开发人员来说,只有深入理解HTTP,才能更好地开发、维护、管理Web应用。 通过本章的学习,您可以: (1) 了解XML的概念; (2) 掌握XML语法,学会定义XML; (3) 了解HTTP消息; (4) 熟悉HTTP请求行和请求头字段的含义; (5) 熟悉HTTP响应行和响应头字段的含义; (6) 掌握在Eclipse中配置Tomcat服务器的方法。 视频讲解 3.1XML基础 XML是目前比较流行的、应用于不同应用程序之间的数据交换的一项技术。由于这种数据交换不以预先定义的一组数据结构为前提,因此,具有较强的可扩展性。 3.1.1XML文档简介 1. 什么是XML XML(eXtensible Makup Language,可扩展标记语言)中的可扩展指的是用户可以按照XML规则自定义标记。XML文件就是存储该语言的文件。 在现实生活中,很多事物之间都存在着一定的关联关系。例如,一个班级有两名学生: 学生1,张强,男,20岁; 学生2,李萌,女,20岁,可以用层次结构图来表示。班级学生信息层次结构示意如图31所示。 图31班级学生信息层次结构示意 图31直观地描述了班级与学生之间的层次结构关系; 但是使用程序解析图片内容非常困难,这时,采用XML文件这种具有树状结构的数据格式就是最好的选择。用XML文档描述图31所示的关系,如文件31所示。 文件31student.xml 1 2 3 4张强 5 620 7 8 9李萌 10 1120 12 13 在文件31中,第1行代码是XML的文档声明,下面的都是用户自己创建的标记。在XML中,它们被称为元素,其中class被称为整个文档的根元素,它有一个子元素stu,在这个子元素中有一个属性id,元素stu又有三个子元素name、sex、age。元素必须成对出现,即包括开始标记和结束标记。例如,class元素的开始标记是,结束标记是。 在XML文档中,通过元素的嵌套关系可以很准确地描述具有树状层次结构的复杂信息。因此,越来越多的应用程序都采用XML格式来存放相关的配置信息。在本书中,将介绍如何使用web.xml文件存放Servlet的配置信息, 以及如何访问其他XML文件中的相关信息。 2. XML与HTML的比较 XML是一种与HTML相似的标记语言。它们都是标记文本,在结构上大致相同,都是以标记的形式来描述信息,但实际上它们又有着本质的区别。下面从5方面进行比较。 (1) 作用。HTML的作用是用来显示数据; 而XML的作用是为了传输和存储数据,其实现了数据的平台无关性。 (2) 是否区分大小写。HTML不区分大小写; 而XML是严格区分大小写的。 (3) 根元素的个数。HTML可以有多个根元素; 而格式良好的XML有且只能有一个根元素。 (4) 空格处理。HTML中的空格是自动过滤的; 而XML中的空格则不会自动删除。 (5) 标记的定义。HTML中的标记是预定义的; 而XML中的标记可以根据需要自己定义,并且可扩展。 3.1.2XML语法 一个基本的XML文档通常由文档声明和文档元素两部分组成。 1. 文档声明 在一个文本的XML文档中,必须包括一个XML的文档声明,用于说明这是一个XML的文档。XML声明的语法格式如下: 1 由以上格式可以看出,该声明包含在符号“”之间,其中,xml表明这是一个XML文档声明。 (1) version: 用于指定遵循XML规范的版本号,最常用的版本是1.0。在XML声明中必须包含version属性,该属性必须放在XML声明中的其他属性之前。 (2) encoding: 关于指定XML文档中字符使用的编码集。常用的编码集为GBK或GB2312(简体中文)、BIG5(繁体中文)、ISO88591(西欧字符)和UTF8(通用的国际编码)。 (3) standalone: 英语指定该XML文档是否和一个外部文档嵌套使用。取值为yes或no,若设置属性值为yes,则说明是一个独立的XML文档与外部文件无关联; 若设置属性值为no,则说明XML文档不独立; 默认取值为no。 注意: (1) 在声明中括号括起来的内容表示是可选的; (2) “?”和“xml”之间不能留空格; (3) 如果在XML文档中没有指定编码集,那么该XML文档将不支持中文。 2. 文档元素 XML文档的主体部分是由元素组成的。XML文档中的元素以树状分层结构排列,一个元素可以嵌套在另一个元素中。XML文档中有且只有一个顶层元素,也称为根元素。其他所有元素都嵌套在根元素中。 XML文档元素由开始标记、元素内容和结束标记3部分组成。定义XML文档元素的语法格式如下: 1content (1) : XML文档元素的开始标记。tagName是元素的名称。 (2) content: 元素内容,可以包含其他的元素、字符数据等。 (3) : XML文档元素的结束标记。tagName是元素的名称,该名称必须与开始标志中指定的元素名称相同。 注意: (1) XML文档元素区分大小写; (2) XML文档有且只能有一个根元素; (3) XML文档元素必须同时拥有开始标志、结束标志,结束标志不能省略,这点与HTML不同; (4) 空元素,没有内容的元素称为空元素。空元素可以不使用结束标志,但必须在开始标志的“>”前加一个“/”,例如: 可以简写成。 【例31】分析文件31中元素之间的关系。 解析: class、stu、name、sex、age都是元素。其中,class是根元素,stu是class的子元素。name、sex、age是stu的子元素。 3. 属性定义 在XML文档中,可以为元素定义属性,属性定义在元素的开始标记中,其值用单引号或双引号括起来。 【例32】在文件31中,为元素stu定义了属性id用于说明学生的ID号,代码如下: 1 注意: 在同一个元素的开始标记中属性名不能相同。 4. 注释 注释是为了便于阅读和理解,而在XML文档中添加的附加信息,比如作者姓名、地址、电话等信息,或者想暂时屏蔽某些XML语句。注释是对文档结构或内容的解释,不属于XML文档的内容,所以XML解析器不会处理注释内容。XML文档的注释以“”结束,与HTML写法基本一致。 如在文件31中的第1~3行都添加了注释。 3.1.3XML的应用 XML应用于 Web 开发的许多方面,常用于简化数据的存储和共享。 1. XML把数据从HTML文档分离 如果需要在HTML文档中显示动态数据,那么在数据改变时,将花费大量的时间来编辑 HTML。 通过 XML,数据能够存储在独立的 XML 文件中。这样程序员就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。 通过使用几行JavaScript,就可以读取一个外部XML文件,然后更新HTML中的数据内容。 2. XML简化数据共享 在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。 XML数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。 3. XML简化数据传输 通过 XML,可以在不兼容的系统之间轻松地交换数据。 对开发人员来说,其中一项最费时的挑战是在互联网上的不兼容系统之间交换数据。由于可以通过各种不兼容的应用程序来读取数据,以XML来交换数据便降低了其复杂性。 4. XML简化平台的变更 升级到新的系统(硬件或软件平台)总是非常费时的。若要转换大量的数据,不兼容的数据就会丢失。 XML数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。 3.2HTTP协议 3.2.1HTTP概述 1. HTTP简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(World Wide Web,WWW)服务器传输超文本到本地浏览器的传输协议。 HTTP工作于客户端—服务器端架构之上。浏览器作为HTTP客户端通过URL向HTTP服务器端即Web服务器发送所有请求; Web服务器根据接收到的请求,向客户端回送响应信息,如图32所示。 图32客户端与服务器端的交互过程 HTTP有如下特点。 (1) 支持B/S及C/S结构。 (2) 简单快速: 客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST三种。每种方法规定了客户与服务器联系的类型不同。由于HTTP简单,使得HTTP服务器的程序规模小,因而通信速度较快。 (3) 灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由ContentType加以标记。 (4) 无状态: HTTP是无状态协议。无状态是指协议对于事务处理没有记忆能力,如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。 (5) 无连接: 无连接的含义是限制每次连接只处理一个请求。服务器端处理完客户端的请求,并收到客户端的应答后,即断开连接。采用这种方式可以节省传输时间。 2. HTTP发展阶段 HTTP于1990年提出,经过几年的使用与发展,得到不断的完善和扩展,最初的版本是0.9,目前已经不使用了; 1996年5月,HTTP 1.0 版本发布; 1997年1月,HTTP 1.1 版本发布; HTTP/2标准于2015年5月以RFC 7540正式发布,取代HTTP 1.1成为HTTP的实现标准。下面着重介绍目前流行的HTTP 1.0和HTTP 1.1版本。 (1) HTTP 1.0。1996年5月,HTTP 1.0 版本发布,任何格式的内容都可以发送。这使得互联网不仅可以传输文字,还能传输图像、视频、二进制文件。这为互联网的发展奠定了基础。 HTTP 1.0 请求/响应的交互过程如图33所示。 图33HTTP 1.0请求/响应的交互过程 由图33可以看出,HTTP 1.0 版的每个TCP连接都只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。 TCP连接的新建成本很高,随着网页加载的外部资源越来越多,这个问题就越发突出了。 【例33】分析HTML代码的请求响应交互过程。代码如文件32所示。 文件32http1.html 1 2 3 4 5 6 7 文件32中包含3个标记,标记的src属性是图片的URL地址。因此,当客户端访问这些图片时,需要发送3次请求,每次请求都要与服务器端建立连接。如此一来,必然导致交互延时,影响访问速度。 (2) HTTP 1.1。1997年1月,HTTP 1.1 版本发布,只比 1.0 版本晚了半年。它进一步完善了 HTTP 协议,一直沿用至今,目前还是最流行的版本。 HTTP 1.1 版的最大变化,就是引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,但是所有的数据通信都是按次序完成的,服务器只有处理完一个响应,才会处理下一个响应。HTTP 1.1的交互过程如图34所示。 图34HTTP 1.1的交互过程 HTTP 1.1不仅继承了HTTP 1.0的优点,而且还有效解决了HTTP 1.0的性能问题,显著地减少了客户端与服务器端交互所需的时间。 3. 统一资源标识符 统一资源标识符(uniform resource identifier,URI)用来唯一地标识一个资源。Web上可用的每种资源如HTML文档、图像、视频片段、程序等都是用一个URI来定位的。URI有两个子集URL和URN。 统一资源命名(uniform resource name,URN)是通过名字来标识资源。不指定访问方式。 图35URL、URN、URI关系图 统一资源定位器(uniform resource locator,URL)是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何定位这个资源。 URI是以一种抽象的、高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。URL、URN、URI关系如图35所示。 【例34】举例说明URI、URL与URN的区别。 现实生活中通常用ISBN标识一本书,即URI,有如下两种表示方式。 (1) ISBN: 9787302528999。它指定了一本书的ISBN,可以唯一标识这本书,但是没有指定到哪里能找到这本书,这就相当于URN。 (2) ISBN: 9787302528999,清华大学出版社。它指定了一本书的ISBN,同时指明了出版社,这样读者就知道去哪里购买这本书了,这就相当于URL。 在目前的互联网中,URN用得非常少,几乎所有的URI都是URL,一般的网页链接既可以称为URL,也可以称为URI。 URL语法格式如下: 1scheme://hostname[:port]/website/[path/][file][?query][#fragment] (1) scheme: 指定因特网服务的类型。最流行的类型是HTTP,HTTPS。 (2) hostname: 指定服务器的域名系统(DNS)主机名或IP地址。 (3) port: 指定主机的端口号。端口号通常可以被省略,HTTP服务器的默认端口号是80。 (4) website: 网站名称,可以是Web应用程序上下文、虚拟目录名、网站根目录等。 (5) path: 指定远程服务器上的路径,该路径也可以被省略,省略该路径则默认被定位到网站的根目录。 (6) file: 指定远程文档的名称。如果省略该文件名,通常会定位到index.html、index.htm等文件,或定位到Web服务器设置的其他文件。 (7) query: 查询参数,以“?”开始,允许有多个参数,参数与参数之间用“&”作为分隔符,每个参数都以“参数名=参数值”的形式给出。 (8) fragment: 信息片段,以“#”开始,是一种网页锚点。 【例35】分析URL的构成。 浏览某平台“Java Web应用开发”课程的视频URL如下: 1https://mooc1-1.chaoxing.com/nodedetailcontroller/visitnodedetail?courseId=204353013& 2knowledgeId=168133932 该URL的协议部分为“https:”,域名部分为“mooc11.chaoxing.com”,虚拟目录是“/nodedetailcontroller/”,文件名是“visitnodedetail”,参数部分“courseId=204353013&knowledgeId=168133932”有两个参数courseId和knowledgeId。 4. HTTP消息 当用户在浏览器中访问某个URL地址、单击网页的某个超链接或者提交网页上的form表单时,浏览器都会向服务器发送请求数据,即HTTP请求消息。服务器端接收到请求数据后,会将处理后的数据返回给客户端,即HTTP响应消息。HTTP请求消息和HTTP响应消息,统称为HTTP消息。 在HTTP消息中,除了服务器端的响应实体内容(如HTML网页、图片等)外,其他消息对用户都是不可见的,想要观察这些隐藏的消息,需要借助浏览器的开发者工具。 这里,使用Chrome浏览器自带的开发者工具查看HTTP头信息,步骤如下所述。 (1) 打开Chrome浏览器,在网页任意地方右击选择“检查”或者按下 Shift+Ctrl+I组合键或者按F12键, 打开Chrome自带的调试工具,会在浏览器的右部或底部显示开发者工具窗口。Chrome浏览器的开发者工具窗口如图36所示。 图36Chrome浏览器的开发者工具窗口 (2) 选择Network标签, 刷新网页(在打开调试工具的情况下刷新),会弹出当前访问的所有资源信息列表面板。资源信息列表面板如图37所示。 图37资源信息列表面板 (3) 在资源信息列表面板的Name列中选择资源URI,如百度的URI: www.baidu.com,单击该URI,在窗口右侧显示选中资源的详情面板,在该详情面板中选择Headers标签,就可以查看当前资源的HTTP头信息。当HTTP请求为GET方式时,在Headers标签页中有General(基本信息)、Response Headers(响应头信息)、Request Headers(请求头信息)三部分。Chrome浏览器中HTTP头信息(GET)如图38所示。 图38Chrome浏览器中HTTP头信息(GET) 当HTTP请求为POST方式时,会增加Form Data(表单数据)部分; 当HTTP请求带参数时,会增加Query String Parameters(请求参数)部分。单击前面的黑色三角可以折叠和展开每个部分的详情。Chrome浏览器中HTTP头信息(POST)如图39所示。 图39Chrome浏览器中HTTP头信息(POST) (4) 展开Response Headers详情,单击右侧的view source,就可以查看原始的HTTP响应消息。其代码如下: 1HTTP/1.1 200 OK 2Bdpagetype: 1 3Bdqid: 0xb121005d0018c9f4 4Cache-Control: private 5Connection: keep-alive 6Content-Encoding: gzip 7Content-Type: text/html;charset=UTF-8 8Date: Fri, 03 Jul 2020 15:31:46 GMT 9Expires: Fri, 03 Jul 2020 15:30:46 GMT 10Server: BWS/1.1 上述行代码中,第1行为响应状态行,其他行为响应头信息。 (5) 展开Request Headers详情,单击右侧的view source,就可以查看原始的HTTP请求消息。其代码如下: 1GET / HTTP/1.1 2Host: www.baidu.com 3Connection: keep-alive 4Cache-Control: max-age=0 Upgrade-In 5secure-Requests: 1 6User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1.0.4044.138 Safari/537.36 7Accept: text/html,application/xhtml+xml,application/xml 上述代码中,第1行为请求行,其他行为请求消息头。 关于HTTP请求和响应消息的其他内容在后续章节中再进行详细介绍。 大部分浏览器都自带有开发者工具,查看HTTP消息头的操作方法类似Chrome浏览器。 3.2.2HTTP请求消息 HTTP请求消息由请求行、请求消息头和请求实体(请求数据)三部分构成,请求消息头与请求实体中间有一行空行,是告诉服务器请求消息头到此结束,接下来是请求正文。HTTP请求消息结构如图310所示。 图310HTTP请求消息结构 在Chrome浏览器的Headers标签中Request Headers部分,包含HTTP请求消息的请求行和请求消息头,而Form Data(表单数据)部分则对应请求实体,是可选的。如图38所示的HTTP头信息没有请求实体,而图39中有请求实体。 1. HTTP请求行 请求行由请求方法、URL和协议版本3部分组成,各部分之间以空格分隔。 请求方法告诉服务器,你的具体操作是什么。URL为请求资源对应的URL地址,它和消息头的Host属性组成完整的请求URL,资源名以“/”开头,相对于连接的主机名。协议版本为协议名称及版本号。 【例36】分析如下代码所示请求行的请求方法,URL及协议版本号分别是什么? 1GET / HTTP/1.1 2POST /v2/api/?login HTTP/1.1 第1行请求代码中,请求方法为GET,URL为“/”表示网站的根目录,访问默认页面如index.html、index.jsp等,协议版本号为HTTP/1.1。 第2行请求代码中,请求方法为POST,URL为“/v2/api/?login”, 协议版本号为HTTP/1.1。 在HTTP的请求消息中,请求方法有GET、POST、HEAD、OPTIONS、DELETE、TRACE、PUT和CONNECT共8种,每种方法都指明了操作服务器中指定URI资源的方式。其中,GET和POST是最常见的HTTP请求方法。请求方法及其含义如表31所示。 表31请求方法及其含义 请 求 方 法含义 GET请求获取请求行的URI所标识的资源 POST向指定资源提交数据,请求服务器进行处理(如提交表单或者上传文件) HEAD请求获取由URI所标识资源的响应消息头 PUT将网页放置到指定URL位置(上传/移动) DELETE请求服务器删除URI所标识的资源 TRACE请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT保留将来使用 OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求 (1) GET请求方法与POST请求方法。 ① GET请求方法发送一个请求来获取服务器上的资源,资源通过HTTP响应头和数据(如HTML文档、图片、样式、视频等)返回给客户端(如浏览器)。GET 请求如果带参数,就在 URL 中附带查询参数,如test.html?id=1。 ② POST请求方法用于向服务器提交数据,请求的参数要在请求实体中发送,可用于表单的提交和异步提交(如Ajax)。理论上,POST传递的数据量没有限制。 (2) GET和POST发送HTTP请求。 在客户端如果发生下面的事件,浏览器就向Web服务器发送一个HTTP请求。 ① 用户在浏览器的地址栏中输入URL并按回车键。 ② 用户单击了HTML页面中的超链接。 ③ 用户在HTML页面中填写一个表单并提交。 上述①和②向Web服务器发送的都是 GET请求。如果使用HTML表单发送请求,那么可以通过method属性指定使用GET请求或POST请求。在默认情况下,使用表单发送的请求也是GET请求; 如果发送POST请求,就需要将method属性值指定为POST。 用户登录页面login.jsp的表单部分代码如下: 1
2 用户名: 3 密码: 4 5
在上述代码中,如若method属性的值为POST,则使用POST方法提交表单信息; 若method属性的值为GET或省略,则使用GET方法提交表单信息。 (3) GET请求方法与POST请求方法的比较。 可通过它们请求的资源类型、发送数据类型、发送数据量、参数的可见性、数据是否缓存等方面做比较。GET请求方法与POST请求方法的比较如表32所示。 表32GET请求方法与POST请求方法的比较 特征GET请求方法POST请求方法 资源类型静态的或动态的动态的 数据类型文本文本或二进制数据 数据量一般不超过255个字符没有限制 可见性数据是URL的一部分,在浏览器的地址栏中对用户可见数据不是URL的一部分而是作为请求的消息体发送,在浏览器的地址栏中对用户不可见 数据缓存数据可在浏览器的URL历史中缓存数据不能在浏览器的URL历史中缓存 在实际开发中,通常都会使用POST方法发送请求,其原因主要有两个。 ① POST传输数据大小无限制。 由于GET请求方法是通过请求参数传递数据的,因此最多可传递1KB的数据。而POST请求方法是通过实体内容传递数据的,因此对传递数据的大小没有限制。 ② POST比GET请求方法更安全。 由于GET请求方法的参数信息都会在URL地址栏明文显示,而POST请求方法传递的参数隐藏在实体内容中,用户是看不到的,因此,POST请求方法比GET请求方法更安全。 2. HTTP请求消息头 在HTTP请求消息中,请求行之后,便是若干请求消息头。请求消息头主要用于向服务器端传递附加消息,例如,客户端可以接收的数据类型、压缩方法、语言以及发送请求的超链接所属页面的URL地址等信息。HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对,如AcceptCharset: UTF8,每一个消息头的最后都以回车符(CR)和换行符(LF)结尾。HTTP请求消息头代码如下: 1Host: www.baidu.com 2Connection: keep-alive 3Cache-Control: max-age=0 Upgrade-In 4secure-Requests: 1 5User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36 6Accept: text/html,application/xhtml+xml,application/xml 每个请求消息头单独占一行,头字段名称不区分大小写,一般首字母大写。常用的请求消息头字段如表33所示。 表33常用的请求消息头字段 协议头说明 Accept可接受的响应内容类型(ContentTypes) AcceptCharset客户端可接受的字符集 AcceptEncoding客户端可接受的响应内容的编码方式 AcceptLanguage可接受的响应内容语言列表 Authorization用于表示HTTP中需要认证资源的认证信息 CacheControl用来指定当前的请求/回复中是否使用缓存机制 Connection客户端(浏览器)想要优先使用的连接类型 Cookie由之前服务器通过SetCookie(见下文)设置的一个HTTP协议Cookie ContentLength以八进制表示的请求体的长度 ContentType请求体的MIME类型 (用于POST和PUT请求中) Date发送该消息的日期和时间(以RFC 7231中定义的"HTTP日期"格式来发送) Expect表示客户端要求服务器做出特定的行为 Host表示服务器的域名以及服务器所监听的端口号。如果所请求的端口是对应的服务的标准端口(80),则端口号可以省略 IfMatch仅当客户端提供的实体与服务器上对应的实体相匹配时,才进行对应的操作。主要用于像 PUT 这样的方法中,仅当从用户上次更新某个资源后该资源未被修改的情况下,才更新该资源 IfModifiedSince允许在对应的资源未被修改的情况下返回304未修改 IfNoneMatch允许在对应的内容未被修改的情况下返回304未修改(304 Not Modified),参考超文本传输协议的实体标记 IfRange如果该实体未被修改过,则返回所缺少的那一个或多个部分; 否则,返回整个新的实体 Referer表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面 UserAgent浏览器的身份标识字符串 (1) Accept头字段用于指出客户端程序(通常是浏览器)能够处理的MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)类型。例如,如果浏览器和服务器同时支持png类型的图片,则浏览器可以发送包含image/png的Accept头字段,服务器检查到Accept头中包含image/png这种MIME类型,可能在网页中的img元素中使用png类型的文件。MIME类型有很多种,例如,下面的这些MIME类型都可以作为Accept头字段的值。 1Accept:text/html,表明客户端希望接受HTML文本 2Accept:image/gif,表明客户端希望接受GIF图像格式的资源 3Acept:image/*,表明客户端可以接受所有image格式的子类型 4Accept:*/*,表明客户端接受所有格式的类型 (2) AcceptCharset 头字段用于告知服务器端客户端所使用的字符集,具体示例如下: 1Accept-Charset:UTF-8 在上面的请求头中,指出客户端服务器使用 UTF8 字符集。如果想指定多种字符集,则可以在 AcceptCharset头字段中将指定的多个字符集以逗号分隔,具体示例如下: Accept-Charset:UTF-8,ISO-8859-1 需要注意的是,如果 AcceptCharset 头字段没有在请求头中出现,则说明客户端能接受使用任何字符集的数据。 如果AcceptCharset 头出现在请求消息里,但是服务器不能发送采用客户端期望字符集编码的文档,那么服务器将发送一个 406错误状态响应,406 是一个响应状态码,表示服务器返回内容使用的字符集与AcceptCharset头字段指定的值不兼容。 (3) AcceptEncoding头字段用于指定客户端能够进行解码的数据编码方式,这里的编码方式通常指的是某种压缩方式。在AcceptEncoding头字段中,可以指定多个数据编码方式,它们之间以逗号(,)分隔,具体示例如下: 1Accept-Encoding: gzip, compress 在上面的消息头中,gzip和compress这两种格式是最常见的数据编码方式。在传输较大的实体内容之前,对其进行压缩编码,可以节省网络带宽和传输时间。 需要注意的是,AcceptEncoding和Accept头字段不同,Accept头字段指定的MIME类型是指解压后的实体内容类型,而AcceptEncoding头字段则指定的是实体内容压缩的方式。 (4) Host头字段用于指定资源所在的主机名和端口号,格式与资源的完整URL中的主机名和端口号部分相同,具体示例如下: 1Host: www.baidu.com:80 2Host: www.baidu.com 在上述示例中,由于浏览器连接服务器时默认使用的端口号为80,所以“www.baidu.com”后面的端口号信息“:80”可以省略; 第1行与第2行指定的Host头字段作用一致。 需要注意的是,在HTTP 1.1中,浏览器和其他客户端发送的每个请求消息中都必须包含Host请求头字段,以便Web服务器能够根据Host头字段中的主机名来区分客户端所要访问的虚拟Web站点。当浏览器访问Web站点时,会根据地址栏中的URL地址自动生成相应的Host请求头。 (5) IfModifiedSince头字段的作用与IfMach类似,只不过它的值为GMT格式的时间。IfModifiedSince头字段被视作一个请求条件,只有服务器中文档的修改时间比IfModifiedSince头字段指定的时间新,服务器才会返回文档内容; 否则,服务器将返回一个304(Not Modified)状态码来表示浏览器缓存的文档是最新的,而不向浏览器返回文档内容,这时,浏览器仍然使用以前缓存的文档。通过这种方式,可以在一定程度上减少浏览器与服务器之间的通信数据量,从而提高通信效率。 (6) Referer头字段标识发出请求的超链接所在网页的URL。例如,本地Tomcat服务器的ch3_demo项目中有一个Html文件get.html,get.html中包含一个指向远程服务器的超链接,当单击这个超链接向服务器发送GET请求时,浏览器会在发送的请求消息中包含Referer头字段。其代码如下: Referer:http://get.htmllocalhost:8080/ ch3_demo Referer头字段非常有用,常被网站管理人员用来追踪网站的访问者是如何导航进入网站的,同时Referer头字段还可以用作网站的防盗链。 (7) UserAgent(用户代理, UA)用于指定浏览器或者其他客户端程序使用的操作系统及版本、浏览器及版本、浏览器渲染引擎、浏览器语言等,以便服务器针对不同类型的浏览器而返回不同的内容。例如,Windows 10操作系统下Chrome浏览器生成的UserAgent请求消息头代码如下: User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)) Chrome/81.0/81.0.4044.138 Safari/537.36 在上面的请求消息头中,UserAgent头字段列出了Mozilla版本、操作系统的版本(Windows NT 10.0)、浏览器的引擎名称(AppleWebKit/537.36)及浏览器版本( Chrome/81.0)信息。 注意: 操作系统不同,浏览器的UserAgent字段值也不相同。 由于篇幅有限,其他头字段可以参考HTTP文档,此处不再赘述。 3.2.3HTTP响应消息 一个HTTP响应代表服务器向客户端回送的数据,由三部分组成: 响应状态行、响应消息头和响应数据。响应数据也叫响应消息体,即客户端浏览器显示的内容。HTTP响应消息结构如图311所示。 图311HTTP响应消息结构 在Chrome浏览器中,Headers标签中的Response Header部分包含了HTPP响应消息的状态行和响应消息头; 而Preview标签或Response标签的内容则对应响应数据。 1. HTTP响应状态行 HTTP响应状态行由协议版本、响应状态码和状态描述三部分组成,各部分间以空格分隔。 响应状态码用于表示服务器对请求的处理结果,是一个三位的十进制数,分为五类。响应状态码及其含义如表34所示。 表34响应状态码及其含义 状态码含义常用状态码 1xx表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程100表示服务器同意处理客户的请求 2xx表示成功接受请求并已完成整个处理过程200表示请求成功,204表示内容不存在 3xx为完成请求,客户需进一步细化请求301表示页面移走了,304表示缓存的页面仍然有效 4xx客户端的请求有错误403表示禁止的页面,404表示页面没有找到 5xx服务器端出现错误500表示服务器内部错误,503表示以后再试 HTTP响应状态行代码示例如下: 1HTTP/1.1 404 Not Found,页面没有找到 2HTTP/1.1 500 Internal Error,服务器内部错误 3HTTP/1.1 200 OK,请求成功 2. HTTP响应消息头 服务器端通过响应消息头向客户端传递附加信息,包括服务程序名、被请求资源需要的认证方式、客户端请求资源的最后修改时间、重定向地址等信息。HTTP响应消息头的具体示例如下: 1Bdpagetype: 1 2Bdqid: 0xc625bd4d000d4ea7 3Cache-Control: private 4Connection: keep-alive 5Content-Encoding: gzip 6Content-Type: text/html;charset=UTF-8 7Date: Thu, 23 Jul 2020 17:07:00 GMT 8Expires: Thu, 23 Jul 2020 17:07:00 GMT 9Server: BWS/1.1 10Set-Cookie: BDSVRTM=16; path=/ 从上面的响应消息头可以看出,它们的格式和HTTP请求消息头的格式相同。当服务器向客户端回送响应消息时,根据情况的不同,发送的响应消息头也不相同。常用的响应消息头字段如表35所示。 表35HTTP常用的响应消息头字段 响应头说明 AcceptRanges服务器所支持的内容范围 Age响应对象在代理缓存中存在的时间,以秒为单位 CacheControl通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒 ContentDisposition对已知MIME类型资源的描述,浏览器可以根据这个响应头决定对返回资源的动作,如将其下载或是打开 ContentType当前内容的MIME类型 Date此条消息被发送时的日期和时间 ETag对于某个资源的某个特定版本的一个标识符,通常是一个消息散列 Expires指定一个日期/时间,超过该时间则认为此回应已经过期 LastModified所请求的对象的最后修改日期 Location用于在进行重定向或在创建了某个新资源时使用 ProxyAuthenticate要求在访问代理时提供身份认证信息 Refresh用于重定向或者当一个新的资源被创建时。默认会在5秒后刷新重定向 Server服务器的名称 SetCookie设置HTTP Cookie Vary告知下游的代理服务器,应当如何对以后的请求协议头进行匹配,以决定是否可使用已缓存的响应内容而不是重新从原服务器请求新的内容 WWWAuthenticate表示在请求获取这个实体时应当使用的认证模式 (1) Location头字段用于通知客户端获取请求文档的新地址,其值为一个使用绝对路径的URL地址,具体示例如下: Location:http://www.people.com.cn Location头字段和大多数3xx状态码配合使用,以便通知客户端自动重新连接到新的地址请求文档。由于当前响应并没有直接返回内容给客户端,所以使用Location头的HTTP消息不应该有实体内容。由此可见,在HTTP消息头中不能同时出现Location和ContentType两个头字段。 (2)Server头字段用于指定服务器软件产品的名称,具体示例如下: Server: Apache (3) Refresh头字段用于告诉浏览器自动刷新页面的时间,它的值是一个以秒为单位的时间数,具体示例如下: Refresh:2 上面所示的Refresh头字段用于告诉浏览器在2秒后自动刷新此页面。 注意: 在Refresh头字段的时间值后面还可以增加一个URL参数,时间值与URL之间用分号(;)分隔,用于告诉浏览器在指定的时间值后跳转到其他网页,例如告诉浏览器经过2秒跳转到www.people.com.cn网站,具体示例如下: Refresh:2;url=http://www.people.com.cn (4) ContentDisposition。 服务器向客户端浏览器发送文件时,如果是浏览器支持的文件类型(如txt、jpg等),一般会默认直接在浏览器中显示; 如果是让用户选择将响应的实体内容保存到一个文件中,就需要使用ContentDisposition头字段。 ContentDisposition属性是作为对下载文件的一个标识字段,ContentDisposition属性有两种类型: inline 和 attachment。inline 是将文件内容直接显示在页面; attachment是弹出对话框让用户下载。 attachment后面还可以指定filename参数。filename参数值是服务器建议浏览器保存实体内容的文件名称,浏览器应该忽略filename参数值中的目录部分,只取参数中的最后部分作为文件名。在设置ContentDisposition之前,一定要设置ContentType头字段,具体示例如下: 1Content-Type:application/octet- stream 2Content-Disposition: attachment; filename="filename.xls" 设置如上所示响应消息头后,浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序,比如使用记事本打开,而不是用浏览器直接打开。 视频讲解 3.3开发环境配置 3.3.1开发工具介绍 1. JDK JDK(Java Development Kit,Java开发工具包)由Sun公司提供。它为Java程序的开发提供了编译和运行环境,所有的Java程序的编写都依赖于它。 JDK有J2SE、J2EE和J2ME三个版本。其中,J2SE为标准版,主要用于开发桌面应用程序; J2EE为企业版,主要用于开发企业级应用程序,如电子商务网站和ERP系统等; J2ME为微缩版,主要用于开发移动设备、嵌入式设备上的Java应用程序。JDK的版本更新较快。但JDK8版本比较稳定,适合用于Eclipse等多种开发软件。本书中案例开发环境使用的是JDK8版本。 2. Tomcat服务器 Tomcat是Apache组织的Jakarta项目中的一个重要子项目,它是Sun公司推荐的运行Servlet和JSP的容器(引擎),其源代码是完全公开的。Tomcat不仅具有Web服务器的基本功能,还提供了数据库连接池等许多通用组件功能。 Tomcat运行稳定、可靠、效率高,不仅可以和目前大部分主流的Web服务器(如Apache、IIS服务器)一起工作,还可以作为独立的Web服务器软件。因此,越来越多的软件公司和开发人员都使用它作为运行Servlet和JSP的平台。 Tomcat的版本在不断地升级,功能也不断地完善与增强。目前最新版本为Tomcat 9.0,本书中以Tomcat v8.5作为Java Web应用开发服务器。 3. Eclipse开发平台 Eclipse是一个基于Java、开放源码并可扩展的应用开发平台,为开发人员提供了一流的Java集成开发环境。它是一个可以用于构建集成Web应用程序开发工具的平台,其本身并不提供大量的功能,而是通过插件来实现程序的快速开发。对于Java应用程序开发者来说,可下载普通的J2SE版本的Eclipse; 而对于Java Web应用程序开发者来说,需要使用J2EE版本的Eclipse。 Eclipse版本更新较快,本书中使用photon版,这可以从Eclipse的官方网站下载。在Eclipse下载完成后,将其解压到指定的文件夹下,就完成了Eclipse的安装。 3.3.2在Eclipse中配置JDK 在Eclipse中指定使用jdk1.8.0_251版本的JRE,配置操作步骤如下: (1) 单击菜单栏Window→Preferences命令,打开Preferences对话框,在左侧选择Java→Installed JREs,右边窗口就出现了JDK的配置项,如图312(a)所示。 图312Preferences对话框 (2) 单击Add按钮,弹出Add JRE对话框的类型选择窗口。这里会要求选中一个JRE版本添加到工作空间中,选择Standard VM,单击Next按钮,进入Add JRE对话框的JRE Definition窗口。Add JRE对话框如图313所示。 图313Add JRE对话框 (3) 单击Directory按钮,选择jdk1.8.0_251的安装目录,就会在JRE Name文本输入框中自动添加名称 jdk1.8.0_251,单击Finish按钮,完成JRE的添加,返回Preferences对话框,如图312(b)所示。在JRE列表中选择需要使用的JRE即完成了Eclipse中JDK的配置。 注意: 在首次启动Eclipse时,默认会选择当前安装的JRE。如果对JDK的版本没有特别要求,就不需要单独配置JRE。 3.3.3在Eclipse中配置Tomcat 在Eclipse中指定使用Tomcat v8.5,首先要配置服务器环境。其操作步骤如下: 1. 关联Eclipse和Tomcat服务器 (1) 选择菜单栏Window→Preferences选项,打开Preferences对话框,在其左侧选择Server→Runtime Environments,右边窗口就出现了Server的配置项如图314(a)所示。 图314Server Runtime Environments对话框 (2) 单击Add按钮,在弹出的选择Tomcat服务器对话框中选择Apache Tomcat v8.5。选择Tomcat服务器对话框如图315(a)所示。 (3) 单击Next按钮,在弹出的指定Tomcat路径对话框中单击Browse按钮,选择Tomcat v8.5的安装路径如图315(b)所示。 图315选择Tomcat服务器对话框 (4) 单击Finish按钮,添加完成,返回到Server Runtime Environments对话框,如图314(b)所示。在此对话框中单击Apply and Close按钮,即完成Eclipse与Tomcat服务器的关联。 2. 在Eclipse中创建Tomcat服务器 单击Eclipse下侧窗口的Servers视图(如果没有这个视图,可以通过选择菜单Window→ Show View选项打开),在选项卡中可以看到一个“No servers available.Define a new server from the new server wizard…”的链接,单击这个链接,会弹出New Server对话框,如图316所示。 图316New Server 对话框 选中图316所示的Tomcat v8.5 Server选项,单击Finish按钮,完成Tomcat服务器的创建。这时,在Servers视图中会出现一个“Tomcat v8.5 Server at localhost[Stopped]”选项,具体如图317所示。 图317在Eclipse中创建的Tomcat服务器 3. 更改Tomcat发布路径 在Tomcat服务器创建完毕后就可以使用了。此时如果创建了项目,并使用Eclipse发布后,由于项目会发布到Eclipse的metadata文件夹中,故不便于发布者查找发布的项目。为了方便查找发布后的项目目录,可以将项目直接发布到Tomcat中,这就需要对Server进行配置。具体配置方法如下。 双击图317中创建好的Tomcat服务器,在打开的Overview对话框中,选择Server Locations选项中的“Use Tomcat installation”选项,并将Deploy path文本框中的内容改为webapps,单击Eclipse工具栏上的(保存)按钮进行保存。至此,就完成了Tomcat的所有配置。Overview 对话框如图318所示。 图318Overview 对话框 4. 测试Tomcat的配置 单击图317所示的Servers视图工具栏中的按钮,即可启动Tomcat服务器。在浏览器地址栏中输入http://localhost: 8080/,如果能打开Tomcat服务器首页,说明Tomcat服务器启动成功。Tomcat服务器首页如图319所示。 图319Tomcat服务器首页 视频讲解 3.3.4创建第一个Java Web项目 编写一个简单的Java Web网站,访问该网站时,页面上输出“维护网络空间生态环境,从我做起……”。 1. 创建项目 在Eclipse中动态网站的项目类型是Dynamic Web Project,设定项目名称为ch3_demo,其他选项取默认值。 2. 创建JSP文件 在项目ch3_demo中,右击WebContent文件夹,在New菜单中选择JSP File选项,打开New JSP File对话框,输入文件名index.jsp,单击Finish按钮,文件创建完成。 index.jsp文件代码如下: 1<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> 2 3 4 5 6第一个Java Web项目 7 8 9
维护网络空间生态环境,从我做起……
10 11 单击工具栏上的保存按钮。至此,网站创建完成。 3. 部署动态网站 Java Web项目创建完成后,即可将项目发布到Tomcat并运行该项目。下面介绍具体的操作方法。 (1) 在项目资源管理器中选择项目名称,在工具栏上单击按钮中的倒三角,在弹出的菜单中选择Run As(运行方式)→Run On Server(在服务器上运行)选项,打开Run On Server对话框,在该对话框中选中Always use this server when running this project(将服务器设置为默认值)复选框,其他采用默认如图320所示。 图320Run On Server 对话框 (2) 单击Finish按钮,即可通过Tomcat运行该项目,运行后的效果如图321所示。 图321运行ch3_demo项目效果示意 注意: (1) 如果服务器已经启动了,这时会弹出一个对话框询问是否要重启服务器。建议选择第一个选项Restart Server(重启服务器)。 (2) 如果想在其他浏览器中查看该网站,可以将地址直接复制到浏览器的地址栏中,按回车键运行即可。3.4本 章 小 结 本章主要介绍了与Java Web应用程序开发相关的概念和开发环境的配置。3.1节介绍XML的概念,包括XML文档结构、XML语法等,并举例说明XML文档的创建; 3.2节详细介绍了HTTP的概念及HTTP的请求和响应消息,并通过其开发者工具观察请求头字段与响应头字段的值,理解其含义; 3.3节介绍Java Web开发工具的下载及开发环境的配置,重点介绍Tomcat服务器的安装以及在Eclipse中配置服务器环境,并完成第一个动态网站的创建。