Java Web程序设计与案例教程(微课版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-12 20:37:01

点击下载

作者:邵奇峰 郭丽

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java Web程序设计与案例教程(微课版)

Java Web程序设计与案例教程(微课版)试读:

前言

目前,Java Web是银行、电信、互联网行业普遍采用的企业级Web开发技术,如淘宝、京东的网页就是使用Java Web构建的。因为Java Web程序设计人员企业需求量大、就业率高、人才紧缺,所以Java Web程序设计成为了日后将要从事传统IT行业与互联网行业学生的必修课程。Java Web程序设计除了涉及Servlet和JSP等基础的Web开发技术,还囊括了HTML网页设计、数据库编程、软件设计模式、数据库与 Web 服务器的基本维护等内容。学习该课程需要学生拥有基础的Java编程能力、面向对象的分析设计能力及综合应用专业技术的动手能力,因此学习难度较大。

编者在十多年的高校授课和程序开发中发现,学习编程最重要的是使学生从一开始就能写出可运行的程序。唯有如此才可激发学生继续学下去的主动性,才能让学生在可运行的程序中去验证及体会各种知识点。通过这种实践方式学习的知识点,学生能够真正达到融会贯通、活学活用。为此,我们编写了这本着重透彻讲解核心基础,以案例开发贯穿关键知识点的教材,帮助Java Web编程的学习者从一开始就能够动手写出程序。另外,我们还针对本书的重点、难点录制了教学视频,读者可使用手机扫描书中的二维码免费观看。

全书包括以下内容。

第1章 Java Web开发基础:介绍了HTML基础,HTTP请求与响应报文,Tomcat的安装、配置及使用。

第2章 Servlet编程:介绍了Servlet创建、web.xml配置、请求参数处理、GET与POST请求、转发与重定向、Servlet生命周期、ServletContext、ServletConfig和Servlet注解。

第3章 Cookie与Session:介绍了Cookie与Session的基本工作原理、Cookie与Session在登录中的应用,并基于MVC模式实现了一个购物车案例。

第4章 JSP编程:介绍了JSP页面代码、JSP与Servlet的关系、JSP的隐含对象、4个作用域对象、JSP标签与JavaBean,并基于DAO模式实现了一个购物商城案例。

第5章 EL表达式与JSTL标签:介绍了EL语法、JSTL标签库,讲解了EL表达式与JSTL标签在购物商城案例中的应用。

第6章 数据库整合开发:介绍了MySQL基本知识、JDBC编程、连接池配置、DBUtils框架,讲解了DBCP连接池和DBUtils框架在购物商城案例中的应用。

第7章 过滤器与监听器:介绍了过滤器与监听器的基本原理及其在实际开发中的应用。

第8章 JSP和JavaBean应用开发——留言本1.0:结合JSP和JavaBean的Model 1设计模式实现一个网络留言本案例。

第9章 JSP、Servlet和JavaBean应用开发——留言本2.0:对留言本案例进行了功能扩展和架构重建,利用MVC设计模式、EL与JSTL减少了JSP页面中的Java代码片段,采用连接池、工厂设计模式、单例模式与过滤器提高了系统的性能和可维护性。

第10章 Java Web常用组件应用开发——留言本3.0:利用常用开源组件对留言本案例进行了功能扩展,增加了邮件找回密码功能、可视化在线编辑留言功能、图片上传与管理功能、登录的验证码检验功能和留言的分页查询功能。

第11章 Struts2、Spring 和 Hibernate 框架整合开发——留言本4.0:应用 Struts2、Spring 和Hibernate框架对留言本案例进行了重构,减少了项目中的编码量,并使项目具有较高的可维护性和可扩展性。

限于篇幅,书中只给出了实现主要功能的源代码,读者可在人邮教育社区(www.ryjiaoyu.com)上下载完整系统的代码及相关资源。

本书由中原工学院软件学院的邵奇峰、郭丽担任主编,张文宁、缑西梅及郑州航空工业管理学院计算机学院的刘磊担任副主编。其中,张文宁编写第1章和第7章,邵奇峰编写第2章、第10章和第11章,郭丽编写第3章和第4章,刘磊编写第5章和第6章,缑西梅编写第8章和第9章。最后全书由邵奇峰、郭丽统稿定稿。

在本书的编写过程中,编者得到了中原工学院软件学院车战斌院长、韩玉民副院长的指导和帮助,在此表示衷心的感谢!

由于能力和水平所限,书中仍然难免存在不足和疏漏之处,希望各位专家、老师和同学能毫无保留地提出所发现的问题,与编者共同讨论。编者的邮箱为shao@whu.edu.cn。编者2018年10月第1章 Java Web开发基础

Java Web是用Java技术解决Web互联网应用领域的技术资源的总和。HTML、HTTP及Tomcat是Java Web开发中的基础技术,如果对这些技术没有深入掌握和理解,技术人员就无法解释和应对开发中出现的诸多问题。因此,初学者务必要牢固掌握这些技术。本章讲解HTML、HTTP及Tomcat的相关内容,它们是Java Web开发的基础。1.1 HTML简介

在Java Web应用中,所有的参数输入界面和结果输出界面,最终都要通过HTML网页展现在用户的浏览器中。我们经常访问各大网站,也是由HTML网页展现的。浏览器中显示的网页(见图1.1)实际上是HTML代码(见图1.2)被浏览器解析渲染后的结果。图1.1 百度首页图1.2 百度首页的HTML代码

HTML是一种用来描述网页的超文本标记语言(Hyper Text Markup Language),超文本是指页面内可以包含图片、链接、程序等非文字元素。HTML不是一种编程语言,而是一种使用标签的标记语言,也就是说,HTML是使用标记标签来描述网页的。

HTML标记标签通常被称为HTML标签(HTML Tag),是由尖括号包围的关键词组成,一般成对出现,如和。其中,第一个标签称为开始标签(也称开放标签),第二个标签称为结束标签(也称闭合标签)。1.1.1 HTML文档结构

HTML文档是由HTML元素定义的,HTML元素指的是从开始标签到结束标签的所有代码。HTML元素(以下简称元素)分为两大类:一类用于确定超文本在浏览器中显示的方式;另一类用于确定超文本在浏览器中显示的内容。元素在文本中的格式为:<元素名>内容。元素可以拥有属性,属性提供了有关 HTML 元素的更多信息,一般以名称/值对的形式出现,且总是在HTML元素的开始标签中定义。

HTML文档的基本结构包括头部和主体部分。头部提供关于网页的信息,包含页面的标题、序言、说明等内容,其本身不作为内容来显示,但影响网页显示的效果。HTML使用标签表示头部信息的开始和结尾。主体部分提供网页的具体内容,使用和标签进行标记,网页中显示的实际内容均需要包含在这两个标记之间,如文字、表格、图像、声音、动画及相关的格式化标记等。如下代码描述了HTML的基本结构。

1

2

3 网页标题

4

5

6 网页内容

7

8

当使用Web浏览器打开一个文件时,首先会识别文件的扩展名并据此判定文件类型,然后根据文件类型确定其打开方式。HTML文档本身是一种文本文件,它的文件扩展名通常为“.htm”或“.html”。用户可以使用任何能够生成.txt类型源文件的文本编辑器来编译超文本标记语言文件,然后将文件扩展名修改为“.htm”或“.html”即可。需要注意的是,Web浏览器对HTML注释之间的部分不予显示,但优秀的网页应该有详尽的注释,以帮助其他开发者理解页面源代码。

下面,我们将通过一个简单的程序演示HTML的基本结构。新建一个文本文档,将其命名为“html_first.html”,在该文档中输入如下代码并保存。其中,和之间的内容用于描述整个网页;和之间的内容用于描述网页的头部信息;之间的文本用于定义页面的标题,位于和标记之间。和之间的文本是可见的页面内容。

1

2

3 first html

4

5

6 welcome to HTML

7

8

使用浏览器方式打开html_first.html文件,页面展现结果如图1.3所示。也就是说,Web浏览器的作用是读取HTML文档并进行解析,最终以网页的形式显示出解析结果。图1.3 html_first.html页面效果1.1.2 HTML常用标签

1.基本标签

基本标签包括文本、字体、图片等相关标签。下面逐一进行介绍。(1)注释

注释标签的格式为:<!-- 注释内容 -->,注释并不局限于一行,其长度不受限制。结束标记与开始标记可以不在同一行上。(2)标题</p>

标题是一段文字内容的核心,通常用加强的效果来表示。在网页中,可以通过设置不同大小的标题来增加文档结构的条理性。HTML 是通过

等标签定义标题的,其中,

定义字号最大的标题,

定义字号最小的标题。新建一个文本文档,将其命名为html_second.html,并在其中输入以下代码。

1 

2 

3  second html

4 

5 

6  

网页内容标题1

7  

网页内容标题2

8  

网页内容标题3

9  

网页内容标题4

10  

网页内容标题5

11  

网页内容标题6

12 

13 

使用浏览器方式打开html_second.html文件,页面展现结果如图1.4所示。从图中可以看出,

定义的标题最大,之后依次递减,

定义的标题最小,且浏览器会自动在标题的前后添加空行。一般情况下,用户是通过标题快速浏览网页的,所以标题是呈现文档结构的重要手段。大家在应用该标签时要确保将标题标签仅用于标题,不要仅仅为了产生粗体或大字号文本而使用标题。此外,应该首先将h1用作主标题(最重要的),其次是h2(次重要的),再其次是h3,依此类推。图1.4 html_second.html页面效果(3)换行

对网页中的内容进行换行和分段是常见的操作。在用浏览器浏览一个网页时,浏览器只有在HTML文件中遇到换行或分段的标签时,才会进行换行或分段的操作。HTML分段是通过

元素定义的,该元素拥有一个开始标签

,以及一个结束标签

。同标题标签一样,浏览器会自动在段落的前后添加空行。

如果用户希望在不产生新段落的情况下进行换行,可以使用
标签。由于
元素是一个空的HTML元素,且关闭标签没有任何意义,因此它没有结束标签。

分割内容的另外一个方法是使用分割线,


标签用于在HTML页面中创建水平线。

下面将新建html_third.html文档演示分段和换行,代码如下。

1 

2 

3  Third html

4 

5 

6  

这是第一段

7  


8  

欢迎

9  
使用HTML分段和换行标签

10  

11 

12 

使用浏览器方式打开 html_third.html 文件,页面展现结果如图1.5所示。从图中可以看出,

能在浏览器中生成一个段落,且段前段后都有空行。


能在页面中创建一条水平线。
使得“使用 HTML 分段和换行标签”出现在下一行。要注意的是,使用

插入一个空行并不推荐,需要产生新一行时请使用
标签代替。图1.5 html_third.html页面效果(4)样式

HTML的style属性提供了一种改变所有HTML元素样式的通用方法。其中,background-color属性为元素设置了背景颜色,font-family属性设置了文本的字体系列,color属性设置了文本的字体颜色,font-size属性设置了文本的字体大小,text-align属性设置了元素中文本的水平对齐方式。(5)超链接

超链接可以是一个字、一个词或者一句话,用户可以单击超链接跳转到新的文档或当前文档中的某个位置。当鼠标指针移动到超链接时,箭头会变为手型。在HTML文档中,可以使用标签在 HTML 中创建链接,并使用href属性表明链接所指向的目标URL地址,该URL地址可以是绝对地址、相对地址或页内书签。

下面将创建html_fourth.html文件,对style属性及超链接进行验证,代码如下。

1 

2 

3   唐诗宋词

4 

5 

6  

绝句二首

7  

杜甫

8

9  

10  绝句·迟日江山丽

11  

12  迟日江山丽

13  
春风花草香

14  
泥融飞燕子

15  
沙暖睡鸳鸯

16  

17  百度搜索

18 

19 

使用浏览器方式打开html_fourth.html文件,页面展现结果如图1.6所示。从图中可以看出,标题和段落都按照要求进行了格式化,且在网页下方出现了超链接。单击“百度搜索”,浏览器会跳转到百度首页。图1.6 html_fourth.html页面效果(6)图片

使用图片标签,不仅可以把一幅图片加入网页中,还可以设置图片的尺寸、布局等属性。图片标签的格式如下。

1

2 alt="简单说明"

3 width="图片宽度" height="图片高度"

4 border="边框宽度"

5 />

如果不设置图片的尺寸,图片将按照其本身的大小显示。使用标签的 width 和 height属性可以设置图片的大小,width和height的属性值既可取像素数,也可取百分数。

2.表格

表格是将文本和图像按一定的行、列规则进行排列,是显示长信息的一种优秀元素。

HTML使用

标签定义表格,每个表格均有若干行(由标签定义),每行被分割为若干单元格(由
标签定义)。td 指表格数据(Table Data),即数据单元格的内容。数据单元格可以包含文本、图片、列表、段落、表单、水平线、表格等。表1.1列出了和表格相关的标签,其中,定义表格,定义了表格中的一行,…中间的内容显示在一行中,进行标记, 代表空格。表1.1 表格相关标签
是表格的标题说明,
定义了表格中的表头,大多数浏览器会把表头显示为粗体、居中的文本,定义了表格中每个单元格的具体内容。在日常应用中,经常会遇到单元格内容为空的情况,可以使用 

如果不定义边框属性,表格在显示时将不显示边框,为了使得边框可见,可以使用“border”属性指明边框的宽度。若要指明表格的背景,可以使用“bgcolor”属性。进一步地,可以使用“background”属性指明表格的背景图像。当然,这些属性也可应用于标签,以设置单元格的背景颜色和背景图像。同设置文本一样,表格也可以设置排列方式,用户可以通过“align”属性排列单元格内容,以便创建一个美观的表格。

下面通过一个例子演示表格的相关标签。新建html_fifth.html文档,代码如下。

1

2 

3 

学生基本信息

4 

5 表1 学生基本信息

6 

7  序号

8  姓名

9  年龄

10  居住城市

11 

12 

13  1

14  张三

15  18

16  北京

17 

18 

19  2

20  王曼

21  20

22  广州

23 

24 

25 

26 表2 学生成绩信息

27 

28   序号

29   姓名

30   课程

31   分数

32 

33 

34   1

35   张三

36   Java Web

37   90

38 

39 

40   2

41   王曼

42   English

43   96

44 

45 

46   2

47   王曼

48   思想道德修养

49    

50 

51 

52 

使用浏览器方式打开 html_fifth.html 文件,页面效果如图1.7所示。从图中可以看出,表1和表2按照标签的设定进行了展示。图1.7 html_fifth页面效果

3.表单

HTML表单用于搜集不同类型的用户输入,当用户填好表单所需信息并将表单提交后,服务器就可以得到表单中的信息并进行处理。HTML 表单通过

元素进行定义,常用的属性如表1.2所示。表1.2 常用属性

HTML表单可以包含多种表单元素,如输入框、复选框、单选按钮、提交按钮等。表1.3列出了表单中的常用元素。表1.3 表单常用元素

其中,元素是表单中最重要的元素,用来定义表单中的各类输入域,供用户输入信息。该元素有很多属性,常见的有name属性、type属性、value属性、readonly属性、disabled属性、size属性等。(1)name属性定义了元素的名称,该属性用于对提交到服务器的表单数据进行标识。在提交表单数据时,只有设置了name属性的表单元素才能在提交表单时传递它们的值。(2)type属性描述了元素的输入类型,常见的type属性取值有以下几种。

:定义单行文本输入字段,当用户要在表单中输入字母、数字等内容时,就会用到文本域。以下代码定义了firstname和lastname两个单行文本输入框供用户输入。

1

2 First name:

3 Last name:

4

:定义密码字段,该字段字符不会明文显示,而是以星号或圆点代替。以下代码在网页中定义了密码输入字段,用户输入的密码将在浏览器中以星号或圆点显示。

1

2 Password:

3

:定义单选框表单控件,允许用户在多个选项中选择其中一个。以下代码声明了一组单选框表单控件,名称为“radio1”。这组单选框有3个选项,选项的名称分别为“选项1”“选项2”“选项3”,3个选项对应的值分别为“value1”“value2”“value3”。

也就是说,通过统一单选框表单的名字,可以实现选项的互斥。

1 选项1

2 选项2

3 选项3

:定义复选框,允许用户从多个选项中选择多个。以下代码声明了一组复选框,名称为“vehicle”,允许用户在“I have a bike”和“I have a car”两个选项中进行选择。

1

2 I have a bike

3 I have a car

4

:提交按钮。当用户单击提交按钮时,表单的内容会被传送到另一个文件中。表单的动作属性定义了目的文件的文件名,该目的文件通常会对接收到的输入数据进行相关的处理。在以下代码中,当用户单击“Submit”按钮时,表单中用户输入的username会以get方式提交到“html_form_action.php”文件中进行处理。

1

2 Username:

3

4

(3)value属性规定输入字段的初始值。(4)readonly属性规定输入字段为只读(不能修改),该属性不需要赋值,它等同于readonly="readonly"。(5)disabled 属性规定输入字段是禁用的,被禁用的元素是不可用和不可单击的,且被禁用的元素不会被提交。此外,该属性同readonly属性一样,不需要赋值,等同于disabled="disabled"。(6)size属性定义了输入域分配的显示空间大小,它以字符为单位。(7)maxlength属性限定了用户能够输入的字符数。

1

2

3

4

5

6

7

8

1

2 我是一个文本框。

3

下面,通过一个例子来演示表单的综合应用,新建文本文档,将其命名为 html_sixth.html,代码如下。

1 

2 

3   学生基本信息

4 

5 

6  

学生基本信息录入

7  

8    账 号:

9   

10   密 码:

11   

12   性 别:

13   

14   

15   

16   兴 趣:

17   打球

18   画画

19   学习

20   

21   学 历:

22   

23   

24   

25   

26   

27   

28   

29   

简 介:

30   

31   

32   

33   

照片上传:

34   

35   

36   

37   

38   

39  

40  

41 

使用浏览器方式打开 html_sixth.html文件,页面展现结果如图1.8所示。对应于账号输入框的是username输入域,类型为text;对应于密码输入框的是password输入域,类型为password;页面中定义的性别输入域,名称为sex,类型为radio;兴趣输入域的类型为checkbox,名称为interest;学历通过下拉列表进行控制;简介是一个行数为10、列数为30的输入域;照片上传文件输入域的类型为file。图1.8 html_sixth.html页面效果1.2 HTTP请求与响应

超文本传输协议(HyperText Transfer Protocol,HTTP)是用于从WWW服务器传输超文本到本地浏览器的应用层传输协议。其简捷、快速的方式,非常适合用于分布式超媒体信息系统。HTTP是在1990年提出的,经过多年的使用与发展,得到不断的完善和扩展。

HTTP工作于客户端-服务器架构之上,如图1.9所示。浏览器作为HTTP客户端通过URL向HTTP服务器(即Web服务器)发送所有请求,Web服务器根据接收到的请求向客户端发送响应信息。图1.9 客户端-服务器架构

1991年,HTTP/0.9版发布,该版本非常简单,只有一个GET命令。1996年5月,HTTP/1.0版本发布,其内容大大增加,任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还可以传输图像、视频及二进制文件,HTTP/1.0为互联网的发展奠定了基础。1997年1月,HTTP/1.1版本发布,它进一步完善了HTTP,直到现在HTTP/1.1仍是较为流行的版本。2015年,HTTP/2版本发布,但未得到普及应用。下面以HTTP/1.1版本的协议为例,对HTTP请求以及HTTP响应格式进行说明。1.2.1 HTTP请求报文格式

HTTP请求由三部分组成:请求行、消息报头、请求正文。其中的部分消息报头和实体内容是可选的,消息报头和请求正文之间要用空行隔开。HTTP请求消息的基本格式如图1.10所示。图1.10 HTTP请求消息的基本格式

一个简单的HTTP请求消息如下所示。

GET /1.html HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

Upgrade-Insecure-Requests: 1

第一部分为请求行,用来说明请求类型、要访问的资源以及所使用的HTTP版本。其中,GET说明 HTTP 的请求方法为 GET,“/1.html”为要访问的资源,该行的最后一部分说明使用的是HTTP/1.1版本。其中请求方法有多个,各个方法的具体含义如表1.4所示。表1.4 HTTP的请求方法

第二部分为请求报头,是紧接在请求行之后的部分,用来说明服务器要使用的附加信息。从第二行起为请求报头开始,Host指出请求的目的地,User-Agent是浏览器类型检测逻辑的重要基础,该信息由浏览器来定义,并且在每个请求中自动发送,以及其他一些在HTTP请求解析中有用的信息。下面介绍一些比较常用的HTTP请求报头以及各个报头的含义。

1.Host

Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常是从HTTP URL中提取出来的,在发送请求时,该报头域是必需的。例如,在浏览器中输入“http://localhost:8080/index.html”,浏览器发送的请求消息中就会包含Host请求报头域的内容,代码如下。Host:localhost:8080

2.Accept

Accept请求报头域用于指定客户端接受哪些类型的信息。例如,“Accept:image/gif”表明客户端希望接收“GIF”图像格式的资源;“Accept:text/html”表明客户端希望接收html文本。

3.Accept-Charset

Accept-Charset请求报头域用于指定客户端接受的字符集。例如,“Accept-Charset:gb2312”,如果在请求消息中没有设置这个域,则表示任何字符集都可以接受。

4.Accept-Encoding

Accept-Encoding 请求报头域类似于 Accept,但它只用于指定可接受的内容编码。例如,“Accept-Encoding:gzip.deflate”,如果请求消息中没有设置这个域,则表示客户端对各种内容编码都能接受。

5.Accept-Language

Accept-Language 请求报头域类似于 Accept,但它只用于指定一种自然语言。例如,“Accept-Language:zh-cn”,如果请求消息中没有设置这个报头域,则表示客户端对各种语言都能接受。

6.Authorization

Authorization 请求报头域用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到的服务器响应代码为401(未授权),则客户端会发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

7.User-Agent

用户登录到一些网站时,往往会看到一些欢迎信息,其中列出了客户端操作系统的名称和版本,以及所使用的浏览器的名称和版本,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息的。User-Agent请求报头域允许客户端将它的操作系统、浏览器及其他属性告诉服务器。

第三部分是一个空行,请求报头结束后,必须添加一个空行,即使第四部分的请求数据为空,也必须有空行。

第四部分是请求正文,请求正文也称请求主体,在其中可以添加任意其他数据,这些数据都是按照“key=value”的格式设置参数名与参数值信息的,多个参数之间使用“&”进行分隔。该例的请求正文为空。带有请求正文的HTTP请求消息示例代码如下。

GET /1.html HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

Upgrade-Insecure-Requests: 1

username=admin&password=1234561.2.2 HTTP响应报文格式

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。HTTP 响应也由三部分组成:状态行、响应报头和响应正文。图1.11所示为 HTTP 响应消息的基本格式。图1.11 HTTP响应消息的基本格式

一个简单的HTTP响应消息如下所示。

HTTP/1.1 200 OK

Date: Tue, 16 May 2017 07:23:05 GMT

Content-Length: 97

Content-Type: text/html;charset=UTF-8

Last-Modifield: Tue, 16 May 2017 04:14:19 GMT

HttpServerhello world

第一部分是状态行,由HTTP的版本号、状态码和状态消息三部分组成。第一行中的“HTTP/1.1 200 OK”表明此HTTP的版本号为1.1,状态码为200,状态消息为“OK”,代表服务器成功接收了请求并做出了最终的正确回应。HTTP 响应中包含了很多响应状态码,表1.5列举了常见的几种响应状态码,并对各个状态码的含义做出了解释。表1.5 常用响应状态码及其说明

第二部分是响应报头,用来说明客户端要使用的一些附加信息。其中,Date表示生成响应的日期和时间。而Content-Type指定了响应正文的MIME类型是文本类型,并且是文本中的HTML类型,响应正文的编码类型是UTF-8。Content-Length说明了响应正文的长度。Last-Modifield指明资源最终修改的时间。

第三部分是一个空行,响应报头后面的这个空行也是必需的。

第四部分是响应正文,服务器返回给客户端的文本信息。空行后面的html部分为响应正文,在这里是一个符合HTML语法标准的字符串。1.2.3 URL

HTTP请求通常由HTTP客户端发起,并建立一个到服务器指定端口的TCP连接,HTTP服务器则在该端口监听客户端发送过来的请求。一旦收到请求,服务器会向客户端发回一个状态行(如“HTTP/1.1 200 OK”)以及响应的消息,消息的消息体可能是请求的文件、错误消息,或者是其他一些信息。通过HTTP请求的资源由统一资源标示符(URL)来标识。

URL是一种特殊类型的统一资源定位符,用于确定网络中具体资源的位置。URL包含了用于查找某个资源的足够信息,其具体格式如下。http://host[:port]/[abs_path]

其中,http表示要通过HTTP来定位网络资源;host表示合法的Internet主机域名或者IP地址;port 指定一个端口号,为空则使用默认端口80;abs_path 指定请求资源的 URL;如果 URL中没有给出 abs_path,那么当它作为请求 URL 时,必须以“/”的形式给出,该工作一般由浏览器自动完成。1.2.4 简单的Web服务器

学习完HTTP的内容后,思考一下,如何通过Web服务器将HTML文件,使用HTTP在互联网上进行共享?

下面使用ServerSocket来发布一个Web服务,让浏览器通过HTTP来连接这个Web服务, Web服务接收浏览器发送过来的HTTP请求,并对HTTP请求进行解析,封装到Request对象中, Request类的定义如下。

1 public class Request {

2   private Map requestHeadMap = new HashMap();

3   private String method;    //请求方法

4   private String resourcePath;  //请求路径

5   private Map parameter = new HashMap(); //请求参数

6   public void setRequestHead(String key,String value){

7     requestHeadMap.put(key, value);

8   }

9   public String getHead(String key){

10    return requestHeadMap.get(key);

11  }

12  public void setParameter(String key,String value){

13    parameter.put(key, value);

14  }

15  public String getParameter(String key){

16    return parameter.get(key);

17  }

18  public String getMethod() {

19    return method;

20  }

21  public void setMethod(String method) {

22    this.method = method;

23  }

24  public String getResourcePath() {

25    return resourcePath;

26  }

27  public void setResourcePath(String resourcePath) {

28    this.resourcePath = resourcePath;

29  }

30 }

首先,定义Web服务类为HttpServer,在该类中创建一个ServerSocket对象,占用8080端口,并循环等待浏览器连接,当浏览器发送请求连接服务器后,HttpServer 针对当前连接启动线程,进行HTTP请求处理,进而继续等待浏览器连接,HttpServer代码如下。

1 public class HttpServer {

2   private ServerSocket server;

3   public HttpServer(){

4    try {

5      server = new ServerSocket(8080);

6    } catch (IOException e) {

7      System.out.println("服务无法启动");

8      e.printStackTrace();

9      System.exit(1);

10    }

11 }

12 /**

13  * 启动Web服务器接收客户端的HTTP请求,对请求进行解析处理,生成响应

14  */

15 public void run(){

16    while(true){

17      try {

18        //等待客户端连接

19        Socket socket = server.accept();

20        RequestProcess requestPro = new RequestProcess(socket);

21        //启动线程进行请求处理

22        Thread thread = new Thread(requestPro);

23        thread.start();

24      } catch (IOException e) {

25        System.out.println("客户端连接异常");

26        e.printStackTrace();

27      }

28    }

29 }

30 }

在上述代码中,RequestProcess是对浏览器发送的HTTP请求进行处理的工具类,该类主要从Socket连接中获得完整的HTTP请求消息,并封装到请求对象Request中,再根据请求中的请求资源路径,将具体资源文件封装到HTTP响应Responce对象中,Responce类的定义如下。

1 public class Responce {

2   private int respCode = 200;    //响应状态码

3   private byte[] respBody;     //响应正文

4   private Map respHead = new HashMap();//响应头

5   public void setHead(String key,String value){

6      respHead.put(key, value);

7   }

8   public int getRespCode() {

9      return respCode;

10   }

11   public void setRespCode(int respCode) {

12     this.respCode = respCode;

13   }

14   public byte[] getRespBody() {

15     return respBody;

16   }

17   public void setRespBody(byte[] respBody) {

18     this.respBody = respBody;

19   }

20   public Map getRespHead() {

21     return respHead;

22   }

23    public void setRespHead(Map respHead) {

24     this.respHead = respHead;

25    }

26 }

最后根据资源文件的处理情况,设置Responce对象中的响应状态码,将最终的响应结果对象解析成 HTTP 响应格式,通过 Socket 连接将 HTTP 响应发送给浏览器,浏览器进行接收, RequestProcess请求处理类的具体代码如下。

1  public class RequestProcess implements Runnable{

2  private Socket socket;

3  public RequestProcess(Socket socket){

4    this.socket = socket;

5  }

6  @Override

7  public void run() {

8    try {

9    //获取客户端的请求详情

10    Request req = getReauest();

11    //根据请求获取资源,生成响应对象,设置响应正文,并设置响应状态码

12    Responce resp = requestProcess(req);

13    //将响应正文返回给客户端

14    printResponce(resp);

15    } catch (IOException e) {

16      System.out.println("无法读取客户端的连接");

17      e.printStackTrace();

18    }

19

20 }

21 private Request getReauest() throws IOException{

22    InputStream io = this.socket.getInputStream();

23    Request request = new Request();

24    BufferedReader br = new BufferedReader(new InputStreamReader(io));

25    String line;

26    //处理请求行

27    line = br.readLine();

28    String[] requestLine = line.split(" ");

29    request.setMethod(requestLine[0]);      //请求方法

30    request.setResourcePath(requestLine[1]);   //请求路径

31    //处理请求头

32    while((line = br.readLine())!=null&&!"".equals(line)){

33      String[] heads = line.split(":");

34      request.setRequestHead(heads[0],heads[1]);

35    }

36    return request;

37 }

38 private Responce requestProcess(Request request) throws IOException {

39    Responce resp = new Responce();

40    String resource = request.getResourcePath();

41    FileInputStream fr = null;

42    try {

43      File file = new File(System.getProperty("user.dir") + resource);

44      fr = new FileInputStream(file);

45      byte[] body = new byte[(int)file.length()];

46      fr.read(body);

47      resp.setRespBody(body);

48    } catch (FileNotFoundException e) {

49      resp.setRespCode(404);

50    }finally{

51      if(fr!=null){

52        fr.close();

53      }

54    }

55    return resp;

56 }

57

58 private void printResponce(Responce resp) throws IOException{

59    System.out.println("开始生成响应");

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载