目录
转发和重定向重定向 `redirect`转发 `forward`重定向和转发对比代码测试`index.jsp` 页面`target.jsp` 页面`JumpPageServlet` 类测试重定向转发重定向可以跳转任意路径转发不可以跳转任意路径只能是自己项目下的本文转载自:/qq_39095899/article/details/106034954
转发和重定向
重定向redirect
/** 之前的写法* response.setStatus(302);* response.setHeader("Location", "login_success.html");*/// 重定向写法: 重新定位方向 参数即跳转的位置response.sendRedirect("login_success.html");
浏览器地址栏显示的是最后的那个资源的路径地址,会发生改变
请求次数最少有两次, 服务器在第一次请求后,会返回302
以及一个地址Location
, 浏览器在根据这个地址,执行第二次访问可以跳转到任意路径;不是自己的工程下的路径也可以跳重定向无法
将请求域中的数据带到目标页面(没法使用上一次的request
对象,因为这是两次不同的请求)
转发forward
// 请求转发的写法: 参数即跳转的位置RequestDispatcher rd = request.getRequestDispatcher("login_success.html");rd.forward(request, response);
浏览器地址栏显示的还是转发之前的地址,不会变
请求次数只有一次, 因为是服务器内部帮客户端执行了后续的工作只能跳转自己项目的资源路径请求转发可以
将请求域中的数据带到目标页面(使用的始终是同一个request
对象,对客户端来说只发了一次请求,那就只有一个request
对象)
重定向和转发对比
转发和重定向的区别:
转发在一次请求中完成;重定向是两次请求转发操作发生在服务器内部;重定向是浏览器执行操作转发浏览器地址栏不变(只有一次请求,一个地址);重定向浏览器地址栏变化(两次请求,两个地址)转发可以在一次请求中共享数据;重定向不行(重定向两次请求,每次都会创建新的request
对象)
代码测试
index.jsp
页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>导航页</title></head><body><a href="jump?action=forward">请求转发</a> <br /><a href="jump?action=redirect">重定向</a><hr /></body></html>
target.jsp
页面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>请求转发、重定向 — 目标页面</title></head><body><h1>我是target.jsp</h1>通过请求作用域传过来的参数(man):${man }</body></html>
JumpPageServlet
类
@WebServlet(description = "请求转发和重定向示例", urlPatterns = {"/jump" })public class JumpPageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String action = request.getParameter("action");switch(action) {case "redirect":// 重定向doRedirect(request, response);break;case "forward":doForward(request, response);break;default:break;}}// 通过请求转发的方式跳转页面private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 请求转发到target.jsp页面request.setAttribute("man", "黑旋风 . 李逵");request.getRequestDispatcher("target.jsp").forward(request, response);//request.getRequestDispatcher("").forward(request, response);}// 通过重定向的方式跳转页面private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {// 重定向到target.jsp页面// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)// 就好比如下代码:// Student stu1 = new Student();// stu1.setSname("宋江");// Student stu2 = new Student();// System.out.println(stu2.getSname());request.setAttribute("man", "黑旋风 . 李逵");response.sendRedirect("target.jsp");// 重定向不仅可以调到项目内部地址,还能调到任意地址//设置重定向响应头 // response.setHeader("location","");//设置状态码 //response.setStatus(302);//============上面代码的简化方式====================== //response.sendRedirect("");//response.setHeader("Refresh"," 3;url="); }protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");doGet(request, response);}}
测试
重定向
在浏览器中访问你项目下的index.jsp
点击重定向,结果如下所示
地址上显示的是最后的那个资源的路径地址,可以看出得不到域中得值黑旋风 . 李逵
,重定向无法将请求域中的数据带到目标页面
没法使用上一次的request
存储的数据,确切的说是没法使用上一次的request对象,因为这是两次不同的请求
转发
返回导航页index.jsp
中点击请求转发可以看到结果如下
可以获取到作用域中的值,并且地址栏中的地址没有发生变化。请求转发可以将请求域中的数据带到目标页面
重定向可以跳转任意路径
private void doRedirect(HttpServletRequest request, HttpServletResponse response) throws IOException {// 重定向到target.jsp页面// 重定向无法将请求域中的数据带到目标页(究其根本原因是因为两次请求不是同一个请求对象)// 就好比如下代码:// Student stu1 = new Student();// stu1.setSname("宋江");// Student stu2 = new Student();// System.out.println(stu2.getSname());request.setAttribute("man", "黑旋风 . 李逵");//response.sendRedirect("target.jsp");// 重定向不仅可以调到项目内部地址,还能调到任意地址//设置重定向响应头 // response.setHeader("location","");//设置状态码 //response.setStatus(302);//============上面代码的简化方式======================//上面那个重定向关闭下面两个打开一个就可以看到结果 //重定向跳转淘宝主页//response.sendRedirect("");//当前页面停留3秒钟之后跳转到京东首页response.setHeader("Refresh"," 3;url="); }
重定向成功
转发不可以跳转任意路径只能是自己项目下的
测试如下把之前的注释上打开下面那个
private void doForward(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 请求转发到target.jsp页面request.setAttribute("man", "黑旋风 . 李逵");//request.getRequestDispatcher("target.jsp").forward(request, response);request.getRequestDispatcher("").forward(request, response);}
转发百度失败