目录
Request获取请求数据:
-
请求数据分为三部分:
- 请求行:
- String getMethod():获取请求方式:GET
- String getContextPath():获取虚拟目录(项目访问路径):/request-demo
- StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
- String getRequstURI():获取URI(统一资源标识符):/request-demo/req1
- String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123
- 请求头:User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64)
- String getHeader(String name):根据请求头名称,获取值
- 请求体:username=superbaby&password=123
- ServletInputStream getInputStream():获取字节输入流
- BufferedReader getReader():获取字符输入流
- 请求行:
Request通用方式获取请求参数
-
请求参数获取方式:
GET方式:String getQueryString()
POST方式: BufferedReader getReader()
-
通用方式:
Map<String, String[]> getParameterMap(): 获取所有参数Map集合
String[] getParameterValues(String name): 根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(个体值)
Request请求方式中文乱码处理
-
POST请求:设置输入流编码
req.setCharacterEncoding("UTF-8");
-
GET请求:
//先对乱码数据进行编码
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//字节数组解码
username = new String(bytes, StandardCharsets.UTF_8);
同:username = new String(username.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); # 通于POST请求
-
URL编码实现方式
编码:URLEncoder.encode(str, "utf-8");
解码:URLDecoder.decode(str, "Iso-8859-1");
请求转发:
-
请求转发(forward):一种在服务器内部的资源跳转
-
实现方式:req.getRequestDispatcher("资源B路径").forward(req,resp);
req:资源A请求
resp:资源A响应
-
请求转发资源间共享数据:使用Request对象
- void setAttribute(String name, Object o): 储存数据到request域中
- Object getAttribute(String name):根据key, 获取值
- void removeAttribute(String name):根据key,删除该键值对
-
请求转发特点:
- 浏览器地址栏路径不发生变化
- 只能转发当前服务器的内部资源
- 一次请求,可以在转发资源间使用request共享数据
Response 设置响应数据功能介绍
-
响应数据分为三部分:
- 响应行:
- void setStatus(int sc):设置响应状态编码
- 响应头:
- void setHeader(String name, String value):设置响应头键值对
- 响应体:
- PrintWriter getWriter(): 获取字符输出流
- ServletOutputStream getOutputStream(): 获取字节输出流
- 响应行:
Response完成重定向
-
重定向(Redirect):一种资源跳转方式
- 设置响应状态码:302
- 定位跳转位置:响应头 location:xxx
-
实现方式:
resp.setStatus(302); //设置响应状态码
resp.setHeader("location","资源B的路径");
简化方式:resp.sendRedirect("资源B的路径");
-
重定向特点:(与转发刚好相反)
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源(服务器内部、外部均可)
- 两次请求,不能在多个资源使用request共享数据
路径问题:
-
明确路径使用对象:
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
Response响应字符数据
- 使用:
1. 通过response对象获取字符输出流
- PrintWriter writer= resp.getWriter();
1. 写数据
- writer.writer("aaa");
- 注意:
1. 该流不需要关闭,随着响应结束,response对象销毁,有服务器自动关闭
2. 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
Response 响应字节数据
- 使用:
1. 通过Response对象获取字符输出流
- FileInputStream fileInputStream = new FileInputStream("D:\\~\\1657032438949.jpg");
- ServletOutputStream outputStream = resp.getOutputStream();
2. 写数据
- outputStream.write(bytes, 0,len);
- IOUtils工具类使用(简化copy)