重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览仆饭得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。 转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。 重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。 正文开始:先是看上去不同,他们的调用分别如下: request.getRequestDispatcher("apage.jsp").forward(request response);//转发到apage.jsp response.sendRedirect("apage.jsp");//重定向到apage.jsp 在jsp页面中你也会看到通过下面的方式实现转发: 提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:在页面a.jsp中有一个链接这是指向b的一个链接,而且还带了一个参数。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做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中再增加一个链接:这是指向c的一个链接,而且还带了一个参数当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码: a.jsp 指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了 b.jsp requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23 c.jsp d.jsp requestB-C的魔爪已经伸到了d.jsp页面 运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
jsp实现页面的重定向,使用的是response.sendRedirect("a.jsp");实现页面重定向到a.jsp这个页面。
分为两种写法:
1、如果实在jsp页面中写代码的话,将response.sendRedirect("a.jsp");放在<%%>里面就行了,即:<%response.sendRedirect("a.jsp");%>
2、如果是在java文件(如servlet)中写代码的话,只需写response.sendRedirect("a.jsp");就行了。
接下来简单说说页面的转发(forward)与重定向(sendRedirect)的区别:
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。