forward与redirect的区别

来源:互联网 发布:apkpure软件下载 编辑:程序博客网 时间:2024/04/29 18:52

     forward与redirect的区别 

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。还有,转发是在web应用程序之内进行的,可以访问web应用程序所设定的内部目录,像是WEB-INF目录,只能在Web应用程序中进行,不能指定至其它的Web应用程序的地址。 
    redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。web应用程序会要求客户端浏览器重新发出请求地址,客户端会重新连接至所指定的地址,因此浏览器的地址会出现重新导向的信息,重新导向后的请求由浏览器发出,所以不能访问Web应用程序中的隐藏目录,像是WEB-INF,重新是由浏览器重新要求一个网页,可以指定至其他的Web应用程序地址。   

    RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:

    前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。  

    1、forward与include共亨Request范围内的对象,而redirect则不行,即:如果一个javabean被声明为request范围的话,则被forward到的资源也可以访问这个javabean,而redriect则不行。 
    2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect  
    从地址栏显示来说 
   forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址. 

   redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL. 

   从数据共享来说 

   forward:转发页面和转发到的页面可以共享request里面的数据.   

   redirect:不能共享数据. 

   从运用地方来说 

   forward:一般用于用户登陆的时候,根据角色转发到相应的模块. 

   redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等. 

   从效率来说   

   forward:高.    

   redirect:低.  


   不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。  
   redirect:以前的request中存放的变量全部失效,并进入一个新的request作用域。 forward:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。  
   他们的调用分别如下: 
 request.getRequestDispatcher("apage.jsp").forward(request, response); //转发到apage.jsp response.sendRedirect("apage.jsp"); //重定向到apage.jsp <span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>
   在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp"/><span style="font-family: SimSun; background-color: rgb(255, 255, 255);">  </span>
 提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一 个请求的作用域到底有多大呢?例如: 
在页面a.jsp中有一个链接<a href="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中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>,当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码: 
a.jsp <%@ page c %> <html> <body bgcolor="#ffffff"> <a href="b.jsp?id=1"> 指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了</a> </body> </html>  b.jsp 
<%@ page c %> <html> <body bgcolor="#ffffff"> <% out.println("id=" + request.getParameter("id")); request.setAttribute("name","Func Real"); out.println("name=" + request.getAttribute("name")); %> 

<a href="c.jsp?age=23">
requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23</a> </body> </html>  

c.jsp 

<%@ page c %> <html> <body bgcolor="#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>前面增加一句

<pre name="code" class="html"><jsp:forward page="d.jsp"/> d.jsp <%@ page c %> <html> <body bgcolor="#ffffff"> requestB-C的魔爪已经伸到了d.jsp页面 <% out.println("age=" + request.getParameter("age")); %> </body> </html> 

运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。 

如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。  

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 

redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址, web应用程序会要求客户端浏览器重新发出请求地址,客户端会重新连接至所指定的地址,因此浏览器的地址会出现重新导向的信息,重新导向后的请求由浏览器发出。 forward与include共享Request范围内的对象,而redirect则不行, 

forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源。

0 0
原创粉丝点击