请求转发(Forward)和重定向(Redirect)之间区别与联系一个比喻:小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工作,并把最后的结果交给了小张。这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知道,他只等待最终的结果。重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。区别:1、浏览器地址栏显示不同(表面区别)无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。这只是表面上看到的不同地方。2、组件之间可否共享信息不同(本质区别)从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。3、实现方式不同请求转发的实现步骤:说明将要转发的资源;获取请求转发的对象;调用请求转发对象中forward()方法Java代码1.Stringforward=/a.jsp;2.RequestDispatcherrd=request.getRequestDispatcher(forward);3.rd.forward(request,reponse);重定向的实现步骤:说明将要重定向的资源;调用response对象中sendRedirect方法Java代码1.Stringresource=request.geContextPath()+/a.jsp;2.response.sendRedirect(resource);4、知情人不同请求转发时转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当让WEB服务器也很明白。相同点:两者都可以进行多次请求的转发。请求转发与重定向的区别先是看上去不同,他们的调用分别如下:request.getRequestDispatcher(apage.jsp).forward(request,response);//转发到apage.jspresponse.sendRedirect(apage.jsp);//重定向到apage.jsp在jsp页面中你也会看到通过下面的方式实现转发:jsp:forwardpage=apage.jsp/我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮助。提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:在页面a.jsp中有一个链接ahref=b.jsp?id=1这是指向b的一个链接,而且还带了一个参数/a当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA-B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter(id))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:request.setAttribute(name,funcreal);out.println(request.getAttriblute(name));//成功显示了name变量的值。现在在b.jsp中再增加一个链接:ahref=c.jsp?age=23这是指向c的一个链接,而且还带了一个参数/a当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:a.jsp%@pagecontentType=text/html;charset=GBK%htmlbodybgcolor=#ffffffahref=b.jsp?id=1指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了/a/body/htmlb.jsp%@pagecontentType=text/html;charset=GBK%htmlbodybgcolor=#ffffff%out.println(id=+request.getParameter(id));request.setAttribute(name,FuncReal);out.println(name=+request.getAttribute(name));%ahref=c.jsp?age=23requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23/a/body/htmlc.jsp%@pagecontentType=text/html;charset=GBK%htmlbodybgcolor=#ffffff%out.println(id=+request.getParameter(id));out.println(name=+request.getAttribute(name));out.println(age=+request.getParameter(age));%/body/html那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中/body前面增加一句jsp:forwardpage=d.jsp/d.jsp%@pagecontentType=text/html;charset=GBK%htmlbodybgcolor=#ffffffrequestB-C的魔爪已经伸到了d.jsp页面%out.println(age=+request.getParameter(age));%/body/html运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,jsp:forwardpage=d.jsp/,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward(xxx);了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。总结:用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。有关JSP/Servlet的重定向技术综述如下[补充]1.RequestDispatcher.forward()转发是在服务器端起作用,当使用forward()时,Servletengine传递HTTP请求从当前的ServletorJSP到另外一个Servlet,JSP或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在b.jsp都可以获得,参数自动传递.但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute(name,name)来传至下一个页面.重定向后浏览器地址栏URL不变.例:在servlet中进行重定向publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType(text/html;charset=gb2312);ServletContextsc=getServletContext();RequestDispatcherrd=null;rd=sc.getRequestDispatcher(/index.jsp);//定向的页面rd.forward(request,response);}通常在servlet中使用,不在jsp中使用。2.response.sendRedirect()是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.重定向后在浏览器地址栏上会出现重定向页面的URL例:在servlet中重定向publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{response.setContentType(text/html;charset=gb2312);response.sendRedirect(/index.jsp);}由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。注意:(1).使用response.sendRedirect时,前面不能有HTML输出。这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSPSERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。(2).response.sendRedirect之后,应该紧跟一句return;我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。比较:(1).RequestDispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。前者更加高效,在前者可以满足需要