Request & Response
作用: Request:获取请求数据 Response:设置响应数据
Request
继承体系
1.Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2. 使用request对象,查阅JavaEE API文档的HttpServletRequest接口
获取请求数据
1.获取请求数据
>请求行: GET /request-demo/req1?username=zhangsan HTTP/1.1
String getMethod(): 获取请求方式:GET
String getContextPath(): 获取虚拟目录(项目访问路径): /request-demo
StringBuffer getRequestURL(): 获取URL(统一资源定位符): http://localhost:8080/request- demo/req1
String getRequestURl(): 获取URI(统一资源标识符): /request-demo/req1
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 getlnputStream(): 获取字节输入流
BufferedReader getReader(): 获取字符输入流
2.通用方式获取请求参数
1. Map<String,String[]> getParameterMap(): 获取所有参数Map集合
2. String[]getParameterValues(String name): 根据名称获取参数值(数组)
3. String getParameter(String name): 根据名称获取参数值(单个值)
>使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:
@webServlet("/reqDeno3")
public class RequestDemo3 extends HttpServlet {
@0verride
protected void doGet(HttpServletRequest req,HttpServletResponse resp){
}
@0verride
protected void doPost(HttpServletReguest reg, HttpServletResponse resp){
this.doBet(req,resp);
}
}
>可以使用Servlet模板创建Servlet更高效
3.请求参数中文乱码处理
1. 请求参数如果存在中文数据,则会乱码
2. 解决方案:
>POST:设置输入流的编码
req.setCharacterEncoding("UTF-8");
>通用方式(GET/POST):先编码,再解码
new String(username.getBytes("ISO-8859-1"),"UTF-8");
3. URL编码
>将字符串技照编码方式转为二进制
>每个字节转为2个16进测数并在前边加上%
4. URL编码实现方式:
编码: URLEncoder.encode(str, "utf-8”);
解码: URLDecoder.decode(s,"lSO-8859-1");
注:Tomcat 8.0 之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8
请求转发
1. 请求转发(forward):一种在服务器内部的资源跳转方式
2. 实现方式: reg.getRequestDispatcher("资源B路径”).forward(req,resp);
3. 请求转发资源间共享数据: 使用Request对象
>void setAttribute(String name,Object o):存储数据到request城中
>Object getAttribute(String name): 根据 key,获取值
>void removeAttribute(String name):根据 key,删除该键值对
4. 请求转发特点:
>浏览器地址栏路径不发生变化
>只能转发到当前服务器的内部资源
>一次请求,可以在转发的资源间使用request共享数据
Response
设置响应数据功能介绍
响应数据分为3部分:
1. 响应行: HTTP/1.1 200 OK
void setStatus(int sc): 设置响应状态码
2. 响应头: Content-Type: text/html
void setHeader(String name, String value): 设置响应头键值对
3. 响应体: <html><head>head><body></body></html>
PrintWriter getWriter(): 获取字符输出流
ServletOutputStream getOutputStream(): 获取字节输出流
完成重定向
1. 重定向(Redirect):一种资源跳转方式
2. 实现方式:
resp.setStatus(302);
resp.setHeader("location","资源B的路径");
resp.sendRedirect("资源B的路径”);
3. 重定向特点:
>浏览器地址栏路径发生变化
>可以重定向到任意位置的资源(服务器内部、外部均可)
>两次请求,不能在多个资源使用request共享数据
响应字符数据
1. 使用:
>通过Response对象获取字符输出流1.
PrintWriter writer = resp.getWriter();
>写数据
writer.write("aaa");
2. 注意:
>该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
>中文数据乱码: 原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("texthtml;charset=utf-8");
响应字节数据
1.使用:
>通过Response对象获取字符输出流
SemietOutputStream outputStream = resp.getOutputStream();
>写数据
outputStream.write(字节数据);
2.lOUtils工具类使用
>导入坐标
<dependency>
<groupld>commons-io</groupld>
<artifactld>commons-io</artifactld>
<version>2.6</version>
</dependency>
>使用
lOUtils.copy(输入流,输出流);