Http与HttpServlet
Posted Garen的IT之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http与HttpServlet相关的知识,希望对你有一定的参考价值。
本文开始之前,先介绍一下HttpServlet容器响应Web客户请求的流程:
1) Web客户向Servlet容器发出Http请求;
2)Servlet容器解析Web客户的Http请求;
3)Servlet容器创建一个HttpRequest对象,在这个对象中封装Http请求信息;
4)Servlet容器创建一个HttpResponse对象;
5)Servlet容器调用HttpServlet的service方法,这个方法中会根据request的Method来判断具体是执行doGet还是doPost,把HttpRequest和HttpResponse对象作为service方法的参数传给HttpServlet对象;
6)HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7)HttpServlet调用HttpResponse的有关方法,生成响应数据;
8)Servlet容器把HttpServlet的响应结果传给Web客户。
注:Servlet生命周期包括:初始化(init())、响应客户请求阶段(service())、终止阶段(destroy())。
这里涉及了两个重要的东西,一个是Http,另外一个是HttpServlet。接下来分别介绍下这两个概念。
Http
(1)HTTP协议
Web浏览器和服务器通过HTTP协议在Internet上发送和接收消息。HTTP是一种基于请求/响应模式的协议。客户端发送一个请求,服务器端返回对该请求响应。
HTTP使用可靠的TCP连接,默认端口是80。
特点:
无连接:限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
媒体独立的:只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中
HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度
HTTP/1.0和HTTP/1.1支持的方法
(2)HTTP请求
HTTP是基于客户端/服务端(C/S)的架构模型
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,
请求报文的一般格式:
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
(以新华网为例)
请求消息
响应消息
各个字段的意思详见相关网页,这里不再赘述。
使用Cookie的状态管理。
HTTP是无状态协议,由于是无状态不必保存状态,自然减少了服务器的CPU及内存消耗。保留无状态特征又要解决登录状态问题,所以引入了cookie技术。cookie技术通过在请求和响应报文中写入cookie来控制客户端状态。
cookie会根据从服务器端发送的响应报文中叫做Set-Cookie的首部字段,通知客户端保存Cookie,一个简单的cookie
Set-Cookie: <cookie名>=<cookie值>
,下次再请求的时候客户端自动在请求报文中加入Cookie值发送出去。服务器发现客户端发送的Cookie,检查是从哪个客户端发来的,对比服务器记录。得到之前的状态。
给客户端颁发一个通行证,访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
~ Cookie具有不可跨域名性
~ Cookie在客户端是由浏览器来管理的
HttpServlet
在了解具体的HTTP协议规范后,可以更好地理解HttpServlet的作用,它能够根据客户发出HTTP请求,生成相应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对象中,这大大简化了HttpServlet解析请求数据的工作量。如果没有HttpRequest,HttpServlet只能直接处理Web客户发出的原始的字符数据,有了HttpRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中任何一部分信息,HttpServletRequest中读取HTTP请求信息的常用方法参见下表
HttpServletRequest对象的常用方法
Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的每一部分内容,HttpServletResponse提供了生成响应数据Header的方法
HttpServletResponse对象的常用方法
创建HttpServlet的步骤——“四部曲”
1)扩展HttpServlet抽象类;
2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法;
3)获取HTTP请求信息。通过HttpServletRequest对象来检索html表单所提交的数据或URL上的查询字符串;
4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。
举个例子如下:
并在web.xml中添加
最后,再次展示一下Servlet容器响应Web客户请求流程的UML时序图和流程:
在时序图中,从对象A到对象B的箭头,表示A向B发送一条消息,B接收到消息后,将执行相关的操作,因此也可理解为A调用B的方法。例如在UML时序图步骤5,表示Servlet容器调用HttpServlet的service()方法,对于步骤2,箭头的起点和终点都指向Servlet容器,表示Servlet容器调用自身的方法来解析HTTP请求信息。
1. Web客户向Servlet容器发出HTTP请求;
2. Servlet容器解析Web的HTTP请求;
3. Servlet容器创建一个HttpRequest对象,在这个对象中封装了HTTP请求信息;
4. Servlet容器创建一个HttpResponse对象;
5. Servlet容器调用HttpServlet的service方法,把HttpRequest和HttpResponse对象为Service方法的参数传给HttpServlet对象;
6. HttpServlet调用HttpRequest的有关方法,获取HTTP请求信息;
7. HttpServlet调用HttpResponse的有关方法,生成响应数据;
8. Servlet容器把HttpServlet的响应结果传给Web客户
本文内容与图片全部转载于网络
https://www.cnblogs.com/kakafra/archive/2012/11/08/2761036.html
https://www.cnblogs.com/master-song/p/8820244.html
https://blog.csdn.net/FANGAOHUA200/article/details/53033575
以上是关于Http与HttpServlet的主要内容,如果未能解决你的问题,请参考以下文章
HttpServlet---getLastModified与缓存