页面跳转有四种:jsp动作指令forward、html的超链接、重定向、response的响应跳转。
<jsp:forward>
上一个教程中有说明,请参考实现用户登陆跳转页面操作
重定向
格式:response.sendRedirect("要跳转的界面");
为了方便说明重定向和forward的不同,我们以实现用户登陆跳转页面操作中的代码为例。为了更好说明他们的不同,我们稍微更改下代码,表示当用户登陆失败的时候,跳转回login.jsp页面重新登陆。
代码如下(jsp:forward):
<body> ....... <% } else{ %> <jsp:forward page='login.jsp'/> <!-- 原代码中添加这句话,删除其他 --> <% System.out.print("hahahahahaha"); //在原代码中这里添加这句话 } %> </body>
运行login.jsp,然后我们观察地址栏:
随便输入姓名密码,再次观察:
而且我们发现,控制台没有输出打印“hahahahahaha”.
现在我们将代码更改成重定向:
<body> ....... <% } else{ response.sendRedirect("login.jsp"); System.out.print("hahahahahaha"); } %> </body>
运行login,观察地址栏,输入数据,再次观察。发现地址栏显示的都是:
并且控制台输出了:hahahahahha
我打个比方来解释一下:
Forward:就好比你是服务器,本来在check.jsp家中吃饭(执行代码),但是check.jsp叫你去login.jsp吃,于是服务器发了个请求给login,问它可以给饭吃么?login响应了,答应了,于是服务器也不管有没有吃完剩下的饭,就跑到login家了。
重定向:还是吃饭的例子,服务器在check中吃饭,服务器叫(请求)login,看看有没有这个人,login回应了一声,服务器就先吃完check中的饭然后再请求login给个饭吃,login同意了,服务器又跑过去吃饭了。
从上面可以看到:forward是一次请求,而重定向是两次请求!所以理论上forward的跳转时间是比重定向快的。而且服务器是执行到forward就不再理会原jsp代码中剩下的代码了。而重定向则不会,他很负责,不会随意丢弃程序员幸幸苦苦写的代码,做好的饭。
重定向和forward的区别:
(1)代码中的位置:<jsp:forward>放置位置需慎重,因为该jsp后面的程序都不会被执行。重定向就随便放都行~
(2)运行速度:forward比重定向快。
(3)范围:
<jsp:forward>:只能内部跳转,即只能跳到当前项目的其它jsp中。是服务端跳转。
重定向:到处都能跳,只要有这个地方。是客户端跳转。
(4)传参:
<jsp:forward>:获取request的参数
重定向:只能通过链接传递数值
(5)避jsp:include\include的坑:
由于使用jsp:forward后,服务器跳转到别家后找不到本家的负心汉特性,所以当我们想要包含页面中含有“jsp:forward”语句,此时用静态include最好,如果用jsp:inlude,会生成两个servlset。我猜想可能是服务器跑到了另一个servlet后就再也不回来了,所以我在jsp(5)中的rewrite.jsp界面的编写就遇到了这个令人无语的报错,使用jsp:include,浏览器的确是跳转了,但是跳转到了空白界面(用eclipse内置浏览器则出现报错),使用include则正常。
重定向好像也会出现这个问题,具体是不是真的我没实践。链接
重定向的传参最好结合session一起使用,如果用request.setAttribute()是传不了的,因为重定向是两次请求 !
超链接
html中的,在上一个教程中实现用户登陆跳转页面操作的check.jsp代码的else语句中有用到 :
<a href="login.jsp">点击这里</a>
如果想要实现通过超链接传递参数给welcom.jsp界面(若welcom.jsp需要收到参数name名为user的值):
可以试试在check.jsp中更改超链接代码,这样就代表了你将name值为user的值传递给了welcom.jsp:
<a href="welcom.jsp?user=<%=username%>">点击这里</a>
response响应跳转
同样在上一个教程中实现用户登陆跳转页面操作的check.jsp代码的else语句中有用到 :
response.setHeader("refresh","3;url=login.jsp");
与超链接同理,如果想要实现传递参数给welcom.jsp页面,可以这么试:
response.setHeader("refresh","3;url=welcom.jsp?user="+username);
千万要注意超链接和response中的传递参数的格式,一个是html代码,一个是java代码,取值的方式各有不同的。
如果出现中文传参乱码,请参考