前言
html ,js 可以實現(xiàn)頁面跳轉(zhuǎn)。
jsp , asp, PHP 也有各自頁面跳轉(zhuǎn)與重定向的方式。
下文針對js 和jsp 的頁面跳轉(zhuǎn)實現(xiàn)方式進行一個總結(jié)。
html 頁面跳轉(zhuǎn)方式
可以使用html 的meta 標簽實現(xiàn)頁面的跳轉(zhuǎn)。
[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>`
這種用法比較常使用在:
新舊系統(tǒng)升級的狀況下, 暫時保留舊系統(tǒng),通過域名進入時自動轉(zhuǎn)到新系統(tǒng)中。
JS 頁面跳轉(zhuǎn)方式
- 使用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方式實現(xiàn)頁面跳轉(zhuǎn)
<script language="JavaScript"> window.location.replace("target.aspx");</script>有3個jsp頁面(1.aspx, 2.aspx, 3.aspx),進系統(tǒng)默認的是1.aspx,當(dāng)我進入2.aspx的時候, 2.aspx里面用window.location.replace("3.aspx");與用window.location.href ("3.aspx");從用戶界面來看是沒有什么區(qū)別的,但是當(dāng)3.aspx頁面有一個"返回"按鈕,調(diào)用window.history.Go(-1); wondow.history.back();方法的時候,一點這個返回按鈕就要返回2.aspx頁面的話,區(qū)別就出來了,當(dāng)用 window.location.replace("3.aspx");連到3.aspx頁面的話,3.aspx頁面中的調(diào)用 window.history.go(-1);wondow.history.back();方法是不好用的,會返回到1.aspx。
JSP跳轉(zhuǎn)方式
JSP 跳轉(zhuǎn)方式大約有三種:
-
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)
--跳轉(zhuǎn)后瀏覽器地址欄變化
--如果要跳到不同主機下,跳轉(zhuǎn)后,此語句后面的語句會繼續(xù)執(zhí)行,如同新開了線程,但是對response的操作已經(jīng)無意義了
如果要跳到相同主機下,此語句后面的語句執(zhí)行完成后才會跳轉(zhuǎn);
2. response.setHeader("Location","newurl");
[html] view plain copy
response.setStatus(302);
response.setHeader("location","newurl");
這種使用方式要結(jié)合 setStatus(302), 302 這個狀態(tài)碼就是告訴瀏覽器要重定向了。
此語句前不允許有out.flush(),如果有,頁面不會跳轉(zhuǎn)。
跳轉(zhuǎn)后瀏覽器地址欄變化
此語句后面的語句執(zhí)行完成后才會跳轉(zhuǎn)
3. <jsp:forward page="newurl" />
此語句前不允許有out.flush(),如果有,會有異常:
跳轉(zhuǎn)后瀏覽器地址欄不變,但是只能跳到當(dāng)前主機下
此語句后面的語句執(zhí)行完成后才會跳轉(zhuǎn)
跳轉(zhuǎn)后得路徑變?yōu)楫?dāng)前路徑,圖片不是絕對路徑將無法顯示
例子:
整個簡單的例子: 兩個文件 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翻譯成轉(zhuǎn)發(fā)。
兩者的區(qū)別是:
重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器行為
重定向過程:客戶瀏覽器發(fā)送http請求——》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對應(yīng)新的location給客戶瀏覽器——》客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),則自動再發(fā)送一個新的http請求,請求url是新的location地址——》服務(wù)器根據(jù)此請求尋找資源并發(fā)送給客戶。在這里location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。轉(zhuǎn)發(fā)過程:客戶瀏覽器發(fā)送http請求——》web服務(wù)器接受此請求——》調(diào)用內(nèi)部的一個方法在容器內(nèi)部完成請求處理和轉(zhuǎn)發(fā)動作——》將目標資源發(fā)送給客戶;在這里,轉(zhuǎn)發(fā)的路徑必須是同一個web容器下的url,其不能轉(zhuǎn)向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務(wù)器做了轉(zhuǎn)發(fā)的。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問請求。
類別
概念
共享數(shù)據(jù)
應(yīng)用
Redirect
URL重新定向:可以是任意的URL
不能共享request里面的數(shù)據(jù)
一般用于用戶注銷登錄時返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等等
Forward
頁面的轉(zhuǎn)發(fā):只能是同一個Web應(yīng)用程序的其他Web組件
轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共性request里面的數(shù)據(jù)
一般用于用戶登錄的時候根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊等等
有個例子說明兩者的區(qū)別很生動:
假設(shè)你去辦理某個執(zhí)照重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然后,你就從A退了出來,自己乘車去了B局。轉(zhuǎn)發(fā):你先去了A局,A局看了以后,知道這個事情其實應(yīng)該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到后面辦公室聯(lián)系了B的人,讓他們辦好后,送了過來。
