1. 程式人生 > >jsp(4):頁面跳轉之 重定向、forward、超連結、響應等待的區別與使用

jsp(4):頁面跳轉之 重定向、forward、超連結、響應等待的區別與使用

頁面跳轉有四種: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語句中有用到 : 

<ahref="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程式碼,取值的方式各有不同的。