1. 程式人生 > >客戶端跳轉與伺服器端跳轉的區別

客戶端跳轉與伺服器端跳轉的區別

客戶端跳轉時用HttPservletResopse物件的sendRedirect函式實現,伺服器端跳轉是使用RequestDispather物件的forward方法實現的。這兩者之間的區別主要體現在三個方面:

1. 使用伺服器端跳轉時,客戶瀏覽器的位址列並不會顯示目標地址的URL,而是用客戶端跳轉時,位址列當中會顯示目標資源的URL;

2. 伺服器端跳轉是由客戶端傳送一個請求,請求一個伺服器資源——如JSP和Servlet——,這個資源又將請求轉到另一個伺服器資源,然後再給客戶端傳送一個響應,也就是說伺服器端跳轉是客戶端傳送一次請求,伺服器端給出一次響應;而客戶端跳轉的流程則不同。客戶端同樣是傳送一個請求給伺服器端資源,這個伺服器資源會首先給客戶端一個響應,客戶端再根據這個響應當中所包含的地址,再次向伺服器端傳送一個請求,也就是說客戶端跳轉是兩次請求,兩次響應;

3. 在進行客戶端跳轉和伺服器端跳轉時,都需要指定目標資源的URL,如果這個路徑以“”開始。在客戶端跳轉當中“”代表的是應用伺服器根目錄,而在伺服器端跳轉當中代表的是應用程式根目錄。

page = 頁面級別

request = 請求級別(與伺服器端跳轉配合使用)

session = 會話級別(客戶端跳轉(伺服器端跳轉也可,但是客戶端跳轉更加突出了session的作用範圍))

application = 應用級別

客戶端跳轉:伺服器端將請求結果返回給客戶端,客戶端向伺服器發出另一次請求。在客戶端跳轉過程中是兩次不同的請求。在位址列中顯示的是最後一次請求地址。

客戶端跳轉可以進行站外跳轉。

1、連結跳轉:<a href=””></a>

2、表單提交

3、Response.sendRedirect(“3.jsp”);

4、<mata http-equiv=”refresh”, content=”3;2.jsp”/>

5、response.setHeader(“refresh”,” 3;2.jsp”);

6、客戶端跳轉“/”代表伺服器跟路徑webapps

伺服器端跳轉(容器內跳轉):能夠自動的在伺服器內部進行跳轉,這種跳轉對使用者來說是透明的。兩次跳轉時同一個request,在位址列中顯示的事第一次頁面地址。

只能進行站點內跳轉。

1、<jsp:forward page=””/>

2、pageContext.forward();

3、 request.getRequestDispatcher("1.jsp").forward(request,response);

3、伺服器端跳轉“/”代表站點根路徑

response.sendRedirect 的功能是地址重定向(頁面跳轉)

1.response.sendredirect(url);    

新的頁面並不能處理舊頁面的pagecontext(request,response,...)物件,所以你用request.getparameter(ff)企圖呼叫原頁面     request物件的引數,得到的自然是null        

2.getservletcontext().getrequestdispatcher(url).forward(request,response);  

      forward函式已經把原頁面的request,response物件傳入新的頁面,因此這新舊頁面擁有相同的     request,response物件。request.getparameter(ff)就可以得到相應的值        

3.servletcontext.getrequestdispatcher   路徑必須是相對上下文的絕對路徑                 servletrequest.getrequestdispatcher   可以是相對也可以是絕對            

 伺服器端進行轉向的4種方法:    

     1.   servletcontext 的 getrequestdispatcher()    

     2.   servletcontext 的 getnameddispatcher()    

     3.   servletrequest 的 getrequestdispatcher()    

     4.   servletresponse 的 sendredirect()進行轉向。    

1.2.3   =>   forward()                     4.   sendredirect()            

 使用forward方法,因為這些這樣比較高效。只有在forward方法不能使用時,再使用servletresponse的sendredirect()方法。        

 <jsp:fordward>與   sendredirect   方法的比較    

 雖然   <jsp:fordward>與   sendredirect   方法,都可以將瀏覽器瀏覽的網頁,重導至另一個網頁,但是兩者在原理上是不太相同。    

a. <jsp:fordward>   :   動作是利用伺服端,將資料輸出至緩衝區的機制,在前一個網頁尚未輸出到客戶端前,取消資料的輸出,然後輸出另一個網頁的資料,達到重導瀏覽器的效果。     優點:   兩網頁間可以分享   request   物件內的變數。    

b. sendredirect   :   動作是透過   http   協議的   header   ,   對瀏覽器下達重導指令,因此,不牽涉到伺服器端緩衝區的問題。     不過由於   sendredirect   方法作用於客戶端,所以重導前後網頁無法分享存在於   request   物件內的變數。     solution:   response.sendredirect(“sendredirect.htm?name=sparkwu&[email protected]”)       

         直觀一點:                     response.sendredirect(url);                       對伺服器的響應進行重定向。當server作出響應後,client客戶端的請求的生存週期就終止了。這個時候再用request.getparameter()或request.getattribute()得到的只能是null。                         getservletcontext().getrequestdispatcher(url).forward(request,response);                     它則可以認為是對client的請求(request)   進行傳遞,在server沒有進行響應前,即沒有response一直可以進行傳遞--重定向。網友:alexlovejava 前者是的跳轉是的客戶端,後者是在伺服器端,後者在跳轉的時候可以傳request物件,前者只能通過?穿引數,後者是forword(),這兩者在流轉的時候url的路徑不一樣,在ie位址列顯示的路徑也不一樣,