1. 程式人生 > >301 服務器端跳轉與客戶端跳轉

301 服務器端跳轉與客戶端跳轉

一個 cau 方法 範圍 兩個 index.jsp csdn eth patch

首先我們需要理解什麽是服務器端跳轉,什麽是客戶端的跳轉。

簡單理解所謂服務器端跳轉就是指地址欄內容不變(客戶端瀏覽器的地址欄不會顯示目標地址的URL),//註:客戶端請求到達以後,服務器發現當前資源給不出回應,要在服務器內部請求另一個資源的跳轉。所以,1.跳轉與否客戶端不知道(URL不變),2.屬於一次request

而客戶端跳轉是指地址欄內容發生改變(客戶端向服務器發請求偶,然後服務器再給客戶端一個響應,然後客戶端再根據服務器端給的響應中的URL再向服務器發送請求,所以是兩次請求,因此地址欄改變了顯示最後一次請求地址);//註:客戶端請求到達服務端,服務端返回一個 “去訪問其他鏈接” 的回應,客戶端依此回應,第二次去訪問。所以:1.客戶端根據回應地址又跳轉了一次,2.第二次跳轉後,已經出了request的屬性範圍



Java中服務器端跳轉:
1、request.getRequestDispatcher("success.jsp").forward(request,response),它是只要執行到此語句之後則立刻進行跳轉,可以傳遞request屬性;
2、<jsp:forward>,這種跳轉屬於無條件跳轉,它只能在棧內轉,而sendREdirect中則可以任意轉,甚至可以輸入baidu;//註:無條件跳轉後,此跳轉語句後邊的代碼都不會被執行(比如關閉數據庫一類的)

客戶端跳轉:
1、response.sendRedirect("fail.jsp"),所有頁面執行完之後再進行跳轉,不能傳遞request範圍的屬性,但是可以通過地址重寫的方式向跳轉頁傳遞參數,因為該方法執行完之後就相當於一次http request的結束,這是服務器會向客戶端發送302狀態碼和新的url,告訴客戶端重新發送request請求到新的url,然後客戶端照此執行,執行即新的請求響應流程開始,服務器再重新創建HttpServletRequest對象和HttpServletResponse對象,此時兩個請求已經不在一個線程了,所以request和response對象都不是開始的那個了;
2、response.setHeader("refresh","2;URL=index.jsp"),2秒後跳轉到其他頁面;
3、<a href="http://www.baidu.com">百度</a>,超鏈接;
4、表單提交;
通過以上可以得知,如果現在一個頁面中使用了JDBC,則應該在forward跳轉之前關閉數據庫鏈接,而使用respose則可以在任意的位置處關閉;

註意:
1、客戶端跳轉“/”代表服務器路徑webapps,即服務器根路徑,服務器端跳轉“/”代表站點根路徑,即應用程序根路徑;
2、盡量使用response.sendRedirect("fail.jsp")而不去使用forward,因為當服務器崩潰了,那麽sendRedirect則就會起很大的好處了。

=======================================================================================================================

附一個jsp&servlet的總結,轉自:http://www.360doc.com/content/12/0319/10/7874148_195552813.shtml

servlet 和 jsp 跳轉頁面的幾種方法

跳轉分兩部分:

一是發生在servlet,一是在JSP,其實JSP也就是servlet,不過還是有點差異滴。當然,在servlet中,一般跳轉都發生在doGet, doPost等方法裏面。

Servlet:

(1)redirect 方式
response.sendRedirect("/a.jsp");
頁面的路徑是相對路徑。
sendRedirect可以將頁面跳轉到任何頁面,不局限於本web應用中,如:response.sendRedirect(http://www.ycul.com);
跳轉後瀏覽器地址欄變化。
這種方式要傳值出去的話,只能在url中帶parameter或者放在session中,無法使用request.setAttribute來傳遞。

(2) forward方式
request.getRequestDispatcher("/a.jsp").forward(request, response);

getServletContext().getRequestDispatcher("/a.jsp").forward(request, response);
頁面的路徑是相對路徑。
forward方式只能跳轉到本web應用中的頁面上。
跳轉後瀏覽器地址欄不會變化。
使用這種方式跳轉,傳值可以使用三種方法:url中帶parameter,session,request.setAttribute

JSP

1)response.sendRedirect();
和servlet的response.sendRedirect()方式一樣。
此語句前不允許有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)....
跳轉後瀏覽器地址欄變化
如果要跳到不同主機下,跳轉後,此語句後面的語句會繼續執行,如同新開了線程,但是對response的操作已經無意義了;
如果要跳到相同主機下,此語句後面的語句執行完成後才會跳轉

2)response.setHeader("Location","");
此語句前不允許有out.flush(),如果有,頁面不會跳轉。
跳轉後瀏覽器地址欄變化
此語句後面的語句執行完成後才會跳轉.

3)<jsp:forward page="" />
此語句前不允許有out.flush(),如果有,會有異常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
跳轉後瀏覽器地址欄不變,但是只能跳到當前主機下
此語句後面的語句執行完成後才會跳轉

from :http://blog.csdn.net/null____/article/details/8070105

301 服務器端跳轉與客戶端跳轉