1、转发和重定向

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

    • 转发
    • 重定向

      1.1 转发

  • [x] 转发是一次请求,不管转发多少次,都在一个Servlet中

  • 请求路径不需要加项目名,因为他不是前端请求,是Tomcat内部跳转 ```java //获取请求转发器对象 RequestDispatcher dispatcher = request.getRequestDispatcher(“/dept/list”);

//调用请求转发器对象的forward方法完成转发 dispatcher.forward(request,response);

//合并一行代码 request.getRequestDispatcher(“/dept/list”).forward(request,response);

  1. <a name="NSSjt"></a>
  2. ## 1.2 重定向
  3. - [x] 重定向时的路径当中需要以项目名开始,需要添加项目名
  4. - [x] 浏览器发送请求,请求路径上需要添加项目名
  5. - [x] response对象将这个路径:"/项目名/b"响应给了浏览器,浏览器又自发的向服务器发送了一个全新的请求:`http://localhost:8080/项目名/b`
  6. - [x] 所以浏览器一共发送了两次请求
  7. - 第一次请求:`http://localhost:8080/项目名/a`
  8. - 第二次请求:`http://localhost:8080/项目名/b`
  9. - 最终浏览器地址栏上显示地址当然是最后一次请求的地址,所以重定向会导致浏览器地址栏上的地址发生改变
  10. ```java
  11. //重定向
  12. reponse.sendRedirect(request.getContextPath() + "/项目/b");

2、转发和重定向的区别

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

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

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

image.png
image.png

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

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

image.png

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

image.png