HTTP中Request&Response的一些笔记

Request&Response

  • Request继承体系
  • Request获取请求数据
  • Request请求转发
  • Response设置响应数据功能介绍
  • Response完成重定向
  • Response响应字符数据
  • Response响应字节数据

Request继承体系

继承体系

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

Request获取请求数据

  • 请求数据分为3部分

    1. 请求行:

      GET/REQUEST-DEMO/REP1?USERNAME=ZHANGSAN http/1.1

      • String getMethod():获取请求方式:GET
      • String getContextPath():获取虚拟目录(目录访问路径):/request-demo
      • StringBuffer getRequestURL():http://localhost:8080/request-demo/req1
      • String getRequestURI():/requet-demo/req1
      • String getQueryString():username=zhangsan&password=123
    2. 请求头:

      User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

      • String getHeader(String name):根据请求头名称,获取值
    3. 请求体:

      username=superbay&password=123

      • ServletInputStream getInputStream():获取字节流
      • BufferedReader getReader():获取字符输入流

    request.getParameterMap()用法笔记

    在此之前,获取表单数据时总是用request.getParameter(“name”),根据表单中的name值获取value值,需要获取几项就得重复写几次getParameter,而request.getParameterMap方法则不同,不需要参数,返回结果为Map<String,String[]> 。其实,request.getParameterMap()方法也是通过前台表单中的name值进行获取的,获取到后又进行了一次封装。 之所以返回的map中的value为字符串类型的数组,是为了解决表单中有多个name值一样的项。

    Request请求参数中文乱码处理

    • 请求参数如果存在中文数据,则会乱码

    • 解决方案:

      • POST:设置输入流的编码

        req.setCharacterEncoding("UTF-8");
        
      • Get:设置编码(先解码,再编码)

        byte[] bytes = username.getBytes("ISO-8859-1");
        String username2 = new String(bytes, "UTF-8");
        System.out.println(username2);
        
      • URL编码解码实现方式

        编码:

        String encode = URLEncoder.encode(username, "utf-8");
        

        解码:

        String decode = URLDecoder.decode(encode, "ISO-8859-1");
        

Request请求转发

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

转发

  • 实现方式

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

  • 请求转发资源间共享数据:使用Request对象

    • void setAttribute(String name,Object o):存储数据到request域中
    • Object getAttribute(String name):根据key,获取值
    • void removeAttribute(String name):根据key,删除该键值对
  • 请求转发特点:

    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器的内部资源
    • 一次请求,可以在转发的资源间使用request共享数据

Response设置响应数据功能介绍

  1. 响应行:HTTP/1.1 200 OK
    • void setStaus(int sc):设置响应状态码
  2. 响应头:Content-Type:text/html
    • void setHeader(String name,String value):设置响应头键值对
  3. 响应体:<html><head>head><body></body></html>
    • PrintWriter getWriter():获取字符输出流
    • ServletOutputStream getOutputStream():获取字节输出流

Response完成重定向

  • 重定向(Redirect):一种资源跳转方式

重定向

  • 实现方式:

    resp.setStatus(302);

    resp.setHeader("location","资源B的路径");

    resp.sendRedirect("资源B的路径")

  • 重定向特点:

    • 浏览器地址栏路径发生变化
    • 可以重定向到任意位置的资源(服务器内部、外部均可)
    • 两次请求,不能再多个资源使用request共享数据

Response响应字符数据

  • 使用:

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

      PrintWriter writer=resp.getWriter();
      
    2. 写数据

      writer.write(“aaa”);

  • 注意

    • 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭

    • 中文数据乱码:原因听过Response获取的字符输出流默认编码:IOS-8859-1

      resp.setContentType("text/html;charset=utf-8");
      

Response响应字节数据

  • 使用:

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

      ServletOutputStream os = resp.getOutputStream();
      
    2. 写数据

       os.write(字节数据);
      
  • IOUtils工具类使用

    1. 导坐标

      <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
          </dependency>
      
    2. 使用

      IOUtils.copy(输入流,输出流)
      

猜你喜欢

转载自blog.csdn.net/qq_48778364/article/details/127775257
今日推荐