Request(请求)&Response(响应)
Request:获取请求数据 Response:设置响应数据
request继承体系
ServletRequest | Java提供的请求对象根接口 |
---|---|
HttpServletRequest | Java提供的对Http协议封装的请求对象接口 |
RequestFacade | Tomcat 定义的实现类 |
1.Tomcat需要解析请求数据,封装为request对象并且创建request对象传递到service方法中
2.使用request对象,查阅JavaEE API文档的HttpServletRequest接
request获取请求数据
1.请求行
请求行包含三块内容,分别是请求方式
、请求资源路径
、HTTP协议及版本
- 获取请求方式:
GET
String getMethod()
- 获取虚拟目录(项目访问路径):
/request-demo
String getContextPath()
- 获取URL(统一资源定位符):
http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
- 获取URI(统一资源标识符):
/request-demo/req1
String getRequestURI()
- 获取请求参数(GET方式):
username=zhangsan&password=123
String getQueryString()
2.请求头
对于请求头的数据,格式为key: value
所以根据请求头名称获取对应值的方法为:
String getHeader(String name)
3.请求体
浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST
对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据,分别是:
- 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
该方法可以获取字节
- 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
request通用方式获取请求参数
对于请求参数的获取,常用的有以下两种:
- GET方式:
String getQueryString()
- POST方式:
BufferedReader getReader();
request对象为我们提供了如下方法:
- 获取所有参数Map集合
Map<String,String[]> getParameterMap()
- 根据名称获取参数值(数组)
String[] getParameterValues(String name)
- 根据名称获取参数值(单个值)
String getParameter(String name)
解决post乱码/解决get乱码
- 解决乱码: POST getReader() 设置字符输入流的编码,设置的字符集要和页面保持一致 request.setCharacterEncoding("UTF-8");
POST请求和GET请求的参数中如果有中文,后台接收数据就会出现中文乱码问题
GET请求在Tomcat8.0以后的版本就不会出现了
POST请求解决方案是:设置输入流的编码
request.setCharacterEncoding("UTF-8"); 注意:设置的字符集要和页面保持一致
通用方式(GET/POST):需要先解码,再编码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
- URL编码实现方式:
编码:
URLEncoder.encode(str,"UTF-8");
解码:
URLDecoder.decode(s,"ISO-8859-1");
request请求转发(forward)
实现方式 req.getRequestDispatcher("资源B路径").forward(req,resp); 请求转发资源间共享数据:使用Request对象 void setAttribute(String name, Object o):存储数据到 request城中 Object getAttribute(String name):根据 key,获取值 void removeAttribute(String name):根据 key,删除该键值对
特点
请求转发特点 浏览器地址栏路径不发生变化 只能转发到当前服务器的内部资源 一次请求,可以在转发的资源间使用request共享数据
Response
ServletResponse | Java提供的请求对象根接口 |
---|---|
HttpServletResponse | Java提供的对Http协议封装的请求对象 |
ResponseFacade | Tomcat 定义的实现类 |
设置响应数据
1.响应行
比较常用的就是设置响应状态码:
void setStatus(int sc);
2.响应头
设置响应头键值对:
void setHeader(String name,String value);
2.响应体
对于响应体,是通过字符、字节输出流的方式往浏览器写,
获取字符输出流:
PrintWriter getWriter();
获取字节输出流
ServletOutputStream getOutputStream();
重定向
redirect:一种资源跳转的方式
1.状态码302
2.响应头location:xxx
重定向的实现方式:
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
重定向特点: | 请求转发特点 |
---|---|
浏览器地址栏路径发生变化 | 浏览器地址栏路径不发生变化 |
可以重定向到任意位置的资源(服务器内部、外部均可) | 只能转发到当前服务器的内部资源 |
两次请求,不能在多个资源使用request共享数据 | 一次请求,可以在转发的资源间使用request共享数据 |
路径问题
1.浏览器使用:需要加虚拟目录
2.服务端使用:不需要加虚拟目录
Response响应字符数据
1.通过Response对象获取字符输出流 PrintWriter writer = resp.getWriter(); 2.写数据 writer.write("aaa"):
解决中文乱码
response.setContentType("text/html;charset=utf-8");
Response响应字节数据
使用:
1.通过Response对象获取字符输出流 ServletOutputStream outputStream =resp.getOutputStream(); 2.写数据 outputStream.wite(字节数据);
2.简化
(1)pom.xml添加依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
(2)调用工具类方法
//fis:输入流
//os:输出流
IOUtils.copy(fis,os);