java中的服務端跳轉與客戶端跳轉區別與聯系


一般來說:
1.
resquest.getRequestDispatcher(String path).forward(request,response);這個是內部跳轉,也就是說請求帶上參數(上一個頁面帶過來的參數)

2.
response.sendRedirect(String location); 這個是外部跳轉,也叫重定向。請求不帶參數,重新連接一個url 

forward是服務器內部轉發
標准流程如下:
    1.客戶端瀏覽器發送HTTP request到服務器
    2.服務器在接收到客戶端request之后,分別創建出HttpServletRequest對象和HttpServletResponse對象,然后調用所請求的servlet的 service方法,同時將HttpServletRequest對象和HttpServletResponse對象傳遞過去.
    3.當servlet,調用forward方法時,服務器根據forward轉發的url找到對應的servlet,(如果forward jsp,則調用的是web container為jsp生成的java bean)
    服務器轉發全程是沒有客戶端參與的,都在web container容器內部進行,沒有任何服務器和客戶端的通信,實際就是服務器內部的跳轉
    4.注意這里,與1.的調用servlet不同:
     這次forward, 服務器沒有構建HttpServletRequest對象和HttpServletResponse對象
     而是將原來的HttpServletRequest對象和HttpServletResponse對象傳遞給jsp過去


 sendRedirect是客戶端轉發
 1.當sendRedirect方法被執行,同時也意味着一次http request請求的結束
   此時,服務器會向客戶端發送302狀態碼和新的url,告訴客戶端重新發送request請求到新的url
HTTP/1.1 302 Found
Location: http://localhost:9080/AppIndex.jsp
Content-Language: zh-CN
Content-Length: 0
Set-Cookie: JSESSIONID=00003FhtMbQNx1naY0MZ05XJeMz:-1; Path=/
Date: Wed, 29 Aug 2007 16:37:31 GMT
Server: WebSphere Application Server/6.1
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"

 2.當客戶端根據302狀態碼發送新的請求到到新的url的時候,新的請求-響應流程重新開始
 4.這時候服務器重新創建HttpServletRequest對象和HttpServletResponse對象
 5.此時兩個請求已經不在一個線程了,更不用說request和response對象了
所以此時在如果想把數據傳遞到新的servlet或新的jsp的request內,那么只能使用url?值/對的方式

 

客戶端跳轉時用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、服務器端跳轉“/”代表站點根路徑

轉載:http://blog.csdn.net/trialwalker/article/details/6958531


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM