文章说明:黑色字体-已知,蓝色字体-所见即所得,红色字体-还需要再找资料弄明白的
参考资料:很多参考资料,段落下有原文链接到原作者
简介
- http协议是一种数据传输协议,主要用于客户端与服务器之间数据的传递。
- 基于 TCP/IP 的高级协议
无状态的协议:每次请求之间相互独立,不能交换数据
默认端口号:80
基于请求/响应模型的:一次请求对应一次响应 - 工作原理是:客户端通过http协议发出request(由请求头、请求行、空格、消息体组成),当请求传到服务器时有两种情况:
-
- 第一,当生成的网页是静态网页时,服务器直接通过http协议返回给客户端response(由响应头、响应行、空格、消息体组成),就这样,整个流程结束。
-
- 第二,当服务器接收到需要生成动态网页的 命令时,服务器自己不能生成,需要借助web容器生成,servlet就是依附于web容器的一项技术,它避开了CGI技术的不足。
- web容器是一个内置在服务器中的小型服务器,依赖于服务器而生,作用域服务器,与servlet技术一起帮助服务器生成动态网页。其中最常用到的web容器是Tomcat。
发展史
- HTTP/0.9 (1991)
1.只有一个命令GET。
2.没有HEADER等描述数据的信息。
3.服务器发送完毕, 就关闭TCP连接。 - HTTP/1.0 (1996)
1.增加了POST, PUT , Header等命令
2. 增加了 status code (处理请求的状态)和 Header(信息)
3.支持了多字符集、 多部分发送、权限、 缓存等 - HTTP/1.1 (1999)
1.增加了持久连接(长连接)。即,HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。
HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。
2.pipeline。 可以在同个链接里 发送多个请求。但1.1服务端请求进入是需要按照顺序进行的。在HTTP2.0中会进行优化。
3.增加host域和其他一些命令。
4.支持只发送头信息,服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。
5.可以声明保持TCP连接状态 - HTTP/2.0(2015)
1.所有数据以二进制传输。
2.同一个连接里面发送多个请求不再需要按照顺序来。
3.头信息压缩以及推送等提高效率的功能。
4.TCP连接支持并发, 多个请求只用创建一个TCP协议
请求 HttpServletRequest
请求响应原理
request 和 response 对象由服务器创建,由开发人员使用。request 对象获取消息请求,response 对象设置响应消息。
1、Tomcat 服务器根据请求URL中的资源路径,创建对应的对象
2、Tomcat 服务器创建 request和response 对象,request 对象中封装请求消息数据,response 对象中封装响应消息数据。
3、Tomcat 将 request 和 response 两个对象传递给 service 方法,并调用 service 方法
4、开发人员可以通过 request 对象获取请求消息数据,通过 response 对象设置响应消息数据。
5、服务器在给浏览器做出响应之前,从 response 对象中拿开发人员设置的响应消息数据。
Request对象继承体系
1、ServletRequest:接口
2、HttpServletRequest:接口
3、org.apache.catalina.connector.RequestFacade:Tomcat 的一个类
RequestFacade 类实现了 HttpServletRequest 接口,HttpServletRequest 接口继承了 ServletRequest 接口
请求数据格式和获取
1、请求行
- 格式:请求方式 请求URL 请求协议/版本
eg:GET /mySubmit.html HTTP/1.1 - 请求方式:7 种请求方式,常用 GET 和 POST。
GET:请求参数在请求行中,在URL后显示、请求的URL长度有限、不安全。
POST:请求参数在请求体中、请求的URL没有长度限制、安全。 - 获取请求行数据
GET /oneStar?name=qq HTTP/1.1
常用方法:
Sring getMethod():获取请求方法:GET
String getContextPath():获取虚拟目录:/
String getServletPath():获取 servlet 路径:/oneStar
Sring getQuervletPath():获取 get 方式请求参数:name=qq
String getRequestURI():获取请求URI:/oneStar
StringBuffer getRequestURL():获取请求URL:http://localhost/onestar/
String getProtocol():获取协议版本:HTTP/1.1
String getRemoteAddr():获取客户机的IP地址
URL:统一资源定位符
URI:统一资源标识符(范围更大)
//请求行数据
public static void requestHang(HttpServletRequest req){
//1.获取请求方法:GET
String method = req.getMethod();
System.out.println(method);
//2.获取虚拟目录
String Cpath = req.getContextPath();
System.out.println(Cpath);
//3.获取 Servlet 路径
String Spath = req.getServletPath();
System.out.println(Spath);
//4.获取get方式请求参数
String Qpath = req.getQueryString();
System.out.println(Qpath);
//5.获取请求URI
String URI = req.getRequestURI();
System.out.println(URI);
//6.获取请求URL
StringBuffer URL = req.getRequestURL();
System