都有客戶端跳轉,服務器端跳轉 客戶端跳轉之后,request屬范圍不可以在使用,url發生變換 服務器端跳轉,request屬性范圍的變量還可以使用,url不變 首先看jsp 1.客戶端跳轉用response.sendRedirect(“index.html”); 2.服務器端跳轉用
<jsp:forward> <jsp:param name="xx" value="xx"/></jsp:forward>再來看servlet跳轉 resp和req是doGet的接受參數 1.客戶端跳轉也是用resp.sendRedirect(“index.html”); 2.服務器端跳轉
RequestDispatcher rd = req.getRequestDispatcher("index.html");rd.forward(req,resp);客戶端跳轉使用的都是response對象的sendRedirect方法 服務端跳轉使用的是request對象的getRequestDispatcher的forward方法
如何記憶呢?forward是服務器內部轉發 服務器端跳轉是由客戶端發送一個請求,請求一個服務器資源——如JSP和Servlet——,這個資源又將請求轉到另一個服務器資源,然后再給客戶端發送一個響應,也就是說服務器端跳轉是客戶端發送一次請求,服務器端給出一次響應,比如說我訪問1.jsp,在這個1.jsp里面用jsp:forward跳轉2.jsp了,這就是訪問資源1.jsp,1.jsp又將請求轉到2.jsp,最后是2.jsp給用戶響應,所以是一次請求,一次響應,要注意的是從始至終,用戶是無法獲得1.jsp頁面的響應的,也就是說對用戶來說1.jsp是不存在的,他直接就被內部轉發到了2.jsp,但是url還是1.jsp
客戶端跳轉:服務器會通過response返回響應(參數、狀態等)給客戶端,然后客戶端再根據這些信息跳轉到相應的uil中,使用地址重寫傳遞參數response.sendRedirect(“URL?參數名=參數值”),比如用戶請求登錄頁面login.jsp,這時候用戶當然可以訪問到登錄頁面,所以login.jsp給了用戶的第一次響應,用戶輸入自己的登錄信息之后,跳轉到登錄頁面,登錄頁面又給用戶一次響應,所以是2次響應。 還有一次非常讓人困擾的情況,就是1.jsp里面,不需要用戶提交參數,直接寫上<%=response.sedRedirect(“index.html”)%> 那么就從1.jsp直接跳轉到index.html里面了,這樣看來,好像和前面的一樣啊,一次請求,一次響應,但是實際上,還是有2次響應的,一次是1.jsp的響應,一次是index.html的響應,只是由于這個頁面太簡單,執行的太快,你感覺不到1.jsp給你的響應,你要知道1.jsp的響應就是那個response對象,把代碼改一改,改成response.sendRedirect(“index.html?a=1”),這樣我們就設置了1.jsp的響應,而這響應就會傳給index.html
客戶端跳轉,從loging.jsp到index.html,有2個request,2個response 而服務器端跳轉,從1.jsp到2.jsp都只有一個request對象,一個response對象
總結: 1.forward跳轉: a.服務器端跳轉,地址欄不改變; b.執行到跳轉語句后馬上無條件跳轉,之后的代碼不再執行(跳轉之前一定要釋放全部資源,尤其是數據庫連接資源); c.request設置的屬性在跳轉后的頁面仍可以使用; d.使用傳遞參數。
2.response跳轉: a.客戶端跳轉,地址欄改變; b.所有代碼執行完畢后跳轉; c.跳轉后的頁面不能使用上一個頁面的request屬性; d.使用地址重寫傳遞參數(response.sendRedirect(“URL?參數名=參數值”))。
新聞熱點
疑難解答