当前位置 : 主页 > 编程语言 > java >

jsp(4):页面跳转之 重定向、forward、超链接、响应等待的区别与使用

来源:互联网 收集:自由互联 发布时间:2021-06-25
页面跳转有四种:jsp动作指令forward、html的超链接、重定向、response的响应跳转。 jsp:forward 上一个教程中有说明,请参考实现用户登陆跳转页面操作 重定向 格式:response.sendRedirect("要跳

页面跳转有四种: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代码,取值的方式各有不同的。


如果出现中文传参乱码,请参考

网友评论