一、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继承体系

如何获取response对象中的请求状态码 从response中获取响应数据_servlet

(1)Tomcat 需要解析请求数据,封装为 request 对象 , 并且创建 request 对象传递到 service 方法

(2)使用 request 对象,可以查阅 JavaEE API 文档的 HttpServletRequest 接口中方法说明

 

2. Request获取请求数据

2.1 获取请求行数据

如何获取response对象中的请求状态码 从response中获取响应数据_ide_02

如何获取response对象中的请求状态码 从response中获取响应数据_ide_03

/**
 * 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): 一种在服务器内部的资源跳转方式。

如何获取response对象中的请求状态码 从response中获取响应数据_ide_04

 

请求转发的实现方式 :


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对象

如何获取response对象中的请求状态码 从response中获取响应数据_System_05

 

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): 一种资源跳转方式。

如何获取response对象中的请求状态码 从response中获取响应数据_servlet_06

 

重定向的实现方式 :

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);
    }
}

如何获取response对象中的请求状态码 从response中获取响应数据_servlet_07