一般來說:
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
