IT民工窝棚qbq.blog.chinaunix.net
qbq
全部博文(708)
国产(1)
欧美(1)
SEO(1)
CSS3(5)
TestNG(4)
HTML5(2)
iBatis(3)
URLRewrite(1)
WebService(1)
WebServer(12)
PHP(8)
OGNL(1)
AS2(2)
Multimedia(0)
Flex AS3(29)
面试(9)
Commet(1)
Ivy(2)
Bat(8)
Maven(18)
CSS(7)
Ext(9)
Spring问题集(4)
Word(1)
JFreeChart(2)
Groovy on Grails(14)
Python(1)
Portlet(3)
amCharts(4)
CSharp.NET(3)
Tools(1)
S2Dao(8)
HSQL(9)
taglib(28)
Source Safe(3)
JSTL(6)
EL(2)
Seasar-SAStruts(3)
Prototype(0)
JQuery(3)
DWR(7)
AJAX(14)
Guice(13)
Digit(2)
Notebook(4)
Log4J(8)
Servlet(2)
JSP(4)
Eclipse(12)
VB.NET(3)
DotNet(3)
JavaScript(63)
Thinking In Soft(10)
Framework(11)
English(0)
Struts2(14)
Struts(38)
Hibernate(10)
Spring(30)
HTML(14)
Web(5)
MYSQL(9)
SQLSERVER(1)
ORACLE(2)
SQL(3)
数据库(0)
DATABASE(0)
Windows(8)
JAVA(67)
Software(1)
Hardware(3)
OpenSource(2)
Microsoft(0)
Excel(4)
DIY(5)
Linux(4)
分类: Java
2008-04-08 10:26:55
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。正文开始:先是看上去不同,他们的调用分别如下:request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jspresponse.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:forwardpage="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。总结:用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
上一篇:context-param和init-param区别及config对象应用
下一篇:JAVA IO之管道流总结大全
登录 注册