当前位置: 首页 > news >正文

Servlet 转发与重定向:大白话对比 + 代码实战

Servlet 转发与重定向:大白话对比 + 代码实战

一、先搞懂核心概念:什么是转发?什么是重定向?
请求转发(Forward)
大白话:服务器内部帮你跑腿,你只发一次请求,服务器自己偷偷跳转,最后把结果给你。
你完全不用动,地址栏也不会变。
• 特点:一次请求,一次响应,地址栏不变,可以共享 request 数据。
重定向(Redirect)
大白话:服务器告诉你“你去另一个地方找”,你(浏览器)再主动发起第二次请求。
地址栏会变成新地址。
• 特点:两次请求,两次响应,地址栏变化,不能共享 request 数据。
二、类比理解(餐厅点餐版)
• 转发:你点了一份鱼香肉丝,服务员 A 发现需要配菜,于是把单子内部转给服务员 B,B 做完直接端给你。你只接触了一次服务员。
• 重定向:你点鱼香肉丝,服务员 A 说“我们店不做这个,你去隔壁店”,于是你自己走出去到隔壁再点一次。你接触了两次服务员。
三、代码实战(基于你已有的 HelloServlet 项目)

  1. 请求转发示例
    @WebServlet("/forwardDemo")
    public class ForwardServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    // 在 request 中存入数据
    req.setAttribute("msg", "我是转发过来的数据");
    // 转发到另一个 Servlet 或 JSP
    req.getRequestDispatcher("/show.jsp").forward(req, resp);
    }
    }

@WebServlet("/redirectDemo")
public class RedirectServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
// 注意:重定向不能直接共享 request 数据
resp.sendRedirect("https://www.baidu.com");
// 或者重定向到本项目的另一个路径
// resp.sendRedirect(req.getContextPath() + "/login.jsp");
}
}
局部截取_20260426_140354
局部截取_20260426_140721
局部截取_20260426_140740