• Request和Response


    Request

    在前面学习Servlet中,Servlet接口中的service方法就存在Response和Request两个参数

    Request对象中存放的就是浏览器中发送的HTTP请求数据,HTTP请求消息的数据是由web服务器进行解析,解析完成之后就会将数据进行封装存放到Request对象中。服务器(目前是Servlet)处理完用户的请求之后,服务器就会讲处理结果响应给浏览器,Response对象中就存在HTTP响应数据。


    Request:获取请求数据

    Response:设置响应数据


    Request继承体系

      • ServletRequest是Java提供的请求对象根接口
      • HttpServletRequest是Java提供的对HTTP协议进行封装的请求对象的接口
      • 最下面的则是实现类(实现类有多种)
    • Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中。
    • 需要使用request对象来获取请求的相关信息,查阅JavaEE API接口文档的HttpServletRequest接口即可。
      • HttpServletRequest源码如下
          1. //
          2. // Source code recreated from a .class file by IntelliJ IDEA
          3. // (powered by FernFlower decompiler)
          4. //
          5. package javax.servlet.http;
          6. import java.io.IOException;
          7. import java.security.Principal;
          8. import java.util.Collection;
          9. import java.util.Enumeration;
          10. import javax.servlet.ServletException;
          11. import javax.servlet.ServletRequest;
          12. public interface HttpServletRequest extends ServletRequest {
          13. String BASIC_AUTH = "BASIC";
          14. String FORM_AUTH = "FORM";
          15. String CLIENT_CERT_AUTH = "CLIENT_CERT";
          16. String DIGEST_AUTH = "DIGEST";
          17. String getAuthType();
          18. Cookie[] getCookies();
          19. long getDateHeader(String var1);
          20. String getHeader(String var1);
          21. Enumeration getHeaders(String var1);
          22. Enumeration getHeaderNames();
          23. int getIntHeader(String var1);
          24. String getMethod();
          25. String getPathInfo();
          26. String getPathTranslated();
          27. String getContextPath();
          28. String getQueryString();
          29. String getRemoteUser();
          30. boolean isUserInRole(String var1);
          31. Principal getUserPrincipal();
          32. String getRequestedSessionId();
          33. String getRequestURI();
          34. StringBuffer getRequestURL();
          35. String getServletPath();
          36. HttpSession getSession(boolean var1);
          37. HttpSession getSession();
          38. String changeSessionId();
          39. boolean isRequestedSessionIdValid();
          40. boolean isRequestedSessionIdFromCookie();
          41. boolean isRequestedSessionIdFromURL();
          42. /** @deprecated */
          43. boolean isRequestedSessionIdFromUrl();
          44. boolean authenticate(HttpServletResponse var1) throws IOException, ServletException;
          45. void login(String var1, String var2) throws ServletException;
          46. void logout() throws ServletException;
          47. Collection getParts() throws IOException, ServletException;
          48. Part getPart(String var1) throws IOException, ServletException;
          49. extends HttpUpgradeHandler> T upgrade(Class var1) throws IOException, ServletException;
          50. }

     Request获取请求参数

    方法具体如何使用,不做过多介绍,具体参照HttpServletRequest接口详解 (biancheng.net)

    Request通用方式获取请求参数 

    上述图片中,对于get和post方式对于请求参数获取所调用的方法不同,但是获取到参数之后,所进行的操作逻辑是一样的,可以将操作逻辑进行封装。Request提供一下获取参数的方法

    • getParameter(String name): 返回指定参数名的参数值。
    • getParameterValues(String name): 返回一个参数名对应的所有参数值的数组。
    • getParameterMap(): 返回包含所有请求参数的Map对象,其中键为参数名,值为参数值的数组。

    Request请求转发

    • 请求转发(forward),一种在服务器内部的资源跳转的方式
    • 实现方式
      • request.getRequestDispatcher("转发的资源路径").forward(request, response);
    • 请求转发之间贡献数据:使用request对象
      • void setAttribute(String name,Object o):存储数据到request1域中
      • Object getAttribute(String name):根据key,获取值
      • void removeAttribute(String name):根据key,删除该键值对
    • 请求转发的特点
      • 浏览器地址栏路径不发生变化
      • 只能转发当前服务器内部的资源
      • 一次请求,可以在转发的资源见使用request共享资源

    Response

    Reponse设置响应数据功能介绍

    • 响应数据分为三部分
      • 响应行 :http/1.1 200 ok
        • void setStatus(int sc)设置响应状态码
      • 响应头:Context-Type:text/html
        • void setHeader(String name,String value):设置响应头键值对
      • 响应体:
        • PrintWriter getWirter():获取字节输出流
        • ServletOutputStream getOutputStream():获取字节输出流

    Reponse完成重定向

    • 重定向:一种资源跳转方式
      • 浏览器向A资源发送请求,但是A资源处理不了该请求,如果使用重定向,则A资源返回浏览器响302的响应状态码,同时给出能够处理该请求的资源访问路径。
    • 实现方式
      • response.setStatus(302);
      • response.setHeader("location","资源B的路径");
    • 简化方式
      • response.sendRedirect("资源路径");
    • 重定向特点
      • 浏览器地址栏路径发生变化
      • 可以重定向到任意资源(服务器内外部都可以)
      • 两次请求,不能在多个资源间使用request共享数据

    路径问题

    Response响应字符数据

    使用

    中文乱码:原因通过Response获取的字字符输出流为ISO-8859-1

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

    如上述代码所示设置为utf-8即可

    Response响应字节数据

    使用

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

    ServletOutputStream servletOutputStream = response.getOutputStream();

    写数据

    servletOutputStream.write(字节数据);

  • 相关阅读:
    【Pandas总结】第五节 Pandas 数据查询方法总结_df.loc()总结
    易周金融 | Q1保险行业活跃人数8688.67万人 19家支付机构牌照被注销
    CTFHUB ICS(2)
    【面试题】面试必备我跟面试官聊了一个小时线程池!
    vue学习-16vue的history模式与hash模式
    华为杯数学建模比赛经验分享
    Vue封装组件并发布到npm仓库
    mysql表中删除重复记录,只保留一条记录的操作
    基于SpringBoot+Vue前后端分离的学校心理健康测试系统
    【Java多线程】必须要了解的基本概念
  • 原文地址:https://blog.csdn.net/weixin_64939936/article/details/133701855