servlet只是用来扩展基于HTTP协议的WEB容器
1、客户端发送请求至服务器端
2、服务器将请求信息发送至Servlet
3、Servlet生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求
4、服务器将响应的内容返回给客户端
生命周期
1、客户端请求该Servlet
2、加载Servlet类到内存
3、实例化并调用init()方法初始化该Servlet
4、service()(根据请求方法不同调用doGet()或者doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destory())
doHead()是一个已经实现的方法,它将执行doGet但是仅仅向客户端返回doGet应该向客户端返回的头部的内容
doOptions方法自动的返回servlet所直接的HTTP方法信息
doTrace方法返回TRACE请求中的所有头部信息
5、加载和实例化servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的servlet
工作模式
客户端发送请求至服务器
服务器启动并调用Servlet,servlet根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端
httpservlet类是用http协议实现的servlet的基类,springmvc中的Dispatcherservlet就是继承了httpservlet
http状态码
100 只有请求的一部分已经被服务器接收,但只要它没有被拒绝,客户端应继续该请求
101 服务器切换协议
200 请求成功
201 该请求时完整的,并创建一个新的资源
202 该请求被接受处理,但是该处理是不完整的
203 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
204 如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。
由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
205 服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。
与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
响应必须包含如下的头部域:
Content-Range 用以指示本次响应中返回的内容的范围;如果是 Content-Type 为 multipart/byteranges 的多段下载,则每一 multipart 段中都应包含 Content-Range 域用以指示本段的内容范围。假如响应中包含 Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。
Date
ETag 和/或 Content-Location,假如同样的请求本应该返回200响应。
Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。
假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。
假如 ETag 或 Last-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起
300 链接列表。用户可以选择一个链接,进入到该位置,最多5个地址
301 所请求的页面已经转移到一个新的URL
302 所请求的页面已经临时转移到一个新的URL
303 所请求的页面可以在另一个不同的URL下被找到
304 如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
该响应必须包含以下的头信息:
Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。
ETag 和/或 Content-Location,假如同样的请求本应返回200响应。
Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。
假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。
假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。
假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值。
305 被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果。
306 以前的版本中使用该代码。现在已经不再使用它,单代码仍被保留
307 所请求的页面已经临时转移到一个新的URL
400 服务器不理解请求
401 所请求的页面需要用户名和密码
402 您还不能使用该代码
404 服务器无法找到该页面
405 在请求中指定的方法是不允许的
406 服务器只生成一个不被客户端接受的响应
407 在请求送达之前,您必须使用代理服务器的验证
408 请求需要的时间比服务器能够等待的时间长,超时
409 请求因为冲突无法完成
410 所请求的页面不再可用
411 "Content-Length"未定义。服务器无法处理客户端发送不带Content-Length的请求信息
412 请求中给出的先决条件被服务器评估为false
413 服务器不接受该请求,因为请求实体过大
414 服务器不接受该请求,因为URL太长。当您转换一个post请求为一个带有长的查询信息get请求时发生
415 服务器不接受该请求,因为媒体类型不被支持
417 在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。
500 未完成的请求。服务器遇到了一个意外的情况
501 未完成的请求,服务器不支持所需的功能
502 未完成的请求,服务器从上游服务器收到无效响应
503 未完成的请求。服务器暂时超载或司机
504 网关超时
505 服务器不支持HTTP协议版本
servlet自定义状态码
response.sendError(407, “Need authentication!!!” );