代码改变世界

重定向和转发

2013-05-11 23:18  Arraylist  阅读(200)  评论(0)    收藏  举报

一个比喻:
小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工 作,并把最后的结果交给了小张。这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知 道,他只等待最终的结果。
重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。

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

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

 

3、实现方式不同
请求转发的实现步骤:

    • 说明将要转发的资源;
    • 获取请求转发的对象;
    • 调用请求转发对象中forward()方法
Java代码  收藏代码
  1. String forward = "/a.jsp";  
  2. RequestDispatcher rd = request.getRequestDispatcher(forward);    
  3. rd.forward(request, reponse); 

重定向的实现步骤:

    • 说明将要重定向的资源;
    • 调用response对象中sendRedirect方法
  1. String resource =  request.geContextPath() + "/a.jsp";  
  2. response.sendRedirect(resource); 
  3. 4、知情人不同
    请求转发时转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待 WEB服务器最终的结果。而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清 楚,当让WEB服务器也很明白。
    相同点:
    两者都可以进行多次请求的转发。