Servlet生命周期

在web工程中每个Servlet类只会有一个实例化对象,这个实例化对象不能自己创建,只能由web服务器(Tomcat)来创建。这个实例化对象有一个生命周期,也就是所谓的Servlet生命周期。

Servlet生命周期分为三个阶段:

  1. 初始化阶段

有两种情况下会进入初始化阶段,这个阶段是Servlet生命周期的开始。第一种情况是当浏览器第一次进行访问时(注意是第一次),web服务器会去实例化Servlet对象,实例化Servlet对象完成后会把对象放在Servlet实例池中,并且会调用init方法。这个对象在整个生命周期中只会实例化一次,用户使用完了就会放回实例池,下一个用户访问时就不会再进行实例化了,而是从实例池中拿出来用。

重写init方法就可以得知Servlet对象只会实例化一次,因为只有实例化的时候才会调用init方法,代码示例:

Servlet生命周期与HTTP协议_Servlet


使用浏览器进行访问:

Servlet生命周期与HTTP协议_http_02

会出现405状态码,是因为没有重写doGet方法,不过这个对我们的实验没有影响。


控制台:

Servlet生命周期与HTTP协议_http_03

可以看到在控制台上打印了这段话,但是如果第二次访问就不会打印了,因为Servlet对象只会实例化一次:

Servlet生命周期与HTTP协议_Servlet_04


第二种情况是提前设置在服务器启动后就进行初始化,这种情况下没有浏览器的访问也会进入初始化阶段进行实例化Servlet对象。

设置在服务器启动后就进行初始化,需要在注解或web.xml文件上进行配置,注解的配置方式:

Servlet生命周期与HTTP协议_Servlet_05


控制台:

Servlet生命周期与HTTP协议_Servlet_06

如图代表配置成功,因为这个时候我只是启动了服务器,并没有使用浏览器去访问也进入了初始化阶段。


web.xml的配置方式:

Servlet生命周期与HTTP协议_Servlet_07


  1. 响应客户请求阶段

初始化阶段过后,就会进入响应客户请求阶段,web服务器就会调用HttpServlet的service方法,把HttpRequest和HttpResponse对象作为参数传递给service方法,在service方法中会对请求的方式进行匹配,会选择调用doGet、doPost等方法,匹配相应的方法后进入方法中调用逻辑层的方法,实现对客户的响应。然后可以通过调用HttpRequest对象的有关方法获取http请求信息,同时也可以再调用HttpResponse对象的有关方法,生成响应数据,最后web服务器把响应结果反馈给客户端。

代码示例:

Servlet生命周期与HTTP协议_Servlet_08


控制台:

Servlet生命周期与HTTP协议_Servlet_09


浏览器:

Servlet生命周期与HTTP协议_http_10

以上这个接收服务端请求并反馈处理结果的过程就是响应客户请求阶段。


  1. 终止(结束)阶段

有两种方式可以进入终止阶段,这个阶段也就是Servlet生命周期的结束。第一种方式是当我们修改了web工程源码文件并进行保存时,Eclipse会重新将工程部署一次,重新部署时会调用destroy方法销毁Servlet对象。同样的我们可以重写destroy方法来观测到这一点,代码示例:

Servlet生命周期与HTTP协议_Servlet_11


运行结果:

Servlet生命周期与HTTP协议_Servlet_12


关闭web服务器也会销毁Servlet对象,注意:要点击stop关闭,如果点击控制台上的那个红色的小方块是强制关闭,数据不会被保存到磁盘中,这种关闭方式会导致数据丢失:

Servlet生命周期与HTTP协议_Servlet_13


控制台:

Servlet生命周期与HTTP协议_http_14



流程图:

Servlet生命周期与HTTP协议_http_15

  1. 第7步是初始化阶段,第7-12步都属于服务阶段也就是响应客户请求阶段,执行第13步中的任意一种操作都会进入终止阶段。


思维导图:

Servlet生命周期与HTTP协议_Servlet_16




HTTP协议

HTTP是超文本传输协议,是互联网上应用最为广泛的一种协议,所有的网站访问都必须遵守这个标准。HTTP是基于TCP之上开发出来的,位于OSI模型中的应用层。

所谓协议就是一种通信规则的约定,基于这个协议可以完成从客户端到服务端等一系列运作流程,可以说,Web是建立在HTTP协议上进行通信的。

HTTP有一个请求头和响应头,当客户端访问服务器时,会先发送一个请求头,然后服务器会回执一个响应头。

HTTP衍生了一个HTTPS加密传输协议,这个协议是具有SSL加密的HTTP传输协议。

HTTP协议有一个请求头和响应头,是文本格式的,如图:

Servlet生命周期与HTTP协议_http_17


下面这是一个常见的http请求头的格式:

GET /form.html HTTP/1.1 (CRLF)

Accept:p_w_picpath/gif,p_w_picpath/x-xbitmap,p_w_picpath/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)

Accept-Language:zh-cn (CRLF)

Accept-Encoding:gzip,deflate (CRLF)

If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)

If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF)

User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)

Host:www.guet.edu.cn (CRLF)

Connection:Keep-Alive (CRLF)

(CRLF)



http有一个就叫做状态码的东西,状态码是服务器返回的,用于表服务器的响应状态,它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展,以下是状态码的含义:

2.3.2.1  1**:请求收到,继续处理

100——客户必须继续发出请求

101——客户要求服务器根据请求转换HTTP协议版本


2.3.2.2  2**:操作成功收到,分析、接受

200——交易成功

201——提示知道新文件的URL

202——接受和处理、但处理未完成

203——返回信息不确定或不完整

204——请求收到,但返回信息为空

205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件

206——服务器已经完成了部分用户的GET请求


2.3.2.3  3**:完成此请求必须进一步处理

300——请求的资源可在多处得到

301——删除请求数据

302——在其他地址发现了请求数据

303——建议客户访问其他URL或访问方式

304——客户端已经执行了GET,但文件未变化

305——请求的资源必须从服务器指定的地址得到

306——前一版本HTTP中使用的代码,现行版本中不再使用

307——申明请求的资源临时性删除



2.3.2.4  4**:请求包含一个错误语法或不能完成

400——错误请求,如语法错误

401——未授权

HTTP 401.1 - 未授权:登录失败

  HTTP 401.2 - 未授权:服务器配置问题导致登录失败

  HTTP 401.3 - ACL 禁止访问资源

  HTTP 401.4 - 未授权:授权被筛选器拒绝

HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

402——保留有效ChargeTo头响应

403——禁止访问

HTTP 403.1 禁止访问:禁止可执行访问

  HTTP 403.2 - 禁止访问:禁止读访问

  HTTP 403.3 - 禁止访问:禁止写访问

  HTTP 403.4 - 禁止访问:要求 SSL

  HTTP 403.5 - 禁止访问:要求 SSL 128

  HTTP 403.6 - 禁止访问:IP 地址被拒绝

  HTTP 403.7 - 禁止访问:要求客户证书

  HTTP 403.8 - 禁止访问:禁止站点访问

  HTTP 403.9 - 禁止访问:连接的用户过多

  HTTP 403.10 - 禁止访问:配置无效

  HTTP 403.11 - 禁止访问:密码更改

  HTTP 403.12 - 禁止访问:映射器拒绝访问

  HTTP 403.13 - 禁止访问:客户证书已被吊销

  HTTP 403.15 - 禁止访问:客户访问许可过多

  HTTP 403.16 - 禁止访问:客户证书不可信或者无效

HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效

404——没有发现文件、查询或URl

405——用户在Request-Line字段定义的方法不允许

406——根据用户发送的Accept拖,请求资源不可访问

407——类似401,用户必须首先在代理服务器上得到授权

408——客户端没有在用户指定的饿时间内完成请求

409——对当前资源状态,请求不能完成

410——服务器上不再有此资源且无进一步的参考地址

411——服务器拒绝用户定义的Content-Length属性请求

412——一个或多个请求头字段在当前请求中错误

413——请求的资源大于服务器允许的大小

414——请求的资源URL长于服务器允许的长度

415——请求资源不支持请求项目格式

416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段

417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求长。



2.3.2.5  5**:服务器执行一个完全有效请求失败

  HTTP 500 - 内部服务器错误

  HTTP 500.100 - 内部服务器错误 - ASP 错误

  HTTP 500-11 服务器关闭

  HTTP 500-12 应用程序重新启动

  HTTP 500-13 - 服务器太忙

  HTTP 500-14 - 应用程序无效

  HTTP 500-15 - 不允许请求 global.asa

  Error 501 - 未实现

HTTP 502 - 网关错误




TCP/IP Monitor

在Eclipse中可以通过配置TCP/IP Monitor,来监视服务端和客户端交互的数据,这个TCP/IP Monitor其实就是一个转发的机制,不管是客户端请求还是服务端响应都会经过TCP/IP Monitor的转发,所以我们才能通过它去监视请求和响应信息,配置方式:

Servlet生命周期与HTTP协议_Servlet_18

Servlet生命周期与HTTP协议_http_19

Servlet生命周期与HTTP协议_Servlet_20

Servlet生命周期与HTTP协议_Servlet_21



配置完成后,启动Tomcat然后通过浏览器进行访问,这次不要访问8080端口了,而是访问监视器配置的8081端口,这样才能监视到数据:

Servlet生命周期与HTTP协议_http_22


接着在Eclipse的TCP/IP Monitor窗口中可以查看到以下内容:

Servlet生命周期与HTTP协议_http_23

从这个窗口中可以看到客户端的请求头内容和服务端的响应内容。

上面这种直接通过URL访问的默认是get访问类型,可以看到请求头内容里的第一段写的就是GET类型。我们可以写一个简单的表单,指定post访问类型,看看访问后请求头会显示什么:

Html代码示例:

Servlet生命周期与HTTP协议_http_24


记得将doGet换成doPost:

Servlet生命周期与HTTP协议_Servlet_25


浏览器:

Servlet生命周期与HTTP协议_Servlet_26


浏览器运行结果:

Servlet生命周期与HTTP协议_Servlet_27


TCP/IP Monitor窗口:

Servlet生命周期与HTTP协议_http_28

从试验结果可以得知,不仅能够看到客户的访问类型,还能看到表单提交的数据。

除此之外我们还可以向服务器提交文件数据,而且能在TCP/IP Monitor窗口中看到提交文件中的内容,但是要注意只能在post访问类型才能看得到,get类型是见不到的,例如我要上传一个文本文件,内容如下:

Servlet生命周期与HTTP协议_http_29


Html代码:

Servlet生命周期与HTTP协议_Servlet_30



浏览器:

Servlet生命周期与HTTP协议_http_31



TCP/IP Monitor窗口:

Servlet生命周期与HTTP协议_Servlet_32

以上就是如何通过TCP/IP Monitor窗口查看服务端和客户端交互的数据。