关于资源跳转:
我们在实际的开发过程中,需要写不同的servlet,每个servlet完成不同的功能,当我们访问servletA的时候,serveltA需要跳转到一个新的servletB里面,这就是资源跳转的方式。
第一种方式:转发机制
- 代码:
//获取请求转发器对象
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)转发(一次请求):在浏览器地址栏上发送的请求是:http://localhost:8080/servlet09/a,最终请求结束之后,浏览器地址栏上的地址还是这个。没变。
(2)转发:是WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成。
(3)我的理解:转发就是servletA中调用方法执行servletB,并把自己的request和response参数传给servletB,整个过程一直是servletA在执行,只是servletA调用了servletB去帮忙处理一些业务逻辑(类似方法调用)。
(4)我的理解:转发机制使用forward()方法将requset请求转发给其他servlet。
第二种方式:重定向
- 代码:
//注意:路径上要加一个项目名。为什么?
//浏览器发送请求,请求路径上是需要添加项目名的。
//以下这一行代码会将请求路径"/项目名/dept/list"发送给浏览器。
//浏览器会自发的向服务器发送一次全新的请求:/项目名/dept/list
response.sendRedirect("/项目名/dept/list");
-
形式上的区别:
(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 版权协议,转载请附上原文出处链接和本声明。