三种跳转方式终极对比request.getRequestDispatcher().forward()——Servlet 里用的转发jsp:forward——JSP 里用的转发response.sendRedirect()——重定向一、一句话总结1 和 2 功能完全一样都是服务器转发3 完全不同是浏览器重定向二、最清晰表格背会这个就够了特性request.getRequestDispatcher.forwardjsp:forwardresponse.sendRedirect属于什么Java 代码ServletJSP 标签Java 代码Servlet跳转方式服务器内部转发服务器内部转发浏览器重定向地址栏 URL不变不变会变请求次数1 次1 次2 次能否传递 request 数据✅能✅能❌不能能否跳外部网站不能不能能效率高高低你项目用哪个✅ 必须用这个几乎不用增删改才用三、超级大白话解释1. 转发前两个 你找我办事我帮你找同事完成只找一次我把你的东西request数据直接带给同事地址栏不变2. 重定向第三个 我不帮你我让你自己再去找别人你找我 → 我让你再去一次你的东西带不过去地址栏变了四、你必须记住的使用规则✅ 查询数据 → 展示页面必须用request.getRequestDispatcher.forward因为要带数据过去✅ 增加、删除、修改完成后用response.sendRedirect防止重复提交❌ jsp:forward 基本不用企业开发几乎不用只在纯 JSP 页面跳转偶尔用五、项目里的正确写法查询图书 → 跳 JSP必须转发request.setAttribute(bookList,list);request.getRequestDispatcher(bookList.jsp).forward(request,response);删除图书 → 重新查询重定向response.sendRedirect(book);六、终极记忆口诀要带数据用转发地址不变最省心不带数据重定向增删改完用它行。七、什么情况用重定向 sendRedirect底层原因防止表单重复提交举你图书系统的场景浏览器发起POST请求执行新增/修改/删除图书如果你用 forward 转发到列表页浏览器地址栏依旧是/book提交接口地址用户刷新页面浏览器会再次发送上一次POST请求重复新增/重复删除产生脏数据。如果你用 sendRedirect 重定向服务器返回302状态码让浏览器重新发一次GET请求访问图书列表地址栏变成/book查询接口刷新只会查询不会重复执行修改操作。对比示例删除图书场景错误写法forward会重复提交// 删除逻辑完成bookDao.delete(id);// 转发地址不变刷新会再次删书request.getRequestDispatcher(book).forward(request,response);正确写法sendRedirect杜绝重复提交bookDao.delete(id);// 重定向到查询接口全新GET请求response.sendRedirect(book);1. 必须重定向 sendRedirect 的场景POST 增、删、改新增图书、编辑图书、删除图书执行完毕需要跳转到项目外部网址如百度、第三方登录页希望用户地址栏URL同步更新方便复制分享链接登录成功后跳转首页、退出登录跳转登录页。2. 绝对不能用重定向必须 forward 转发的场景查询数据查图书列表、图书详情需要把request域数据传给JSP展示重定向是两次独立请求第一次存的setAttribute数据会直接丢失页面拿不到列表。内部页面携带临时查询参数、校验提示信息展示。场景1查询图书转发forwardOverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{ListBookbookListbookDao.selectAll();// 把图书列表存入request域request.setAttribute(bookList,bookList);// 转发到展示页面携带数据request.getRequestDispatcher(bookList.jsp).forward(request,response);}场景2删除图书重定向sendRedirectOverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringidrequest.getParameter(id);bookDao.deleteById(Integer.parseInt(id));// 删除完成重定向回到查询页面刷新无副作用response.sendRedirect(book);}重定向路径注意sendRedirect(book)相对路径匹配你web.xml里/book的servlet映射写/book代表从项目根路径访问两种写法在你这个项目都可用forward 和 sendRedirect 不能连续调用执行forward后响应已经提交再调用sendRedirect会抛异常反之同理二选一。提示信息怎么带过重定向重定向丢失request数据短期提示可以用session存提示文字页面读取后立即删除session数据。