重定向

什么是重定向?

  1. 请求转发(Forward)------ 服务器内部的 "秘密跳转"
    你可以把它理解成:你去餐厅(客户端)点了一份炒饭,服务员 A(Servlet1)接单后发现厨房做炒饭需要先找配菜,于是他没告诉你,直接把单子转给了负责配菜的服务员 B(Servlet2),最后服务员 B 做好炒饭端给你。
    特点:全程你只跟服务员 A 打了一次交道(1 次请求),你不知道中间转给了 B;浏览器地址栏显示的还是最初找 A 的地址,不会变。
    关键用法:需要共享数据时用它!比如 Servlet1 查到了用户信息,想传给 Servlet2 显示,就用 request.setAttribute() 存数据,转发后 Servlet2 能直接拿到。
  2. 响应重定向(Redirect)------ 服务器让你 "重新跑腿"
    这个就像:你去政务大厅(客户端)办业务,窗口 A(Servlet1)看了你的材料说 "这个业务不归我管,你去隔壁窗口 B 办",然后你自己拿着材料去窗口 B(Servlet2)重新排队(发起第 2 次请求)。
    特点:你跑了两趟(2 次请求),第一次找 A,第二次找 B;浏览器地址栏会从 A 的地址变成 B 的地址,能明显看到跳转。
    关键用法:不需要共享数据、或者怕用户重复提交数据时用!比如登录成功后跳转到首页,用重定向的话,用户刷新页面不会重复提交登录信息。
    两者最核心的区别(一句话记牢)
    转发是 "一次请求,内部跳转,地址不变,能传数据"
    重定向是 "两次请求,外部跳转,地址改变,不传数据"
    举个生活例子帮你区分
    转发 = 你叫外卖,商家接单后转给同城配送,你只跟商家沟通,不知道配送员是谁。
    重定向 = 你叫外卖,商家说 "我家没货,你去隔壁店下单",你得自己去隔壁店重新下单

先搞懂:实操前的准备

假设你已经有了一个基础的 Java Web 项目(比如叫demo),项目结构大概是这样:

demo/

└── src/main/java/

└── com/

└── test/

├── Servlet1.java // 转发的发起者

└── Servlet2.java // 转发的接收者

第一步:写「请求转发」的代码(手把手抄)

  1. 写 Servlet1(发起转发的那个)
    复制下面的代码,创建Servlet1.java:

  2. 写 Servlet2(接收转发的那个)
    复制下面的代码,创建Servlet2.java:

  3. 运行测试(关键步骤)
    启动你的 Web 项目(比如 Tomcat);
    打开浏览器,输入地址:http://localhost:8080/demo/servlet1;
    你会看到浏览器显示:Servlet2收到的消息:我是从Servlet1传过来的消息;
    重点看地址栏:还是/servlet1,没有变成/servlet2(这就是转发的特点!)

第二步:写「响应重定向」的代码(同样手把手抄)

我们改一下 Servlet1,把转发改成重定向:

  1. 修改后的 Servlet1(发起重定向)

  2. 运行测试(看区别)
    重启项目,浏览器输入:http://localhost:8080/demo/servlet1;
    浏览器会立刻跳转到http://localhost:8080/demo/servlet2(地址栏变了!);
    因为重定向不能传req里的数,所以 Servlet2 会显示:Servlet2收到的消息:null(这是重定向的特点)。

总结

请求转发:核心代码是getRequestDispatcher().forward(),地址栏不变,能传req里的数据;

重定向:核心代码是sendRedirect(),地址栏会变,不能传req里的数据;

实操只需要两步:写发起跳转的 Servlet,写接收跳转的 Servlet,运行后看地址栏和显示结果就能区分。