Request和Response

简介

  • Request是请求对象,Response是响应对象。

  • request:获取请求数据

    • 浏览器会发送HTTP请求到后台服务器[Tomcat]

    • HTTP的请求中会包含很多请求数据[请求行+请求头+请求体]

    • 后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中

    • 所存入的对象即为request对象,所以我们可以从request对象中获取请求的相关参数

    • 获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务

  • response:设置响应数据

    • 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
    • 把响应数据封装到response对象中
    • 后台服务器[Tomcat]会解析response对象,按照[响应行+响应头+响应体]格式拼接结果
    • 浏览器最终解析结果,把内容展示在浏览器给用户浏览

Request

1 获取请求数据

1.1 获取请求行数据

请求行的数据包含三部分,分别为请求方法请求资源路径和HTTP协议及版本

  • 获取请求方法

    1
    String getMethod();
  • 获取访问路径

    1
    String getContextPath();
  • 获取URL(统一资源定位符)

    1
    StringBuffer getRequestURL();
  • 获取URI(统一资源标识符)

    1
    String getRequestURI();
  • 获取请求参数(直射用于Get请求)

    1
    String getQueryString();

1.2 获取请求体数据

1
String getHeader(String name)

1.3 获取请求体数据(Post)

因为Get请求方式中没有请求体,所以此方式只适用于Post请求方式

  • 方法一:字节输入流

    1
    ServletInputStream getInputStream();
  • 方法二:字符输入流

    1
    BufferedReader getReader();

1.4 获取请求数据通用方法

  • 获取所有参数Map集合
1
Map<String,String[]> getParameterMap()
  • 根据名称获取参数值(数组)
1
String[] getParameterValues(String name)
  • 根据名称获取参数值(单个值)
1
String getParameter(String name)

Map集合中的范形为String和Sting数组

2 中文乱码问题

2.1 Post方式

  • 出现中文乱码的原因:
    • POST的请求参数是通过request的getReader()来获取流中的数据
    • TOMCAT在获取流的时候采用的编码是ISO-8859-1
    • ISO-8859-1编码是不支持中文的,所以会出现乱码
  • 解决方案:
    • 页面设置的编码格式为UTF-8
    • 把TOMCAT在获取流数据之前的编码设置为UTF-8
    • 通过request.setCharacterEncoding("UTF-8")设置编码,UTF-8也可以写成小写.

2.2 Get方式(通用方法)

  • 出现中文乱码的原因:

    • 浏览器把中文参数按照UTF-8进行URL编码
    • Tomcat对获取到的内容进行了ISO-8859-1的URL解码
  • 解决方案:

    • 按照ISO-8859-1编码获取乱码å¼ ä¸‰对应的字节数组

    • 按照UTF-8编码获取字节数组对应的字符串

      1
      2
      3
      4
      byte[] bytes = 数据.getBytes(StandardCharsets.ISO_8859_1);
      String str = new String(bytes, StandardCharsets.UTF_8);
      //合并为
      String str = new String(数据.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

3 请求转发

  • 请求转发(forward):一种在服务器内部的资源跳转方式。

    1. 浏览器发送请求给服务器,服务器中对应的资源A接收到请求
    2. 资源A处理完请求后将请求发给资源B
    3. 资源B处理完后将结果响应给浏览器
    4. 请求从资源A到资源B的过程就叫请求转发
  • 实现方法

    1
    req.getRequestDispatcher("资源B路径").forward(req,resp);

Response

1 设置相应数据

HTTP响应数据总共分为三部分内容,分别是响应行响应头响应体

  1. 响应行

    1
    HTTP/1.1 200 OK

    HTTP/1.1:HTTP协议及版本号

    200:响应状态码

    OK:状态码的描述

    • 常用的方法就是设置状态码
    1
    void setStatus(int sc);
  2. 响应头

    • 设置响应头键值对
    1
    void setHeader(String name,String value);
  3. 响应体

    • 通过字符、字节输出流的方式往浏览器写,
    • 方法:
    1
    2
    3
    4
    //字符流
    PrintWriter getWriter();
    //字节流
    ServletOutputStream getOutputStream();

2 请求重定向

  • 简介:

    1. 浏览器发送请求给服务器,服务器中对应的资源A接收到请求

    2. 资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径

    3. 浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

    4. 资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向

  • 实现方法:

    1
    2
    3
    4
    5
    6
    7
    //第一步:设置状态码
    resp.setStatus(302);
    //第二部:提供重定向地址
    resp.setHeader("location","资源B的访问路径");

    //简化方法,无需设置状态码
    resposne.sendRedirect("资源B访问路径")
  • 特点:

    1. 浏览器地址栏路径发送变化

      当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化

    2. 可以重定向到任何位置的资源(服务内容、外部均可)

      因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。

    3. 两次请求,不能在多个资源使用request共享数据

      因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

3 发送相应数据

3.1 字符数据

通过Response对象获取字符输出流:

1
PrintWriter writer = resp.getWriter();

3.2 字节数据

通过Response对象获取字节输出流:

1
ServletOutputStream outputStream = resp.getOutputStream();

对于html标签,得告诉六浏览器返回的数据类型为html。浏览器才能解析html标签。

response.setHeader(“content-type”,”text/html”);


如果有什么,可以通过下面的邮箱和我联系!!

img