1.http协议
定义了客户端和服务器端交流的规则
特点:
1.基于tcp/ip协议
2.默认端口是80
3.一次请求一次响应, 并且不会相互影响
现在1.1以上的版本
请求:
get方式的请求
GET /index.html?username=123 HTTP/1.1 ---->请求行, 我们发现我们get的方式的参数直接拼接在请求行中
Host: localhost:8888
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Idea-fda92745=913c5d38-d72b-4325-b714-7183cab718c4 ----->请求头
注意: get请求没有请求体
post方式的请求
POST /aaa HTTP/1.1 ---->请求行, 我们发现我们post的方式的参数没有在请求行中
Host: localhost:8888
Connection: keep-alive
Content-Length: 26
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9---->请求头
---->请求空行
username=aaaa&password=123 ---->请求体,专门封装post请求的请求体
比较重要的请求头(请求头其实就是浏览器告诉服务器自身的一些信息, 如果服务器有需要就获取去用,如果没有需要就不用管)
user-agent ---->告诉服务我的浏览的版本 , 服务器就可以根据这个值做兼容性的问题
referer -----> 防盗链, 浏览器告诉服务我从哪里点过来的, 服务器就可以根据这个值, 来去判断是否从正确的点过来
请求体: POST封装的参数,这个才是最重要的!!!!!!!
请求行: GET封装的参数,这个才是最重要的!!!!!!!
响应:
2.Request的方法
1.获取请求消息的东西
1.获取请求行
getContextPath() ---->获取"虚拟路径" ----> http://IP地址:端口/虚拟路径/资源
getRequestURI();统一资源标识符 ----> 短小的路径,范围比较大 :/虚拟路径/资源
getRequestURL();统一资源定位符 ----> 长的路径,范围比较 : http://ip地址:端口/虚拟路径/资源
2.获取请求头
(!!!!!!!!!!)getHeader(String key); ----> 根据头的名字获取对应的值
枚举(迭代器) getHeaderNames(); ---->获取所有的头的名字
常见的头:
user-agent
referer
2.通用的方式获取参数
String getParamter(String key); ---->一个键对用一个值
String[] getParamterValues(String key); ---->一个键对用多个值
枚举(迭代器) getParamterNames(); ----->获取所有的参数的键
Map<String,String[]> getParamterMap() ---->将所有的键和值都封装到map集合返回
3.请求转发 ---->是服务器内部"资源的跳转"的一种方式
格式: req.getRequestDispather("路径").forword(req,resp);
特点:
1.地址栏不会发生变化
2.对于客户而言,客户只发了一次请求,却访问了多个资源
3.只能跳转到本工程下的资源,不能访问工程以外的资源
4.共享数据
我们发现有时候需要在多个资源中,来传递或者共享数据,而request就可以办到这件事
整个web中有4个对象可以办到这件事, 我们给这个4个对象起了名字, 叫做"域对象",这四个对象唯一的区别,就是作用的范围不一样
request
作用范围: 在一次请求的范围内, 可以理解"转发"的时候才会request对象来共享数据
session
servletContext
pageContext
共同的特点:
setAttribute(String key,Object value);
Object getAttribute(String key);
removeAttribute(String key);
5.获取ServletContext对象
3.中文乱码问题
请求参数乱码问题:
get:
tomcat8以后的:
get方式不用担心乱码的问题了, 原因是tomcat中默认用utf-8的方式组成的字符串
tomcat8以前的
原因:
get方式要处理乱码, 原因是因为tomcat居然用ISO-8859-1的编码去组装字符串, 因为这个编码不支持中文,所以回出现乱码问题
解决:
例如:
String name = req.getParamter("name"); // 这个name是乱码的
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
post:
req.setCharaterEnconding("utf-8");
原因:
其实底层获取请求体的时候通过req.getReader获取的, 这个reader是tomcat创建的, 默认的编码采用ISO-8859-1,不支持中文的
如果我们不改变流的编码就一定出现中文乱码问题, 我们可通过一行代码修改这个流的编码: req.setCharaterEnconding("utf-8");
|
|