转发和重定向

一、转发和重定向

  • ✅一个web应用中通过两种方式,可以完成资源的转跳

    • 转发
    • 重定向

1.1 转发

  • ✅转发是一次请求,不管转发多少次,都在一个Servlet中
  • ✅请求路径不需要加项目名,因为他不是前端请求,是Tomcat内部跳转
  1. //获取请求转发器对象
  2. RequestDispatcher dispatcher = request.getRequestDispatcher("/dept/list");
  3. //调用请求转发器对象的forward方法完成转发
  4. dispatcher.forward(request,response);
  5. //合并一行代码
  6. request.getRequestDispatcher("/dept/list").forward(request,response);

1.2 重定向

  • ✅重定向时的路径当中需要以项目名开始,需要添加项目名

  • ✅浏览器发送请求,请求路径上需要添加项目名

  • ✅response对象将这个路径:”/项目名/b”响应给了浏览器,浏览器又自发的向服务器发送了一个全新的请求:http://localhost:8080/项目名/b

  • ✅所以浏览器一共发送了两次请求

    • 第一次请求:http://localhost:8080/项目名/a
    • 第二次请求:http://localhost:8080/项目名/b
    • 最终浏览器地址栏上显示地址当然是最后一次请求的地址,所以重定向会导致浏览器地址栏上的地址发生改变
  1. //重定向
  2. reponse.sendRedirect(request.getContextPath() + "/项目/b");

二、转发和重定向的区别

  • ✅转发:在浏览器地址栏上发送的请求是什么,请求结束后,浏览器的地址栏还是这个,没变
  • ✅重定向:浏览器地址上的地址会根据第二次请求的路径而改变

  • ✅转发:是由WEB服务器来控制的,A资源转跳到B资源,这个跳转的动作是Tomcat服务器内部完成的
  • ✅重定向:是浏览器完成的,具体转跳的哪个资源,浏览器决定

  • ✅用一个例子去描述转发和重定向

    • 借钱(转发:发送一次请求)
      • 老王没钱了,找张三借钱,其实张三没有钱,但是张三够义气,张三自己找李四借了钱,然后张三把这个钱给了老王,老王不知道这个钱是李四的,老王只求了一个人
    • 借钱(重定向:发送两次请求)
      • 老王没钱了,找张三借钱,张三没有钱,张三有个好哥们叫李四,张三把这个地址告诉了老王,然后老王按着这个地址去找到了李四借了钱,求了两个人,而且老王知道这个钱是李四借给他的

22、转发和重定向 - 图1

22、转发和重定向 - 图2

三、如何选择转发和重定向?

  • ✅如果在上一个Servlet当中向request域中绑定了数据,希望从下一个Servlet当中把request域里的数据取出来,使用转发机制
  • ✅剩下所有的请求均使用重定向 (重定向较多)

22、转发和重定向 - 图3

  • ✅转发会存在浏览器的刷新问题,可以用重定向解决问题

22、转发和重定向 - 图4