• 【祝福伟大的祖国】Java Web 9.2 Request 对象 9.2.6 Request 请求转发


    Java Web

    【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】

    9 Request&Response

    9.2 Request 对象
    9.2.6 Request 请求转发

    【请求转发】

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

    在这里插入图片描述

    过程:

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

    【请求转发的实现方式】

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

    【举个栗子】

    在这里插入图片描述

    实现步骤:

    1. 创建一个RequestDemo5类,接收/req5的请求,在doGet方法中打印demo5
    2. 创建一个RequestDemo6类,接收/req6的请求,在doGet方法中打印demo6
    3. 在RequestDemo5的方法中使用req.getRequestDispatcher(“/req6”).forward(req,resp)进行请求转发
    4. 启动测试
    • 创建RequestDemo5 类

      package com.dingjiaxing.web;
      
      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;
      
      /**
       * ClassName: RequestDemo5
       * date: 2022/9/12 11:30
       *
       * @author DingJiaxiong
       */
      
      @WebServlet("/req5")
      public class RequestDemo5 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("demo5...");
          }
      
          @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
    • 创建RequestDemo6 类

    package com.dingjiaxing.web;
    
    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;
    
    /**
     * ClassName: RequestDemo6
     * date: 2022/9/12 11:30
     *
     * @author DingJiaxiong
     */
    
    @WebServlet("/req6")
    public class RequestDemo6 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("demo6...");
        }
    
        @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
    • 在RequestDemo5的doGet方法中进行请求转发

    在这里插入图片描述

    • 测试

    在这里插入图片描述

    只访问了req5,但是demo6也打印了,说明请求已经转发到了/req6

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

    解决问题:把请求从/req5转发到/req6的时候,如何传递数据给/req6。

    需要使用request对象提供的三个方法:

    • 存储数据到request域范围,数据是存储在request对象中

      void setAttribute(String name,Object o);
      
      • 1
    • 根据key获取值

    Object getAttribute(String name);
    
    • 1
    • 根据key删除该键值对

      void removeAttribute(String name);
      
      • 1

    [看个需求]

    在这里插入图片描述

    1. 在RequestDemo5的doGet方法中转发请求之前,将数据存入request域对象中
    2. .在RequestDemo6的doGet方法从request域对象中获取数据,并将数据打印到控制台
    3. 启动访问测试

    [修改RequestDemo5和6中的方法]

    在这里插入图片描述

    启动服务测试

    在这里插入图片描述

    这样就实现了在转发多个资源之间共享数据。

    【请求转发的特点】

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

      虽然后台从/req5转发到/req6 ,但是浏览器的地址一直是/req5 ,未发生变化

      在这里插入图片描述

    2. 只能转发到当前服务器的内部资源

      不能从一个服务器通过转发访问另一台服务器

    3. 一次请求,可以在转发资源间使用request共享数据

    虽然后台从/req5转发到/req6,但是这个只有一次请求

  • 相关阅读:
    CUDA学习笔记(十二) CUDA库简介
    面试题:CSS 怎样实现动画?
    Angular+html+js前端加载生命周期
    什么是快应用?与原生APP相比优势在哪里
    Centos下安装MySQL,配置远程连接(无坑版)
    【Unity3D】Android 打包 ③ ( Android 工程设置 | 打包 Apk 安装文件 )
    带SLCD屏驱动的低功耗单片机MM32L0130
    招投标系统软件源码,招投标全流程在线化管理
    Law of continuity
    java输入输出方式
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127131523