首先,sendRedirect與forward,include的最大區別是request,response..
sendRedirect產生新的請求與響應,前後已沒有聯絡.
相當於在頁面中重新輸入一個URL,只是自動完成而已.
forward,include是共用同一請求.用戶端完全不知道(瀏覽器中的URL不變)
使用方式:
servlet和jsp裡面一樣
Java代碼
- response.sendRedirect();
response.sendRedirect();
其次,forward與include的區別.
調用forward()方法時必須注意下列兩點:
在HTTP回應被“確認”(committed)以前才能調用forward()方法(這裡的“確認”是指將HTTP回應的內容主體送回使用者端),否則將拋出IllegalStateException異常。[include沒有這種情況]
調用forward()方法後,原先存放在HttpResponse對象中的內容將會自動被清除(也就是在forward方法前,使用PrintWriter,ServletOutputStream輸出的內容都被忽略)
[include不會]
使用方式
Servlet中 Java代碼
- getServletContext().getRequestDispatcher(path).include(request,response);
- getServletContext().getRequestDispatcher(path).forward(request,response);
getServletContext().getRequestDispatcher(path).include(request,response); getServletContext().getRequestDispatcher(path).forward(request,response);
這裡面的path必須以"/",相對於當前WEB應用程式根目錄 Java代碼
- request.getRequestDispatcher(path).include(request,response);
- request.getRequestDispatcher(path).forward(request,response);
request.getRequestDispatcher(path).include(request,response); request.getRequestDispatcher(path).forward(request,response);
這裡面的path可以是以"/"開頭,也可以使用相對路徑.
在JSP中 Java代碼
- <jsp:include page=""/>
- <jsp:forward page=""/>
<jsp:include page=""/> <jsp:forward page=""/>
forward在SERVLET與JSP中表現不一致:servlet中:運行forward方法,後面的語句會執行完,再去執行forward方法 (符合JAVA程式運行順序)
在jsp中,運行到forward後,直接跳轉,後面的語句不再執行.
兩者的區別:
forward方法是把請求的內容轉寄到另外的一個servlet/jsp.
include是把另一個servlet/jsp處理過後的內容拿過來與此時servlet的內容一同輸出.
----------------------------------------------------------
forward與include還有一個重要的區別:
forward在調用者程式中設定的響應狀態代碼和回應標頭不會被忽略,在被調用者程式中設定的響應狀態代碼和回應標頭也不會被忽略.
include會被忽略..
這也是亂碼的一個原因..
使用include時候,要要調用程式中寫上response.setContentType("text/html;charset=utf-8")
不管你是不是用filter統一處理過字元.
===================================================================
總結下:
sendRedirect與include,forward的區別在於是不是同一個request
include與forward的區別在於輸出內容,以及回應標頭!