前言
html ,js 可以實現頁面跳轉。
jsp , asp, PHP 也有各自頁面跳轉與重定向的方式。
下文針對js 和jsp 的頁面跳轉實現方式進行一個總結。
html 頁面跳轉方式
可以使用html 的meta 標簽實現頁面的跳轉。
[html] view plain copy
`
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
<meta http-equiv="refresh" content="0; URL=http://www.csdn.net">
<script>
</script>
</HEAD>
<BODY>
This is Test Page
</BODY>
</HTML>`
這種用法比較常使用在:
新舊系統升級的狀況下, 暫時保留舊系統,通過域名進入時自動轉到新系統中。
JS 頁面跳轉方式
- 使用window.location = "newurl"
[html] view plain copy
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Author" CONTENT="oscar999">
</HEAD>
<BODY>
This is Test Page.
<script>
window.location="http://www.csdn.net";
</script>
</BODY>
</HTML>
也可以使用 window.location.href = "http://www.csdn.net";
- 使用 window.navigate
[html] view plain copy
<script>
window.navigate("http://www.csdn.net");
</script>
- window.loction.replace方式實現頁面跳轉
<script language="JavaScript"> window.location.replace("target.aspx");</script>有3個jsp頁面(1.aspx, 2.aspx, 3.aspx),進系統默認的是1.aspx,當我進入2.aspx的時候, 2.aspx里面用window.location.replace("3.aspx");與用window.location.href ("3.aspx");從用戶界面來看是沒有什么區別的,但是當3.aspx頁面有一個"返回"按鈕,調用window.history.Go(-1); wondow.history.back();方法的時候,一點這個返回按鈕就要返回2.aspx頁面的話,區別就出來了,當用 window.location.replace("3.aspx");連到3.aspx頁面的話,3.aspx頁面中的調用 window.history.go(-1);wondow.history.back();方法是不好用的,會返回到1.aspx。
JSP跳轉方式
JSP 跳轉方式大約有三種:
-
response.sendRedirect(“newurl”);
-- 此語句前不允許有out.flush(),如果有,會有異常:Java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
--跳轉后瀏覽器地址欄變化
--如果要跳到不同主機下,跳轉后,此語句后面的語句會繼續執行,如同新開了線程,但是對response的操作已經無意義了
如果要跳到相同主機下,此語句后面的語句執行完成后才會跳轉;
2. response.setHeader("Location","newurl");
[html] view plain copy
response.setStatus(302);
response.setHeader("location","newurl");
這種使用方式要結合 setStatus(302), 302 這個狀態碼就是告訴瀏覽器要重定向了。
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉后瀏覽器地址欄變化
此語句后面的語句執行完成后才會跳轉
3. <jsp:forward page="newurl" />
此語句前不允許有out.flush(),如果有,會有異常:
跳轉后瀏覽器地址欄不變,但是只能跳到當前主機下
此語句后面的語句執行完成后才會跳轉
跳轉后得路徑變為當前路徑,圖片不是絕對路徑將無法顯示
例子:
整個簡單的例子: 兩個文件 a.jsp 和 b.jsp .
[html] view plain copy
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Before: This is a.jsp!
<%
//response.sendRedirect("b.jsp");
//response.setStatus(302);
//response.setHeader("location","b.jsp");
%>
<jsp:forward page="b.jsp"/>
After: This is a.jsp!
</body>
</html>
對于jsp 而言, 就需要嚼一嚼Redirect 和 forward 的差別了。
就字面意思而已: Redirect 翻譯成重定向, forward翻譯成轉發。
兩者的區別是:
重定向是客戶端行為,轉發是服務器行為
重定向過程:客戶瀏覽器發送http請求——》web服務器接受后發送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址——》服務器根據此請求尋找資源并發送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。轉發過程:客戶瀏覽器發送http請求——》web服務器接受此請求——》調用內部的一個方法在容器內部完成請求處理和轉發動作——》將目標資源發送給客戶;在這里,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。
類別
概念
共享數據
應用
Redirect
URL重新定向:可以是任意的URL
不能共享request里面的數據
一般用于用戶注銷登錄時返回主頁面和跳轉到其它的網站等等
Forward
頁面的轉發:只能是同一個Web應用程序的其他Web組件
轉發頁面和轉發到的頁面可以共性request里面的數據
一般用于用戶登錄的時候根據角色轉發到相應的模塊等等
有個例子說明兩者的區別很生動:
假設你去辦理某個執照重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。轉發:你先去了A局,A局看了以后,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯系了B的人,讓他們辦好后,送了過來。