什么是重定向?
- 请求转发(Forward)------ 服务器内部的 "秘密跳转"
你可以把它理解成:你去餐厅(客户端)点了一份炒饭,服务员 A(Servlet1)接单后发现厨房做炒饭需要先找配菜,于是他没告诉你,直接把单子转给了负责配菜的服务员 B(Servlet2),最后服务员 B 做好炒饭端给你。
特点:全程你只跟服务员 A 打了一次交道(1 次请求),你不知道中间转给了 B;浏览器地址栏显示的还是最初找 A 的地址,不会变。
关键用法:需要共享数据时用它!比如 Servlet1 查到了用户信息,想传给 Servlet2 显示,就用 request.setAttribute() 存数据,转发后 Servlet2 能直接拿到。 - 响应重定向(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 // 转发的接收者
第一步:写「请求转发」的代码(手把手抄)
-
写 Servlet1(发起转发的那个)
复制下面的代码,创建Servlet1.java: -
写 Servlet2(接收转发的那个)
复制下面的代码,创建Servlet2.java: -
运行测试(关键步骤)
启动你的 Web 项目(比如 Tomcat);
打开浏览器,输入地址:http://localhost:8080/demo/servlet1;
你会看到浏览器显示:Servlet2收到的消息:我是从Servlet1传过来的消息;
重点看地址栏:还是/servlet1,没有变成/servlet2(这就是转发的特点!)
第二步:写「响应重定向」的代码(同样手把手抄)
我们改一下 Servlet1,把转发改成重定向:
-
修改后的 Servlet1(发起重定向)
-
运行测试(看区别)
重启项目,浏览器输入:http://localhost:8080/demo/servlet1;
浏览器会立刻跳转到http://localhost:8080/demo/servlet2(地址栏变了!);
因为重定向不能传req里的数,所以 Servlet2 会显示:Servlet2收到的消息:null(这是重定向的特点)。
总结
请求转发:核心代码是getRequestDispatcher().forward(),地址栏不变,能传req里的数据;
重定向:核心代码是sendRedirect(),地址栏会变,不能传req里的数据;
实操只需要两步:写发起跳转的 Servlet,写接收跳转的 Servlet,运行后看地址栏和显示结果就能区分。