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

  • Post author:
  • Post category:其他




关于资源跳转:

我们在实际的开发过程中,需要写不同的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. 形式上的区别:

    (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. 形式上的区别:

    (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域里面的数据取出来,使用转发机制。

  • 剩下的所有请求均使用重定向。(重定向使用较多)
  • 转发会存在浏览器的刷新问题,。
  • 重定向不能共享数据!



版权声明:本文为m0_53881899原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。