• Request(请求)&Response(响应)


    Request&Response


    在这里插入图片描述

    Request(请求)

    Request继承体系

    在这里插入图片描述

    注:

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

    2.使用request对象,查阅javaEE API文档的 HttpServletRequest接口

    Request获取请求数据(核心功能)

    获取请求数据

    1.请求行:

    GET /request-demo/req1?username=zhangsan HTTP/2
    
    • 1
    • String getMethod():获取请求方式:GET
    • Strintg getContextPath():获取虚拟目录(项目访问路径):/request-demo
    • StringBuffer get RequestURL():获取URL(统一资源定位符):http://local:8080/request-demo/req1
    • String get RequestURI():获取URL(统一资源标识符):/request-demo/req1
    • String getQueryString():获取请求参数(GET方式):username=zhangsan&password=123

    2.请求头

    User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
    
    • 1
    • String getHeader(String name):根据请求头名称获取值

    3.请求体

    POST请求才有请求体

    • ServletinputStream getinputStream();获取字节输入流
    • BufferedReader getReader():获取字符输入流

    通用方式获取请求参数

    • GET:

      String getQueryString()
      
      • 1
    • POST

      BufferedReader getReader()
      
      • 1

    思考:

    get请求方式与post请求方式区别在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGet与doPost方法内的代码?

    Request通用方式获取请求参数

    • Map<String,String[]> getParameterMap():获取所有参数map集合
    • String[] getParameterValues(String name):根据名称获取参数值(数组)
    • String getParameter(String name):根据名称获取参数值(单个)
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.Map;
    
    @WebServlet("/req2")
    public class RequestDemo2 extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("get.....");
    
            //1.获取所有的Map集合
            Map<String, String[]> map = req.getParameterMap();
            for (String key : map.keySet()) {
                //username;zhangsan
                System.out.print(key+":");
    
                String[] values = map.get(key);
                for (String value : values) {
                    System.out.print(value+" ");
                }
                System.out.println();
            }
            //根据key获取参数值,数组
            String[] hobbies = req.getParameterValues("hobby");
            for (String hobby : hobbies) {
                System.out.println(hobby);
            }
    
            //根据key获取单个参数值
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            System.out.println(username );
            System.out.println(password );
    
        }
    
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            
             this.doGet(req, resp);
      
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    Request请求转发

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

    在这里插入图片描述

    • 实现方式:

      req.getRequestDispatcher("资源B路径").forward(req,resp);
      
      • 1
    • 请求转发资源间共享数据:使用Request对象

      void setAttribute(String name,Object o):存储数据到request域中
      Object getAttribute(String name):	根据key,获取值
      void removeAttribute(String name):	根据key删除键值对
      
      • 1
      • 2
      • 3
    • 例:

    /**
     * 请求转发
     */
    
    @WebServlet("/req5")
    public class requestDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo5...");
    
            //存储数据
            request.setAttribute("ityc","yc");
            
            //删除数据
            request.removeAttribute("ityc");
            
            //请求转发
            request.getRequestDispatcher("/req6").forward(request,response);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    @WebServlet("/req6")
    public class requestDemo06 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("demo6...");
            //获取数据
            Object ityc = request.getAttribute("ityc");
            System.out.println(ityc);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    结果:

    在这里插入图片描述

    • 请求转发特点:
      • 浏览器地址栏不发生改变
      • 只能转发到当前服务器
      • 一次请求可以在转发的资源间使用request共享数据

    Response(响应)

    在这里插入图片描述

    一:Response设置响应数据功能介绍

    • 响应数据分为3部分:

      1. 响应行:

        HTTP/2 200 OK
        
        • 1
        void setStatus(int sc):设置响应状态码
        
        • 1
      2. 响应头

        content-type: text/html
        
        • 1
        void SetHeader(String name,String value):设置响应头键值对
        
        • 1
      3. 响应体

        <html><head></head><body></body></html>
        
        • 1
        PrintWriter getWriter():获取字符输出流
        ServletOutputStream getOutputStream():获取字节输出流
        
        • 1
        • 2

    二:Response完成重定向

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

    在这里插入图片描述

    • 实现方式:

      resp.setStatus(302);
      resp.setHeader("location","资源B的路径");
      
      • 1
      • 2
    • 联系

      @WebServlet("/resp1")
      public class ResponseDemo1 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              System.out.println("resp1.....");
              //重定向
              //1.设置响应状态码302
              //response.setStatus(302);
      
              //2.设置响应头location
              //response.setHeader("location","/Request-Tomcat/resp2");
      
              //简化方式完成重定向
              response.sendRedirect("/Request-Tomcat/resp2");
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      @WebServlet("/resp2")
      public class ResponseDemo2 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              System.out.println("sesp2....");
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 重定向特点:

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

    三:Response响应字符数据

    • 使用:

      1.通过Response对象获取字符输出流
      PrintWriter writer = response.getWriter();
      
      2.写数据:
        writer.write("aaa");
        writer.write("<h1>啊啊啊<h2>");//还可以写标签
      
      
      3.写标签时要设置对应的ContentType
        response.setContentType("text/html;charset=UTF-8");
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    • 注意:

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

      2. 中文乱码问题,原因通过Response获取的字符输出流默认编码是:.ISO-8859-1

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

    四:Rsponse响应字节数据

    • 使用:

      1.通过Response对象获取字符输出流
      ServletOutputStream outputStream = resp.getOutputStream();
      2.写数据
      outputStream.write(字节数据);
      
      • 1
      • 2
      • 3
      • 4
    • 例:将一张图片通过流,响应至浏览器

    • /*
      * 响应字节数据:设置字节数据的响应体
      * */
      @WebServlet("/resp4")
      public class ResponseDemo4 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.读取文件
              FileInputStream fileInputStream = new FileInputStream("D://a.jpg");
            //2.获取response字节输出流
              ServletOutputStream outputStream = response.getOutputStream();
            //3.完成流的copy
              /*byte[] bytes = new byte[1024];
              int len = 0;
              while((len =fileInputStream.read(bytes))!=-1){
                  outputStream.write(bytes,0,len);
              }*/
      		//简化书写版
              IOUtils.copy(fileInputStream,outputStream);
              fileInputStream.close();
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doGet(request, response);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
  • 相关阅读:
    在hyper-v虚拟机中安装并配置linux
    tsp学习
    Python第三方库 - Flask(python web框架)
    Python编程从入门到实践 第五章:if语句 练习答案记录
    TRCX:触摸屏(TSP)分析
    【常见SQL报错及解决办法】个人记录,自用
    Java原生执行Shell 文件
    分布式和微服务
    Dubbo总概
    Matlab使用cftool进行曲线拟合
  • 原文地址:https://blog.csdn.net/weixin_50659410/article/details/125282502