三者在servlet中的最大區別是:
Include和Forward:將當前請求轉到另外一個JSP或者servlet處理。
sendRedirct:將當前請求返回到瀏覽器,帶上要redirect的URL,瀏覽器重新發一個新的請求到新的URL。
include和forward的區別:
include 是去而復返,forward 是前不見古人,後不見來者。
include 是把別人包含進來,forward 是丟掉了自己。
include是把另一個servlet/jsp處理過後的內容拿過來與本身的servlet的內容一同輸出.
原始servlet輸出的內容+被include進來的servlet的輸出內容+原始servlet輸出的內容。
forward方法是把請求的內容轉發到另外的一個servlet/jsp。在forward之前,在原始的servlet中不能對輸出做flush。
最終只有被被forward去的servlet的內容被輸出。
在原始servlet中設置的響應狀態碼和響應頭會被include的servlet忽略。include的servlet在處理的時候只會保留進入include的servlet之後的狀態碼和響應頭。
對於forward,在兩個地方設置的狀態碼和響應頭都會被用到。
include亂碼的一個原因可能就是沒有在被include的servlet設置response.setContentType("text/html;charset=utf-8")。
不管是Include,Forward,還是sendRedirct,在該行代碼之後的語句仍然被執行,只是輸出到response的內容沒有作用。
如:before和after仍然被打印到控制檯。
System.out.println("before");
//include,forward,sendredirect語句
System.out.println("after");
forward在jsp和servlet中會有不同:如下after不會被打印到控制檯。
<%System.out.println("before"); %>
<jsp:forward page="t.dest"/>
<%System.out.println("after"); %>
使用:
sendRedirect:response.sendRedirect("path"); servlet和jsp裏面一樣。
include和forward:
getServletContext().getRequestDispatcher(path).include(request,response);
getServletContext().getRequestDispatcher(path).forward(request,response);
這裏面的path必須以"/",相對於當前WEB應用程序根目錄。
request.getRequestDispatcher(path).include(request,response);
request.getRequestDispatcher(path).forward(request,response);
這裏面的path可以是以"/"開頭,也可以使用相對路徑。
在JSP中
<jsp:include page=""/>
<jsp:forward page=""/>
總結:
sendRedirect與include,forward的區別在於是不是同一個request,sendRedirect會有兩次交互。
include與forward的區別在於輸出內容(nclude包含兩者,forward只有forward一個),以及響應頭!
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kkdelta/archive/2009/04/27/4129458.aspx