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中吃飯,伺服器叫(請求)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程式碼,取值的方式各有不同的。