一、Request 和 Response 的概述
Request 是请求对象, Response 是响应对象。
request: 获取 请求数据(1)浏览器会发送 HTTP 请求到后台服务器 [Tomcat](2)HTTP 的请求中会包含很多请求数据 [ 请求行 + 请求头 + 请求体 ](3)后台服务器 [Tomcat] 会对 HTTP 请求中的数据进行解析并把解析结果存入到一个对象中(4)所存入的对象即为 request 对象,所以我们可以从 request 对象中获取请求的相关参数(5)获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务Request 继承体系
response: 设置 响应数据(1)业务处理完后,后台就需要给前端返回业务处理的结果即响应数据(2)把响应数据封装到 response 对象中(3)后台服务器 [Tomcat] 会解析 response 对象 , 按照 [ 响应行 + 响应头 + 响应体 ] 格式拼接结果(4)浏览器最终解析结果,把内容展示在浏览器给用户浏览
二、Request对象
1. Request继承体系
(1)Tomcat 需要解析请求数据,封装为 request 对象 , 并且创建 request 对象传递到 service 方法(2)使用 request 对象,可以查阅 JavaEE API 文档的 HttpServletRequest 接口中方法说明
2. Request获取请求数据
2.1 获取请求行数据
/** * request 获取请求数据 */ @WebServlet("/req1") public class RequestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // String getMethod():获取请求方式: GET String method = req.getMethod(); System.out.println(method);//GET // String getContextPath():获取虚拟目录(项目访问路径):/request-demo String contextPath = req.getContextPath(); System.out.println(contextPath); // StringBuffer getRequestURL(): 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1 StringBuffer url = req.getRequestURL(); System.out.println(url.toString()); // String getRequestURI():获取URI(统一资源标识符): /request-demo/req1 String uri = req.getRequestURI(); System.out.println(uri); // String getQueryString():获取请求参数(GET方式): username=zhangsan String queryString = req.getQueryString(); System.out.println(queryString); //------------ // 获取请求头:user-agent: 浏览器的版本信息 String agent = req.getHeader("user-agent"); System.out.println(agent); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取post 请求体:请求参数 //1. 获取字符输入流 BufferedReader br = req.getReader(); //2. 读取数据 String line = br.readLine(); System.out.println(line); } }
2.2 获取请求头数据
String getHeader(String name)
/** * request 获取请求数据 */ @WebServlet("/req1") public class RequestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取请求头:user-agent: 浏览器的版本信息 String agent = req.getHeader("user-agent"); System.out.println(agent); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
2.3 获取请求体数据
(1)获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法ServletInputStream getInputStream()
(2) 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法BufferedReader getReader()
/** * request 获取请求数据 */ @WebServlet("/req1") public class RequestDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取post 请求体:请求参数 //1. 获取字符输入流 BufferedReader br = req.getReader(); //2. 读取数据 String line = br.readLine(); System.out.println(line); } }
2.4 获取请求参数的通用方式
(1)获取所有参数Map集合
Map<String,String[]> getParameterMap()
(2)根据名称获取参数值(数组)
String[] getParameterValues(String name)
(3)根据名称获取参数值(单个值)
String getParameter(String name)
3. 请求参数中文乱码问题
/** * 中文乱码问题解决方案 */ @WebServlet("/req4") public class RequestDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 解决乱码:POST,getReader() //request.setCharacterEncoding("UTF-8");//设置字符输入流的编码 //2. 获取username String username = request.getParameter("username"); System.out.println("解决乱码前:"+username); //3. GET,获取参数的方式:getQueryString // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1 /* //3.1 先对乱码数据进行编码:转为字节数组 byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1); //3.2 字节数组解码 username = new String(bytes, StandardCharsets.UTF_8);*/ username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8); System.out.println("解决乱码后:"+username); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
4. Request请求转发
请求转发 (forward): 一种在服务器内部的资源跳转方式。
请求转发的实现方式 :req.getRequestDispatcher("资源B路径").forward(req,resp);
请求转发资源间共享数据 : 使用 Request 对象:(1)存储数据到 request 域 [ 范围 , 数据是存储在 request 对象 ] 中void setAttribute(String name,Object o);
(2)根据 key 获取值Object getAttribute(String name);
(3)根据 key 删除该键值对void removeAttribute(String name);
三、Response对象
1. Response设置响应数据功能介绍
HTTP 响应数据总共分为三部分内容,分别是 响应行、响应头、响应体
(1)响应行
设置响应状态码 :void setStatus(int sc);
(2)响应头
设置响应头键值对:void setHeader(String name,String value);
(3)响应体
1️⃣获取字符输出流
PrintWriter getWriter();
2️⃣获取字节输出流
ServletOutputStream getOutputStream();
2. Respones请求重定向
Response 重定向 (redirect): 一种资源跳转方式。
重定向的实现方式 :resp.setStatus(302); resp.setHeader("location","资源B的访问路径");
response.sendRedirect("资源B的访问路径");
重定向的特点:(1)浏览器地址栏路径发生变化
(2)可以重定向到任意位置的资源(服务器内部、外部均可)
(3)两次请求,不能在多个资源使用request共享数据
3. Respones 响应字符数据
要想将字符数据写回到浏览器,我们需要两个步骤 :(1)通过 Response 对象获取字符输出流: PrintWriter writer = resp.getWriter();(2)通过字符输出流写数据 : writer.write("aaa");/** * 响应字符数据:设置字符数据的响应体 */ @WebServlet("/resp3") public class ResponseDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //1. 获取字符输出流 PrintWriter writer = response.getWriter(); //content-type //response.setHeader("content-type","text/html"); writer.write("你好"); writer.write("<h1>aaa</h1>"); //细节:流不需要关闭 } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
4. Respones 响应字节数据
要想将字节数据写回到浏览器,我们需要两个步骤 :(1)通过 Response 对象获取字节输出流: ServletOutputStream outputStream =resp.getOutputStream();(2)通过字节输出流写数据 : outputStream.write( 字节数据 );/** * 响应字节数据:设置字节数据的响应体 */ @WebServlet("/resp4") public class ResponseDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 读取文件 FileInputStream fis = new FileInputStream("d://a.jpg"); //2. 获取response字节输出流 ServletOutputStream os = response.getOutputStream(); //3. 完成流的copy /* byte[] buff = new byte[1024]; int len = 0; while ((len = fis.read(buff))!= -1){ os.write(buff,0,len); }*/ IOUtils.copy(fis,os); fis.close(); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }