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与HttpServlet

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

Http与HttpServlet

以新华网为例)

Http与HttpServlet

请求消息

Http与HttpServlet

响应消息

Http与HttpServlet

各个字段的意思详见相关网页,这里不再赘述。

使用Cookie的状态管理。

  HTTP是无状态协议,由于是无状态不必保存状态,自然减少了服务器的CPU及内存消耗。保留无状态特征又要解决登录状态问题,所以引入了cookie技术。cookie技术通过在请求和响应报文中写入cookie来控制客户端状态。

  cookie会根据从服务器端发送的响应报文中叫做Set-Cookie的首部字段,通知客户端保存Cookie,一个简单的cookie

Set-Cookie: <cookie名>=<cookie值>

,下次再请求的时候客户端自动在请求报文中加入Cookie值发送出去。服务器发现客户端发送的Cookie,检查是从哪个客户端发来的,对比服务器记录。得到之前的状态。

Http与HttpServlet

给客户端颁发一个通行证,访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。

~ Cookie具有不可跨域名性

~ Cookie在客户端是由浏览器来管理的


HttpServlet


        在了解具体的HTTP协议规范后,可以更好地理解HttpServlet的作用,它能够根据客户发出HTTP请求,生成相应的HTTP响应结果。HttpServlet首先必须读取HTTP请求的内容。Servlet容器负责创建HttpRequest对象,并把HTTP请求信息封装到HttpRequest对象中,这大大简化了HttpServlet解析请求数据的工作量。如果没有HttpRequest,HttpServlet只能直接处理Web客户发出的原始的字符数据,有了HttpRequest后,只要调用HttpServletRequest的相关方法,就可以方便地读取HTTP请求中任何一部分信息,HttpServletRequest中读取HTTP请求信息的常用方法参见下表


HttpServletRequest对象的常用方法


Http与HttpServlet

Servlet容器还向HttpServlet提供了HttpServletResponse对象,HttpServlet可以通过它来生成HTTP响应的每一部分内容,HttpServletResponse提供了生成响应数据Header的方法

 

HttpServletResponse对象的常用方法

Http与HttpServlet


创建HttpServlet的步骤——“四部曲”

1)扩展HttpServlet抽象类; 
2)覆盖HttpServlet的部分方法,如覆盖doGet()或doPost()方法; 
3)获取HTTP请求信息。通过HttpServletRequest对象来检索html表单所提交的数据或URL上的查询字符串; 
4)生成HTTP响应结果。通过HttpServletResponse对象生成响应结果,它有一个getWriter()方法,该方法返回一个PrintWriter对象。

举个例子如下:

并在web.xml中添加


最后,再次展示一下Servlet容器响应Web客户请求流程的UML时序图和流程:

在时序图中,从对象A到对象B的箭头,表示AB发送一条消息,B接收到消息后,将执行相关的操作,因此也可理解为A调用B的方法。例如在UML时序图步骤5,表示Servlet容器调用HttpServletservice()方法,对于步骤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的主要内容,如果未能解决你的问题,请参考以下文章

JavaEE HttpServlet 解析

HttpServlet---getLastModified与缓存

HttpServlet的Service方法到底是怎么回事?

JavaWeb——HttpServlet

Servlet简介与Servlet和HttpServlet运行的流程

servlet连接mysql小程序