- 浏览: 342981 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
yin_bp:
不建议使用session复制机制,推荐bboss会话共享框架, ...
JBOSS7 集群和Session复制配置笔记 -
heipacker:
建议:java(多线程)实现高性能数据同步==>java ...
java(多线程)实现高性能数据同步 -
yang_min:
582399232 写道你的脚本貌似不能用呀?service ...
JBOSS7学习笔记 -
yang_min:
582399232 写道感觉这个脚本不好#shutdown=' ...
JBOSS7学习笔记 -
yang_min:
582399232 写道博主能问几个问题吗?1.按照你的步骤执 ...
JBOSS7 集群和Session复制配置笔记
转发和重定向的区别
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
正文开始:
先是看上去不同,他们的调用分别如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮
助。
提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个
链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:
在页面a.jsp中有一个链接这是指向b的一个链接,而且还带了一个参数。当我们点击这个连接的时候,就产生了一
个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.pr
intln(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:
request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功显示了name变量的值。
现在在b.jsp中再增加一个链接:这是指向c的一个链接,而且还带了一个参数,当我们点击这个连接的时候,将
产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为i
d,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:
a.jsp
指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了
b.jsp
requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23
c.jsp
那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中前面增加一句
d.jsp
requestB-C的魔爪已经伸到了d.jsp页面
运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.js
p的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,
page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请
求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。
总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
1、dispatch还是原来的request,但是redirect则是重新建立一个request。
2、dispatch基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect("http://www.mocuai.com");
有关JSP/Servlet的重定向技术综述如下[补充]
1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个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中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面
rd.forward(request, response);
}
通常在servlet中使用,不在jsp中使用。
2.response.sendRedirect()
是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
重定向后在浏览器地址栏上会出现重定向页面的URL
例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,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(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.
注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
3.<jsp:forward page="" />
它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。
如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
4.修改HTTP header的Location属性来重定向
通过设置直接修改地址栏来实现页面的重定向。
jsp文件代码如下:
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/jsa.jsp";
response.setHeader("Location",newLocn);
%>
5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面
在html文件中,下面的代码:
<meta http-equiv="refresh" content="300; url=target.jsp">
它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。
由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。
关键代码:
String content=stayTime+";URL="+URL;
response.setHeader("REFRESH",content);
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
正文开始:
先是看上去不同,他们的调用分别如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮
助。
提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个
链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:
在页面a.jsp中有一个链接这是指向b的一个链接,而且还带了一个参数。当我们点击这个连接的时候,就产生了一
个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.pr
intln(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:
request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功显示了name变量的值。
现在在b.jsp中再增加一个链接:这是指向c的一个链接,而且还带了一个参数,当我们点击这个连接的时候,将
产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为i
d,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:
a.jsp
指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了
b.jsp
requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23
c.jsp
那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中前面增加一句
d.jsp
requestB-C的魔爪已经伸到了d.jsp页面
运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.js
p的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,
page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请
求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。
总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
1、dispatch还是原来的request,但是redirect则是重新建立一个request。
2、dispatch基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect("http://www.mocuai.com");
有关JSP/Servlet的重定向技术综述如下[补充]
1.RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个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中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面
rd.forward(request, response);
}
通常在servlet中使用,不在jsp中使用。
2.response.sendRedirect()
是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
重定向后在浏览器地址栏上会出现重定向页面的URL
例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,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(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.
注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
3.<jsp:forward page="" />
它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。
如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
4.修改HTTP header的Location属性来重定向
通过设置直接修改地址栏来实现页面的重定向。
jsp文件代码如下:
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/jsa.jsp";
response.setHeader("Location",newLocn);
%>
5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面
在html文件中,下面的代码:
<meta http-equiv="refresh" content="300; url=target.jsp">
它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。
由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。
关键代码:
String content=stayTime+";URL="+URL;
response.setHeader("REFRESH",content);
发表评论
-
Java压缩 解压缩zip 并解决linux下中文乱码
2012-06-13 15:00 27761:再压缩前,要设置linux模式, 需要使用第三方ant-1 ... -
关于英文操作系统中解析中文文件插入到oracle中乱码问题
2011-11-04 22:58 1376真实环境: windows 2008 英文版 weblog ... -
Java反射经典实例 Java Reflection Cookbook (初级)
2009-10-16 14:56 2808Java提供了一套机制来动态执行方法和构造方法,以及数组操作等 ... -
判断密码的小方法(记一下不怕忘了)
2009-05-12 18:11 1314package test; import java.ut ... -
java的一些实用工具方法(用的时候随手了)
2009-03-28 16:21 1325// 将127.0.0.1 形式的IP地址转换成10进制整数, ... -
用XSL与XML实现多级菜单
2008-12-12 15:22 2557XML是可扩展标记语言(地 ... -
封装JNDI操作LDAP服务器的工具类(1)
2008-07-18 15:28 2441LDAP操作封装类 作者:廖武锋 MSN:liaowufe ... -
学Java应该搞懂的问题
2008-07-16 09:21 1455导读: 对于这个 ... -
Java实现获取本机上ADSL的IP
2008-05-20 15:42 2217import java.net.*; public clas ... -
多线程Java Socket编程示例
2008-05-19 09:35 18841.服务端 package sterning; ... -
对Spring做简单介绍
2007-11-05 16:46 1325Spring和Struts一样都是一 ... -
Struts,Spring,Hibernate优缺点
2007-11-05 12:06 3213.struts struts框架具有组件的模块化,灵活性和重 ... -
什么是JDBC
2007-11-05 12:05 2089JDBC, 全称为Java DataBase Co ... -
JAVA程序员之路
2007-11-04 22:41 2578很多网友问我学习Java有没有什么捷径,我说“无他,唯手熟尔” ... -
数据库时代的终结
2007-11-04 22:37 1193以数据库为核心的软件时代已经过去,数据库时代早已结束,当我看到 ... -
致面向对象技术初学者的一封公开信
2007-11-04 22:35 1218致面向对象技术初学者 ... -
Java EE/J2EE面向对象实战之道
2007-11-04 22:12 1134经常看到不少人抱怨Java ... -
经典Java基础问题!!!!
2007-11-03 00:02 1356对于这个系列里的问题,每个学Java的人都应该搞懂。当然,如果 ... -
什么是ant?
2007-11-02 23:28 2417ant Ant是一种基于Java的build工具。理论上来说, ... -
什么是Ruby
2007-11-02 21:06 1321Ruby是一种功能强大的面向对象的脚本语言,她可以使您方便快捷 ...
相关推荐
### 转发与重定向的区别 在Web开发中,转发(Forward)和重定向(Redirect)是两种常见的页面跳转方式。这两种方法虽然都能实现页面的跳转,但其内部工作原理、对客户端的影响以及应用场景都有所不同。本文将详细...
2. 实践编程:通过编写实际的Servlet或Filter来实现请求转发和重定向,这能帮助你更好地掌握它们的用法和区别。 3. 分析案例:研究不同应用场景下,何时选择请求转发,何时选择重定向,这有助于你在实际工作中做出...
### 重定向与转发的区别 在Web开发中,经常需要用到重定向(Redirect)与转发(Forward)这两种控制页面跳转的技术。尽管它们都能实现页面之间的跳转,但在具体的应用场景和技术实现上却有着本质的不同。下面将从多...
尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse.sendRedirect方法实现的...
jsp 转发和重定向的区别 jsp 转发和重定向是两种常见的控制转移方式,它们都可以把控制从一个页面转到另一个页面,但是它们有很大的区别。 转发 jsp 转发是通过 `<jsp:forward>` 元素或 `request....
在Web开发中,**请求转发**与**重定向**是两种非常重要的控制流程技术,它们都用于实现页面跳转的功能,但其工作原理和应用场景有所不同。 #### 二、请求转发 ##### 1. 定义 **请求转发**是在服务器内部进行的,它...
在Java的Servlet编程中,`转发`和`重定向`是两种不同的机制,用于在服务器端将客户端的请求导向不同的资源。它们的主要区别在于请求处理流程、URL改变以及数据共享方式。 1. 转发(Forward): - 使用`...
总结而言,转发与重定向各有优势与局限性,开发者需要根据具体的应用场景和技术需求来灵活选择使用哪种方式。通常情况下,如果希望在同一个Web应用内部进行跳转,并且希望保持请求的数据不丢失,那么选择转发更为...
Servlet请求转发、重定向和包含是Servlet中处理客户端请求的重要技术,它们都涉及到如何有效地管理用户请求和页面跳转,但各自有不同的特性和应用场景。 1. **请求转发(Request Forward)** - 请求转发是在服务器...
本篇文章将详细解析请求转发与重定向的区别。 一、请求转发(Request Forwarding) 1. 定义:请求转发是在服务器端完成的内部操作,它不涉及客户端浏览器的任何更改。当服务器接收到一个请求后,可以决定将该请求...
在Spring MVC框架中,请求转发和重定向是两种常见的页面跳转方式,它们在处理用户请求和构建应用程序的流程控制中扮演着重要角色。本文将深入探讨这两种技术,并结合实际的代码示例来阐述其工作原理和使用场景。 ...
请求转发和重定向的主要区别在于: * 请求转发只能将请求转发给同一个 Web 应用中的组件,而 sendRedirect() 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到其他站点的资源。 * 请求转发过程结束后...
在Java Web开发中,转发(Forward)和重定向...理解这些区别有助于我们在实际开发中合理选择使用转发或重定向,以实现更高效和安全的Web应用。同时,了解这些基础知识也能帮助我们更好地排查和解决问题,提升编程效率。
Servlet 转发与重定向是 Java Servlet 编程中两个重要的概念,它们都可以让浏览器获得另外一个 URL 所指向的资源,但是它们的内部运行机制有着很大的区别。 RequestDispatcher.forward 方法 RequestDispatcher....
在Web开发中,请求转发(Request Forward)和重定向(Redirect)是两种常见的处理客户端请求的方式,它们在处理用户请求并展示相应页面时起到关键作用。这篇文章将深入讲解这两种技术的工作流程,以及它们在实际应用...