1. 程式人生 > >幾種方式實現Javaweb頁面跳轉

幾種方式實現Javaweb頁面跳轉

背景:
       自己經手的一個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(重定向後的路徑),使用者可以看到地址的變化。所以,重定向行為中,瀏覽器至少做出了兩次訪問請求。