Request&Response
Request
Request 继承体系
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2.使用request对象,查阅JavaEE API文档的HttpServletRequest接口
Request 获取请求数据
请求数据分为3部分:
请求行
GET /request-response-demo/req1?username=zhangsan HTTP/1.1
String getMethod():获取请求方式: GET
String getContextPath():获取虚拟目录(项目访问路径): /request-response-demo
--项目名
StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-response-demo/req1
--完整路径
String getRequestURI():获取URI(统一资源标识符): /request-response-demo/req1
--项目名称和Servlet名称
String getQueryString():获取请求参数(GET方式): username=zhangsan&password=123
请求头
User-Agent: Mozilla/5.0 Chrome/91.0.4472.106
String getHeader(String name):根据请求头名称,获取值
请求体
username=superbaby&password=123
ServletInputStream getInputStream():获取字节输入流
BufferedReader getReader():获取字符输入流
Request 通用方式获取请求参数
请求参数获取方式:
GET 方式
String getQueryString()
username=aaa&password=123&hobby=1&hobby=2
POST 方式
BufferedReader getReader()
username=aaa&password=123&hobby=1&hobby=2
•Map<String, String[ ]> getParameterMap():获取所有参数Map集合
•String getParameter(String name):根据名称获取参数值(单个值)
•String[ ] getParameterValues(String name) :根据名称获取参数值(数组)
通用
使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:
可以使用Servlet模板创建Servlet更高效
Request 请求参数中文乱码处理
请求参数如果存在中文数据,则会乱码
解决方案:
POST:设置输入流的编码
req.setCharacterEncoding("UTF-8");
Tomcat 8.0 之后,GET请求没有乱码问题
URL编码
- 将字符串按照编码方式转为二进制
- 每个字节转为2个16进制数并在前边加上%
URLEncoder.encode(str, "utf-8");
URLDecoder.decode(s, "utf-8");
请求转发
请求转发(forward):一种在服务器内部的资源跳转方式
实现方式
req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发特点
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
只有一次请求,可以使用request共享数据
作用域对象
用于 Servlet 之间数据共享的服务器内存区域,作用域结构是一个 Map<String, Object>
三个作用域
在 Servlet 中一共有三个作用域:请求域、会话域、上下文域
请求域范围
只在同一次请求中起作用
作用域方法
request域有关的方法 | 作用 |
---|---|
Object getAttribute("键") | 从请求域中通过键获取值 |
void setAttribute("键",Object 数据) | 向请求域中添加键和值,如果键不存在就是添加,如果存在就是修改 |
void removeAttribute("键") | 通过键删除键和值 |
Response
响应数据分为3部分:
响应行:HTTP/1.1 200 OK
void setStatus(int sc) :设置响应状态码
响应头:Content-Type: text/html
void setHeader(String name, String value) :设置响应头键值对
响应体:<html><head>head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
Response 完成重定向
Response 响应字符数据
使用:
1.通过Response对象获取字符输出流
PrintWriter out = resp.getWriter();
2.写数据
out.write("数据");
注意
该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
Response 响应字节数据
使用
1.通过Response对象获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
IOUtils工具类使用
1.导入坐标
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2.使用
IOUtils.copy(输入流,输出流);