Request和Response
简介
Request是请求对象,Response是响应对象。
request:获取请求数据
浏览器会发送HTTP请求到后台服务器[Tomcat]
HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]
后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中
所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数
获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
response:设置响应数据
- 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
- 把响应数据封装到response对象中
- 后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
- 浏览器最终解析结果,把内容展示在浏览器给用户浏览
Request
1 获取请求数据
1.1 获取请求行数据
请求行的数据包含三部分,分别为请求方法,请求资源路径和HTTP协议及版本
获取请求方法
1
String getMethod();
获取访问路径
1
String getContextPath();
获取URL(统一资源定位符)
1
StringBuffer getRequestURL();
获取URI(统一资源标识符)
1
String getRequestURI();
获取请求参数(直射用于Get请求)
1
String getQueryString();
1.2 获取请求体数据
1 | String getHeader(String name) |
1.3 获取请求体数据(Post)
因为Get请求方式中没有请求体,所以此方式只适用于Post请求方式
方法一:字节输入流
1
ServletInputStream getInputStream();
方法二:字符输入流
1
BufferedReader getReader();
1.4 获取请求数据通用方法
- 获取所有参数Map集合
1 | Map<String,String[]> getParameterMap() |
- 根据名称获取参数值(数组)
1 | String[] getParameterValues(String name) |
- 根据名称获取参数值(单个值)
1 | String getParameter(String name) |
Map集合中的范形为String和Sting数组
2 中文乱码问题
2.1 Post方式
- 出现中文乱码的原因:
- POST的请求参数是通过request的getReader()来获取流中的数据
- TOMCAT在获取流的时候采用的编码是ISO-8859-1
- ISO-8859-1编码是不支持中文的,所以会出现乱码
- 解决方案:
- 页面设置的编码格式为UTF-8
- 把TOMCAT在获取流数据之前的编码设置为UTF-8
- 通过
request.setCharacterEncoding("UTF-8")
设置编码,UTF-8也可以写成小写.
2.2 Get方式(通用方法)
出现中文乱码的原因:
- 浏览器把中文参数按照
UTF-8
进行URL编码 - Tomcat对获取到的内容进行了
ISO-8859-1
的URL解码
- 浏览器把中文参数按照
解决方案:
按照ISO-8859-1编码获取乱码
å¼ ä¸
对应的字节数组按照UTF-8编码获取字节数组对应的字符串
1
2
3
4byte[] bytes = 数据.getBytes(StandardCharsets.ISO_8859_1);
String str = new String(bytes, StandardCharsets.UTF_8);
//合并为
String str = new String(数据.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
3 请求转发
请求转发(forward):一种在服务器内部的资源跳转方式。
- 浏览器发送请求给服务器,服务器中对应的资源A接收到请求
- 资源A处理完请求后将请求发给资源B
- 资源B处理完后将结果响应给浏览器
- 请求从资源A到资源B的过程就叫请求转发
实现方法
1
req.getRequestDispatcher("资源B路径").forward(req,resp);
Response
1 设置相应数据
HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体。
响应行
1
HTTP/1.1 200 OK
HTTP/1.1:HTTP协议及版本号
200:响应状态码
OK:状态码的描述
- 常用的方法就是设置状态码
1
void setStatus(int sc);
响应头
- 设置响应头键值对
1
void setHeader(String name,String value);
响应体
- 通过字符、字节输出流的方式往浏览器写,
- 方法:
1
2
3
4//字符流
PrintWriter getWriter();
//字节流
ServletOutputStream getOutputStream();
2 请求重定向
简介:
浏览器发送请求给服务器,服务器中对应的资源A接收到请求
资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向
实现方法:
1
2
3
4
5
6
7//第一步:设置状态码
resp.setStatus(302);
//第二部:提供重定向地址
resp.setHeader("location","资源B的访问路径");
//简化方法,无需设置状态码
resposne.sendRedirect("资源B访问路径")特点:
浏览器地址栏路径发送变化
当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化
可以重定向到任何位置的资源(服务内容、外部均可)
因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。
两次请求,不能在多个资源使用request共享数据
因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据
3 发送相应数据
3.1 字符数据
通过Response对象获取字符输出流:
1 | PrintWriter writer = resp.getWriter(); |
3.2 字节数据
通过Response对象获取字节输出流:
1 | ServletOutputStream outputStream = resp.getOutputStream(); |
对于html标签,得告诉六浏览器返回的数据类型为html。浏览器才能解析html标签。
response.setHeader(“content-type”,”text/html”);