• Webapp中完成资源的跳转:转发和重定向


    关于资源跳转:

    我们在实际的开发过程中,需要写不同的servlet,每个servlet完成不同的功能,当我们访问servletA的时候,serveltA需要跳转到一个新的servletB里面,这就是资源跳转的方式。

    第一种方式:转发机制

    1. 代码:
    //获取请求转发器对象
    RequestDispatcher dispatcher = request.getRequestDispatcher("/dept/list");
    //调用请求转发器对象的forward方法完成转发
    dispatcher.forward(request,response);
    
    //合并成一行
    request.getRequestDispatcher("/dept/list").forward(request,response);
    //转发的时候是一次HTTP请求,不管你转发了多少次。都是一次HTTP请求。
    //AServlet转发到BServlet,再转发到CServlet,再转发到DServlet,不管转发了多少次,都是在同一个request请求当中。
    //这是因为调用foward方法的时候,会将当前的request和response对象传递给下一个Servlet。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 形式上的区别:
      (1)转发(一次请求):在浏览器地址栏上发送的请求是:http://localhost:8080/servlet09/a,最终请求结束之后,浏览器地址栏上的地址还是这个。没变。
      (2)转发:是WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成。
      (3)我的理解:转发就是servletA中调用方法执行servletB,并把自己的request和response参数传给servletB,整个过程一直是servletA在执行,只是servletA调用了servletB去帮忙处理一些业务逻辑(类似方法调用)。
      (4)我的理解:转发机制使用forward()方法将requset请求转发给其他servlet。

    第二种方式:重定向

    1. 代码:
    //注意:路径上要加一个项目名。为什么?
    //浏览器发送请求,请求路径上是需要添加项目名的。
    //以下这一行代码会将请求路径"/项目名/dept/list"发送给浏览器。
    //浏览器会自发的向服务器发送一次全新的请求:/项目名/dept/list
    response.sendRedirect("/项目名/dept/list");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 形式上的区别:
      (1)重定向(两次请求):在浏览器地址栏上发送的请求是:http://localhost:8080/servlet09/a,最终在浏览器地址上显示的地址是:http://localhost:8080/servlet09/b
      (2)重定向:是浏览器完成的。具体跳转到那个资源,是浏览器说了算。
      (3)我的理解:servletA执行中通过方法告诉浏览器一个新的URL,浏览器访问新的URL,整个过程servletA执行后servletB再执行,所以URL会改变。
      (4)servletA执行完后通知浏览器去访问servletB。

    转发和重定向应该如何选择:

    • 如果在上一个Servlet域当中绑定了数据,希望从下一个Servlet当中吧request域里面的数据取出来,使用转发机制。
    • 剩下的所有请求均使用重定向。(重定向使用较多)
    • 转发会存在浏览器的刷新问题,。
    • 重定向不能共享数据!
  • 相关阅读:
    如何在 Azure 容器应用程序上部署具有 Elastic Observability 的 Hello World Web 应用程序
    git使用大全
    生产部长修炼宝典⑤:基于管控分析模型的生产管控可视化分析看板建设
    【华为OD题库-027】代码编辑器-java
    封神工具:腾讯云服务器价格计算器_好工具分享
    SQLite库使用小结
    LLM应用实战:当KBQA集成LLM
    SHAP 和 LIME 解释模型
    【Python】使用Python连接ClickHouse进行批量数据写入
    【附源码】Python计算机毕业设计球迷信息交流论坛
  • 原文地址:https://blog.csdn.net/m0_53881899/article/details/126413477