`

重定向和转发的区别

    博客分类:
  • Java
 
阅读更多


区别一:

  重定向时浏览器上的网址改变

  转发是浏览器上的网址不变

区别二:

  重定向实际上产生了两次请求

转发只有一次请求 

重定向: 

  发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器 

转发: 

  发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器 

区别三:

  重定向时的网址可以是任何网址

  转发的网址必须是本站点的网址

详解:

  重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

正文开始: 

  先是看上去不同,他们的调用分别如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp" />
我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮助。
提到转发和重定向就不得不提到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 contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
<a href="b.jsp?id=1">指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了</a>
</body>
</html> 

b.jsp
<%@ page contentType="text/html; charset=GBK" %>
<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 contentType="text/html; charset=GBK" %>
<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>前面增加一句<jsp:forward page="d.jsp"/>
d.jsp
<%@ page contentType="text/html; charset=GBK" %>
<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)中用到,所以要用转发。 

总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。

分享到:
评论

相关推荐

    一个基于struts的重定向和转发实例

    了解了这些基本概念,开发者可以更好地理解和利用Struts中的重定向和转发机制,以实现更加高效和灵活的Web应用程序设计。在实际开发中,重定向常用于实现URL的隐藏,防止用户直接访问受保护的资源,而转发则在保持...

    转发和重定向的区别

    在Web开发中,"转发"(Forward)和"重定向"(Redirect)是两种常见的页面跳转方式,它们虽然在效果上看似相似,但其实有着本质的区别。理解这两种技术的工作原理及其应用场景对于优化应用程序的性能和用户体验至关...

    jsp中标签,对象存储与提交,还有重定向和转发的区别。

    而掌握重定向和转发的区别,则能优化用户体验并正确处理页面间的导航逻辑。 项目总体规划文档(项目总体规划.docx)可能包含了关于实习项目的整体设计思路、技术选型、开发计划等内容,而WebDemo可能是一个实际的...

    转发和重定向的区别 forward和redirect的区别

    在Java的Servlet编程中,`转发`和`重定向`是两种不同的机制,用于在服务器端将客户端的请求导向不同的资源。它们的主要区别在于请求处理流程、URL改变以及数据共享方式。 1. 转发(Forward): - 使用`...

    转发与重定向的区别

    ### 转发与重定向的区别 在Web开发中,转发(Forward)和重定向(Redirect)是两种常见的页面跳转方式。这两种方法虽然都能实现页面的跳转,但其内部工作原理、对客户端的影响以及应用场景都有所不同。本文将详细...

    请求转发与重定向的区别

    2. 实践编程:通过编写实际的Servlet或Filter来实现请求转发和重定向,这能帮助你更好地掌握它们的用法和区别。 3. 分析案例:研究不同应用场景下,何时选择请求转发,何时选择重定向,这有助于你在实际工作中做出...

    request和response实现跳转和重定向的区别

    3. 上下文信息:转发可以保留请求和响应的上下文信息,如请求参数、session等,而重定向会导致这些信息丢失,除非手动添加到新的请求中。 4. 永久与临时:重定向可以设置为永久或临时,例如301重定向表示URL已经...

    重定向与转发

    在 Web 应用程序中,重定向(Redirect)和转发(Forward)是两个常见的机制,用于实现页面的跳转和数据的传递。它们之间有着本质的区别,但它们都是实现页面跳转和数据传递的重要手段。 一、转发(Forward) 转发...

    请求转发与重定向

    在Web开发中,**请求转发**与**重定向**是两种非常重要的控制流程技术,它们都用于实现页面跳转的功能,但其工作原理和应用场景有所不同。 #### 二、请求转发 ##### 1. 定义 **请求转发**是在服务器内部进行的,它...

    servlet请求转发、重定向、包含

    Servlet请求转发、重定向和包含是Servlet中处理客户端请求的重要技术,它们都涉及到如何有效地管理用户请求和页面跳转,但各自有不同的特性和应用场景。 1. **请求转发(Request Forward)** - 请求转发是在服务器...

    小谈“转发与重定向”

    总结而言,转发与重定向各有优势与局限性,开发者需要根据具体的应用场景和技术需求来灵活选择使用哪种方式。通常情况下,如果希望在同一个Web应用内部进行跳转,并且希望保持请求的数据不丢失,那么选择转发更为...

    转发与重定向区别

    尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse.sendRedirect方法实现的...

    jsp 转发和重定向的区别(forward sendRedicreat)

    jsp 转发和重定向的区别 jsp 转发和重定向是两种常见的控制转移方式,它们都可以把控制从一个页面转到另一个页面,但是它们有很大的区别。 转发 jsp 转发是通过 `&lt;jsp:forward&gt;` 元素或 `request....

    SpringCloud URL重定向及转发代码实例

    Spring Cloud URL重定向及转发代码实例是Spring Cloud框架中一个重要的知识点,本文将详细介绍Spring Cloud URL重定向及转发代码实例的使用方法和示例代码。 一、重定向(Redirect) 重定向是指将用户的请求从一个...

    android IP 和端口 重定向

    在Android平台上,IP和端口的重定向是一个关键的技术,常用于网络调试、代理服务或者在设备上模拟网络环境。这个技术涉及到网络编程、Socket通信以及Android系统的权限管理。下面将详细阐述如何在Android中实现IP和...

    请求转发和重定向的区别共1页.pdf.zip

    在Web应用开发中,请求转发和重定向是两种常见的页面跳转方式,它们在处理用户请求时起到关键作用,但工作原理和效果有所不同。这里我们将深入探讨这两种技术的区别。 首先,我们来理解请求转发(Request Forward)...

Global site tag (gtag.js) - Google Analytics