对于<jsp:forward>和response.sendRedirect()这两种跳转,信心大家一定不会陌生了,<jsp:forward>属于跳转的一个指令,response.sendRedirect()是response对象里的一个跳转方法,更确切说应该一个转向。但不管怎么说,两者都能实现由一个页面跳转到另一个页面的跳转功能。 那么两者有什么区别呢?还是随便用哪一个都行呢? 我们来共同看一下:
了解区别,举个例子是最直观的,看以下的例子:
我们要做两个页面:
一个跳转页面【turn_01.jsp(用<jsp:forward>),turn_02.jsp(用response.sendRedirect())】
一个跳转之后的页面(turnAfter.html).
- turnAfter.html
- <html>
- <head>
- <title>web</title>
- </head>
- <body>
- <h1>我的技术博客:http://zhaoyuqinag.blog.51cto.com</h1>
- </body>
- </html>
- turn_01.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
- <html>
- <head>
- <title>web</title>
- </head>
- <body>
- <%
- System.out.println("====forward跳转之前=========");
- %>
- <jsp:forward page="turnAfter.html"/>
- <%
- System.out.println("====forward跳转之后=========");
- %>
- </body>
- </html>
运行一下,看浏览器的结果,的确是跳转了,但是地址栏并没有发生改变,更有趣的是看一下服务器的结果,如下图所示:
根据结果显示,只有跳转之前,而没有跳转之后。我们再来看另一种跳转方式会怎么样。
- turn_02.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="gbk" %>
- <html>
- <head>
- <title>web</title>
- </head>
- <body>
- <%
- System.out.println("====response跳转之前=========");
- %>
- <% response.sendRedirect("turnAfter.html");%>
- <%
- System.out.println("====response跳转之后 =========");
- %>
- </body>
- </html>
运行一下,看一下服务器的结果如下:
可以看到既有跳转之前的也有跳转之后的,那么问题就来了。
如果使用<jsp:forward>跳转之后,有如下特点:
1. 服务端跳转,跳转之后地址栏不改变
2.属于无条件的跳转。跳转之前的语句会执行,而跳转之后的语句将不会执行,那么如果现在在jsp中使用了JDBC的话,很明显必须子啊跳转之前进行数据库的关闭,否则数据库就再也无法关闭了。
如果使用response.sendRedirect()跳转的话,有如下特点:
1.客户端跳转,地址栏发生了改变
2.跳转是在所有语句都执行完之后才完成的操作
3.还要注意的一点就是这个跳转不可以传递request属性,也就是说不可以传递参数,request也无法取得参数值。
实际上来说,response.sendRedirect是比较常用的,它经常和后面我们学习的MVC模式 集合在一起。