1.5. HTTP协议
1.5.1. 什么是HTTP协议
HTTP协议是HyperText Transfer Protocol的缩写,即超文本传输协议。是由w3c(万维网联盟)制定的一种应用层协议,用来定义浏览器与web服务器之间如何通信以及通信的数据格式。
因为BS架构中的通信模块就是以HTTP这个协议作为标准协议的,所以对该协议有所了解可以更好的编写程序。
1.5.2. HTTP协议是如何通信的
HTTP协议的通信过程可以分为以下四个步骤:
- 浏览器根据IP地址和端口号与服务器建立连接
- 向Web服务器发送请求数据包
- Web服务器接收请求数据包后,发送相应的响应数据包
- 浏览器接收响应数据后关闭连接
在这个过程中,一次请求对应一次连接,当浏览器再次发请求给服务器时,Web服务器并不知道这就是上次发请求的客户端,这也是HTTP协议的一个特点-无状态协议。这种需要时建立连接,使用结束后立即断开连接的方式使得Web服务器可以利用有限的连接为尽可能多的客户提供服务。也正是具备了这样的特点,才使得BS结构能够承载企业级应用的大量访问。
1.5.3. HTTP协议中的数据格式
在HTTP协议控制的数据走向中,既包括客户端发送给服务器端的请求数据也包括服务器端返回给客户端的响应信息,而具有一定规范的数据格式是保证通信标准的第一要素。借助于一些浏览器的插件或者浏览器本身内嵌的功能模块,可以实现对请求数据、响应数据的抓取,熟练掌握这些数据的主要部分,可以有利于理解BS模型中的一些处理问题的方式。通常情况下的请求数据包及响应数据包结构如图 – 14所示。

图- 14
1.5.4. 请求数据包组成
请求数据包包含三个部分:
- 请求行,包括请求方式,请求资源路径,以及协议版本
- 消息头是由若干的键值对组成,主要用于传递给Web服务器一些信息。如,浏览器版本、接受资源的类型等
- 在消息头的下面会跟着一个空白行,这样就可以区分出消息头与实体内容这两个部分。而在请求数据包中,大部分情况实体内容为空,只有当请求方式为POST时,实体内容才有要提交的表单数据
请求数据包常见结构如图 – 15 所示。

图- 15
1.5.5. 响应数据包组成
响应数据包也包含三个部分:
- 状态行,包括协议类型、版本、状态码、状态描述
- 消息头(若干),也是多组键值对组成的信息说明。如返回的Content-Type消息头可以告诉浏览器返回的结果数据类型和字符集
- 实体内容,位于消息头下面的一个空白行之后。空白行意在通知浏览器消息头的结束以及结果内容的开始,浏览器就从这里开始数据的逐行解析。
响应数据包常见结构如图 – 16 所示。

图- 16
1.6. Servlet如何处理HTTP协议 1.6.1. 如何控制通信数据 HTTP协议在Web容器这端主要表现为通信数据的到达以及响应数据的返回。于是Web容器将这两部分数据解释为两个对象,一个是与请求数据对应的HttpServletRequest对象,一个是与响应数据对应的HttpServletResponse对象。对于Servlet来讲,主要的业务逻辑过程就是从请求对象中获取数据,经过加工后将结果附着在响应对象中发送回客户端。 1.6.2. HttpServletRequest对象 借助于HttpServletRequest对象可以实现很多操作,如读取请求行、消息头信息,取得路径信息等。使用如下代码可以实现相关功能。 01.package web; 02. 03.import java.io.IOException; 04.import java.io.PrintWriter; 05.import java.util.Arrays; 06.import java.util.Enumeration; 07. 08.import javax.servlet.ServletException; 09.import javax.servlet.http.HttpServlet; 10.import javax.servlet.http.HttpServletRequest; 11.import javax.servlet.http.HttpServletResponse; 12. 13. 14.public class RequestServlet extends HttpServlet { 15. 16. protected void service(HttpServletRequest req, HttpServletResponse resp) 17. throws ServletException, IOException { 18. Enumeration e = req.getHeaderNames (); 19. while (e.hasMoreElements ()){ 20. String headerName = e.nextElement ().toString (); 21. System.out.println (headerName+":"+req.getHeader (headerName)); 22. } 23. System.out.println (req.getMethod ()); 24. System.out.println (req.getProtocol ()); 25. System.out.println (req.getRequestURI ()); 26. System.out.println (req.getRequestURL ()); 27. System.out.println (req.getServletPath ()); 28. } 29.} 1.6.3. HttpServletResponse对象 HttpServletResponse对象最主要的作用即设置给浏览器的响应内容及浏览器的解码方式,此外设置cookie及重定向也都是响应对象的功能。这些功能对应的代码实现如下所示。 01.package web; 02. 03.import java.io.IOException; 04.import java.io.PrintWriter; 05. 06.import javax.servlet.ServletException; 07.import javax.servlet.http.HttpServlet; 08.import javax.servlet.http.HttpServletRequest; 09.import javax.servlet.http.HttpServletResponse; 10. 11. 12.public class ResponseServlet extends HttpServlet { 13. 14. protected void service(HttpServletRequest req, HttpServletResponse resp) 15. throws ServletException, IOException { 16. resp.setContentType("text/html;charset=gbk"); 17. resp.setStatus(404); 18. } 19. 20.}