背景:
自己經手的一個java項目要實現帶參頁面跳轉和頁面跳轉,完成任務后,總結一下自己知道了的幾種方式。
實現:
首先我們有兩大種方式來實現頁面跳轉:1、JS(javascript);2、jsp跳轉
我們先來說一下簡單的js實現頁面跳轉:好幾種,這里簡單介紹3個
1、window.location.href="URL";
2、window.navigate("URL")
3、window.location.replace("URL")
還有一些什么self.location和parent.location什么的,自己去探索;相信對於第一種 window.location.href="URL"大家都不陌生,這里就不多做介紹。第二種window.navigate("URL")這種方式只兼容於IE瀏覽器,不支持火狐啊、谷歌什么的。這里面需要說一下的是window.location.replace(“URL”),我們舉例說明一下:
假如我們有三個界面,1.jsp;2.jsp;3.jsp,當我們設置好從1.jsp用herf跳轉到2.jsp(前提2上面用了window.location.replace(“3.jsp”),那我們會直接到界面3,貌似看上去和window.location.herf=”URL”差不多,但是當我們點擊上一步時,也就是調用window.history.go(-1); wondow.history.back();方法的時候就會知道,我們直接回到界面1了而不是界面2;
- <input type="button" value="Location" onclick="Location()"/>
- <input type="button" value="Navigate" onclick="Navigate()"/>
- <script type="text/javascript">
- function Location() {
- window.location.href = "http://localhost:2416/Test/Index";
- }
- function Navigate() {
- window.navigate("http://blog.csdn.net/liweizhong193516");
- }//只兼容與IE瀏覽器
- function Replace() {
- window.replace("http://blog.csdn.net/liweizhong193516");
- }
- </script>
Test/index界面代碼:
- <input type="button" value="Location" onclick="Location()"/>
- <script type="text/javascript">
- function Location() {
- window.location.href = "http://blog.csdn.net/liweizhong193516";
- }
- window.onload = function () {
- window.replace("http://blog.csdn.net/liweizhong193516");
- }
- </script>
拿段代碼來說,當我點擊按鈕,會跳轉到Test/index界面,但是因為執行了window.onload方法,會跳轉到我的博客界面,當我點擊返回是,跳轉到的是第一個界面,而不是Test/indes界面
下面說一下jsp實現界面跳轉,我們學過的轉發和重定向
JSP 跳轉方式大約有三種:
1、轉發:
- <span style="font-size:18px;">request.getRequestDispatcher("1.jsp").forward(request,response);</span>
在服務器組件收到用戶請求后。經過它的處理后有傳遞給了另一個組件。不修改用戶的請求碼。各組件處理完之后在返回給用戶,例如主頁面的框架。用戶請求——>服務器——>組件1——>組件2——>服務器——>用戶
這里發出的請求不變2、重定向:
- response.sendRedirect("success.jsp");
在服務器組件收到用戶請求后。經過處理修改用戶請求。在返回給用戶。這樣用戶再次使用這個請求就會被動的使用新的請求了。重定向一般是為了防止用戶提交完數據后點瀏覽器刷新或點后退之后產生重復提交) 用戶請求-----》服務器-------》組件------>服務器-------》用戶-------》新的請求
這里的請求不再是最初的請求,已經被改變了,url地址更換會很明顯注意事項: 1、此語句前不允許有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)
2、這里跳轉后,瀏覽器地址欄會發生變化,意味着url發生變化 3、要是跳到別的主機上,那語句后面的代碼會繼續執行,相當於開了一個新的線程,但是對於response就沒有意義了,因為你看不到了。3、<jsp:forward page="URL"/> 注意事項: 1、此語句前也不允許有out.flush(),如果有,會有異常: 2、跳轉后瀏覽器地址欄不變,但是只能跳到當前主機下 3、此語句后面的語句執行完成后才會跳轉 4、跳轉后得路徑變為當前路徑,圖片不是絕對路徑將無法顯示
4、在網上,還看到一個:
- response.setStatus(302);
- response.setHeader("location","newurl");
這種setHeader要結合setStatus(302)使用,302是一個狀態嗎,標注瀏覽器要進行重定向了,同時漁具鉛也不允許有out.flush(),如果有,不會報異常,只是不跳轉頁面;跳轉后地址欄發生變化總結: 通過以上的總結,重要一點的是我們必須要知道的轉發和重定向,轉發是什么:就是用戶通過瀏覽器發送了http請求,而web服務器接受此請求后調用一個內部方法完成請求處理並來一個轉發動作將目標資源發送給用戶。在這里轉發的路徑必須是在同一個web容器下的url,不能轉到其他的web路徑上去,中間傳遞是自己容器內部的requeset,所以,可以共享request;瀏覽器地址欄的url地址不會變化,我們也就感受不出來服務器做了轉發。
而重定向:是用戶通過瀏覽器發送了http請求,web服務器接受請求后發送302狀態碼響應(重定向)並且回應客戶瀏覽器一個新的location,當客戶瀏覽器發現時302響應,自動在發送一個新的http請求,請求的url就是新給的location,服務器再根據這個請求尋找相應資源並發送給用戶。這里的回應的location可以是任意的url,同時因為瀏覽器重新發送了http請求,也就不存在request傳遞的概念。這時候,客戶瀏覽器上的地址欄顯示的新的url(重定向后的路徑),用戶可以看到地址的變化。所以,重定向行為中,瀏覽器至少做出了兩次訪問請求。