Servlet的“请求转发(Forward)”和“重定向(Redirect)”理解

请求转发(Forward)和重定向(Redirect)之间区别与联系

 

一个比喻: 

小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工作,并把最后的结果交给了小张。这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知道,他只等待最终的结果。 

重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。 

 

区别: 

1、浏览器地址栏显示不同(表面区别) 

无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。这只是表面上看到的不同地方。 

2、组件之间可否共享信息不同(本质区别) 

从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次requestresponse对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的requestresponse对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。 

3、实现方式不同 

请求转发的实现步骤: 

说明将要转发的资源;

获取请求转发的对象;

调用请求转发对象中forward()方法

 

Java代码  

String forward = "/a.jsp";  

RequestDispatcher rd = request.getRequestDispatcher(forward);    

rd.forward(request, reponse);  

 

重定向的实现步骤: 

说明将要重定向的资源;

调用response对象中sendRedirect方法

 

Java代码  

String resource =  request.geContextPath() + "/a.jsp";  

response.sendRedirect(resource);  

 

4、知情人不同 

请求转发时转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servletJSP),它只是在等待WEB服务器最终的结果。而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当让WEB服务器也很明白。 

 

相同点: 

两者都可以进行多次请求的转发。

posted @ 2012-09-26 16:50  Youkes  阅读(944)  评论(0编辑  收藏  举报