对于<jsp:forward>和response.sendRedirect()这两种跳转,信心大家一定不会陌生了,<jsp:forward>属于跳转的一个指令,response.sendRedirect()是response对象里的一个跳转方法,更确切说应该一个转向。但不管怎么说,两者都能实现由一个页面跳转到另一个页面的跳转功能。 那么两者有什么区别呢?还是随便用哪一个都行呢? 我们来共同看一下:

了解区别,举个例子是最直观的,看以下的例子:

我们要做两个页面:

一个跳转页面【turn_01.jsp(用<jsp:forward>),turn_02.jsp(用response.sendRedirect())】

一个跳转之后的页面(turnAfter.html).

  1. turnAfter.html  
  2. <html> 
  3. <head> 
  4. <title>web</title> 
  5. </head> 
  6. <body> 
  7. <h1>我的技术博客:http://zhaoyuqinag.blog.51cto.com</h1> 
  8. </body> 
  9. </html> 
  1. turn_01.jsp  
  2. <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
  3. <html> 
  4. <head> 
  5. <title>web</title> 
  6. </head> 
  7. <body> 
  8. <%   
  9.     System.out.println("====forward跳转之前=========");  
  10. %> 
  11. <jsp:forward page="turnAfter.html"/> 
  12. <%   
  13.     System.out.println("====forward跳转之后=========");  
  14. %> 
  15. </body> 
  16. </html> 

运行一下,看浏览器的结果,的确是跳转了,但是地址栏并没有发生改变,更有趣的是看一下服务器的结果,如下图所示:

<jsp:forward>和response.sendRedirect()两种跳转的区别_跳转

根据结果显示,只有跳转之前,而没有跳转之后。我们再来看另一种跳转方式会怎么样。

  1. turn_02.jsp  
  2. <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
  3. <html> 
  4. <head> 
  5. <title>web</title> 
  6. </head> 
  7. <body> 
  8. <%   
  9.     System.out.println("====response跳转之前=========");  
  10. %> 
  11.    <% response.sendRedirect("turnAfter.html");%> 
  12. <%   
  13.     System.out.println("====response跳转之后 =========");  
  14. %> 
  15. </body> 
  16. </html> 

运行一下,看一下服务器的结果如下:

<jsp:forward>和response.sendRedirect()两种跳转的区别_跳转_02

可以看到既有跳转之前的也有跳转之后的,那么问题就来了

 


    如果使用<jsp:forward>跳转之后,有如下特点:

          1.  服务端跳转,跳转之后地址栏不改变

          2.属于无条件的跳转。跳转之前的语句会执行,而跳转之后的语句将不会执行,那么如果现在在jsp中使用了JDBC的话,很明显必须子啊跳转之前进行数据库的关闭,否则数据库就再也无法关闭了。

 


  如果使用response.sendRedirect()跳转的话,有如下特点:

         1.客户端跳转,地址栏发生了改变

        2.跳转是在所有语句都执行完之后才完成的操作

         3.还要注意的一点就是这个跳转不可以传递request属性,也就是说不可以传递参数,request也无法取得参数值。

 


实际上来说,response.sendRedirect是比较常用的,它经常和后面我们学习的MVC模式 集合在一起。