• 【JAVA】Request&Response


    目录

    【Request】

    【Request继承体系】

    【Request获取请求数据】

    【Request通用方式获取请求参数】

    【可以使用Servlet模板创建Servlet更高效】

    【Request请求参数中文乱码处理】

    【URL编码】

    【Request请求转发】

    【请求转发资源间共享数据】

    【Response】

    【Response继承体系】

    【Response设置响应数据功能介绍】

    【Response完成重定向】

    【Response响应字符数据】

    【Response响应字节数据】

    【使用IOUtils工具类】


    【Request】

    【Request继承体系】

    1. Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
    2. 使用request对象,查阅JavaEE API文档的HttpServletRequest接口

    【Request获取请求数据】

    【请求数据分为3部分】

    1、请求行:GET /HTTP/req1?username=zhangsan HTTP/1.1

    • String getMethod():获取请求方式: GET
    • String getContextPath():获取虚拟目录(项目访问路径)
    • StringBuffer getRequestURL(): 获取URL(统一资源定位符)
    • String getRequestURI():获取URI(统一资源标识符)
    • String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123

     例:

    1. @Override
    2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //String getMethod():获取请求方式:GET
    4. String method = req.getMethod();
    5. System.out.println(method);
    6. //String getContextPath():获取虚拟目录(项目访问路径)
    7. String contextPath = req.getContextPath();
    8. System.out.println(contextPath);
    9. //StringBuffer getRequestURL(): 获取URL(统一资源定位符)
    10. StringBuffer url = req.getRequestURL();
    11. System.out.println(url.toString());
    12. //String getRequestURI():获取URI(统一资源标识符)
    13. String uri = req.getRequestURI();
    14. System.out.println(uri);
    15. //String getQueryString():获取请求参数(GET方式):访问网页时在?后加上username=zhangsan&password=123
    16. String queryString = req.getQueryString();
    17. System.out.println(queryString);
    18. }

    2、请求头:User-Agent: Mozilla/5.0 Chrome/91.0.4472.106

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

    例:

    1. @Override
    2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //String getHeader(String name):根据请求头名称,获取值
    4. String agent = req.getHeader("user-agent");
    5. System.out.println(agent);
    6. }

    3、请求体:username=superbaby&password=123

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

    例:

    1. @Override
    2. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    3. //获取post 请求体:请求参数
    4. //获取字符输入流
    5. BufferedReader br=req.getReader();
    6. //读取数据
    7. String line = br.readLine();
    8. System.out.println(line);
    9. }

    【Request通用方式获取请求参数】

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

    例:

    1. @WebServlet("/req2")
    2. public class RequestDemo2 extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //获取所有参数的map集合
    6. Map map = req.getParameterMap();
    7. for (String key : map.keySet()) {
    8. System.out.print(key + ":");
    9. //获取值
    10. String[] values = map.get(key);
    11. for (String value : values) {
    12. System.out.print(value + " ");
    13. }
    14. System.out.println();
    15. }
    16. //获取对应的参数值
    17. String[] hobbies = req.getParameterValues("hobby");
    18. for (String hobby : hobbies) {
    19. System.out.println(hobby);
    20. }
    21. //根据key获取单个参数值
    22. String username = req.getParameter("username");
    23. String password = req.getParameter("password");
    24. System.out.println(username);
    25. System.out.println(password);
    26. }
    27. @Override
    28. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    29. this.doGet(req, resp);
    30. }
    31. }

    【可以使用Servlet模板创建Servlet更高效】

    右键web在new中选中Servlet模板创建

    【可以通过settings设置修改模板】

    【注意】

    如果右键web在new中没有servlet,在Project Structure中设置如图所示

    【Request请求参数中文乱码处理】

    【解决方案】

    POST:设置输入流的编码

    1. req.setCharacterEncoding(“UTF-8");

    通用方式:(GET/POST):先编码再解码

    new String(username.getBytes("ISO-8859-1"),"UTF-8");
    

    例:

    1. //解决中文乱码:设置编码格式
    2. req.setCharacterEncoding("UTF-8");
    3. //获取username
    4. String username = req.getParameter("username");
    5. System.out.println(username);
    6. //GET,获取参数的方式:getQueryString
    7. //先对乱码数据进行编码,转为字节数组
    8. byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
    9. username = new String(bytes, StandardCharsets.UTF_8);
    10. System.out.println(username);

    【URL编码】

    1. 将字符串按照编码方式转为二进制
    2. 每个字节转为2个16进制数并在前边加上%

    【实现方式】

    编码:URLEncoder.encode(str, "utf-8");

    解码:URLDecoder.decode(s, "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】

    【Response继承体系】

    【Response设置响应数据功能介绍】

    【响应数据分为3部分】

    1、响应行:HTTP/1.1 200 OK

    • void setStatus(int sc) :设置响应状态码

    2、响应头:Content-Type: text/html

    • void setHeader(String name, String value) :设置响应头键值对

    3、响应体:head>

    • PrintWriter getWriter():获取字符输出流
    • ServletOutputStream getOutputStream():获取字节输出流

    【Response完成重定向】

    【概述】

    一种资源跳转方式

    【实现方式】

    resp.setStatus(302);

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

    resp.sendRedirect("资源B的路径");//(简化)

    例:

    1. //重定向
    2. //设置响应状态码
    3. response.setStatus(302);
    4. //设置响应头
    5. response.setHeader("Location","/HTTP/resp2");
    6. //简化方式
    7. response.sendRedirect("/HTTP/resp2");

    【特点】

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

    【注意】

    • 浏览器使用:需要加虚拟目录(项目访问路径)
    • 服务端使用:不需要加虚拟目录

    【Response响应字符数据】

    【方法】

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

    PrintWriter writer = resp.getWriter();
    

    2、写数据

    writer.write("aaa");
    

    例: 

    1. //解析text为html,并且改变响应数据的字符集为utf-8
    2. response.setContentType("text/html;charset=utf-8");
    3. //获取字符输出流
    4. PrintWriter writer = response.getWriter();
    5. writer.write("aaa");
    6. writer.write("你好");
    7. writer.write("

      aaa

      "
      );

    【注意】

    • 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
    • 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
    resp.setContentType("text/html;charset=utf-8");
    

    【Response响应字节数据】

    【方法】

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

    ServletOutputStream outputStream = resp.getOutputStream();
    

    2、写数据

    outputStream.write(字节数据);
    

    例:

    1. //读取文件
    2. FileInputStream fis=new FileInputStream("E:\\Project\\JAVA\\Project Study\\HTTP\\Image\\reg_bg_min.jpg");
    3. //获取response字节输出流
    4. ServletOutputStream os=response.getOutputStream();
    5. //完成流的copy
    6. byte[] buff=new byte[1024];
    7. int len=0;
    8. while ((len= fis.read(buff))!=-1){
    9. os.write(buff,0,len);
    10. }
    11. fis.close();

    【使用IOUtils工具类】

    1、导入坐标

    1. <dependency>
    2. <groupId>commons-iogroupId>
    3. <artifactId>commons-ioartifactId>
    4. <version>2.6version>
    5. dependency>

    2、使用

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

    例: 

    1. //读取文件
    2. FileInputStream fis=new FileInputStream("E:\\Project\\JAVA\\Project Study\\HTTP\\Image\\reg_bg_min.jpg");
    3. //获取response字节输出流
    4. ServletOutputStream os=response.getOutputStream();
    5. //完成流的copy
    6. IOUtils.copy(fis,os);
    7. fis.close();
  • 相关阅读:
    Linux 内核构建
    Nougat:一种用于科学文档OCR的Transformer 模型
    Mybatis的介绍及使用
    【简说八股】Redisson的守护线程是怎么实现的
    [附源码]Python计算机毕业设计房地产销售系统
    Java Socket网络编程
    mysql日常优化的总结
    串行原理编程,中文编程工具中的串行构件,串行连接操作简单
    《lwip学习10》-- TCP协议
    MAML在隐式神经表示中的应用
  • 原文地址:https://blog.csdn.net/huihu__/article/details/126162435