请求转发和重定向 请求转发内部页面跳转、携带请求数据、后台多个 Servlet 之间流转。1.发生在服务器内部2.全程只产生 1 次请求3.浏览器地址栏 URL保持不变4.可以使用request.setAttribute()传递数据// 写法request.getRequestDispatcher(目标地址).forward(request,response); request.getRequestDispatcher(/index.jsp).forward(request, response);//ServletA protected void doGet(HttpServletRequest request, HttpServletResponse response){ // 把数据存入request域 request.setAttribute(message,转发携带的数据); // 请求转发服务器内部跳转 request.getRequestDispatcher(/servletB).forward(request,response); } //ServletB protected void doGet(HttpServletRequest request, HttpServletResponse response){ // 可以取出上一个Servlet存放的数据 String msg (String) request.getAttribute(message); response.getWriter().write(msg); } ​重定向登录成功跳首页、防止表单重复提交、跳转到别的网站。1.服务器给浏览器返回新地址浏览器重新发请求2.一共2次独立请求3.浏览器地址栏 URL 会变成新地址4.无法使用 request 传值只能用 Session、Cookie5.既可以跳转本项目页面也可以跳转到百度、其他网站// 写法response.sendRedirect(目标地址); response.sendRedirect(index.jsp);//ServletA protected void doGet(HttpServletRequest request, HttpServletResponse response){ // request中的数据在下一次请求会丢失拿不到 request.setAttribute(message,数据丢失); // 重定向让浏览器重新发请求 response.sendRedirect(/servletB); } //ServletB protected void doGet(HttpServletRequest request, HttpServletResponse response){ // 取不到上面request里的值两次请求是两个独立request对象 String msg (String) request.getAttribute(message); response.getWriter().write(msg); }对比请求转发 forward重定向 redirect执行位置服务器内部客户端浏览器请求次数1 次请求2 次请求地址栏URL 不变URL 变成新地址request 域数据可以共享无法共享跳转范围只能跳转到当前项目内部资源可以跳转到外部网址百度等路径写法不用写项目名直接写/资源名相对路径或带项目名的绝对路径