java resp req_java request和response区别
如何選擇:
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的區別
是:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;后者則是完全的跳轉,瀏覽器將會得到跳轉的地址,并重新發送請求鏈接。
這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用Request
Dispatcher.forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用
HttpServletResponse.sendRequest()方法。
原理:
1、 Forward
這種方式是在服務器端作 的重定向。服務器往client
發送數據的過程是這樣的:服務器在向客戶端發送數據之前,是先將數據輸出到緩沖區,然后將緩沖區中數據發送給client端。什么時候將緩沖區里的數據發
送給client端呢?(1)當對來自client的request處理完,并把所有數據輸出到緩沖區,(2)當緩沖區滿,(3)在程序中調用緩沖區的輸
出方法out.flush()或response.flushbuffer(),web
container才將緩沖區中的數據發送給client。
這種重定向方式是利用服務器端的緩沖區機制,在把緩沖區的數據發送到客戶端之前,原來的數據不發送,將執行轉向重定向頁面,發送重定向頁面的數據,重定向調用頁的數據將被清除。特別提示:在之前有很多輸出,前面的輸出已使緩沖區滿,將自動輸出到客戶端,那么這種重定向方式將不起作用。
public void doPost(HttpServletRequest request,HttpServletResponse
response) throws ServletException,IOException
{
response.setContentType(”text/html; charset=UTF-8″);
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher(”/index.jsp”);
rd.forward(request, response);
}
2、 sendRedirect
這
種方式是在客戶端作的重定向處理。該方法通過修改HTTP協議的HEADER部分(設置狀態代碼302,命令瀏覽器發重新發送請求),對瀏覽器下達重定向
指令的,讓瀏覽器對在location中指定的URL提出請求,使瀏覽器顯示重定向網頁的內容。該方法可以接受絕對的或相對的URLs。如果傳遞到該方法
的參數是一個相對的URL,那么Web container在將它發送到客戶端前會把它轉換成一個絕對的URL。public void
doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType(”text/html; charset=UTF-8″);
//response.sendRedirect(”/index.jsp”); 效果和前面forward一樣
response.sendRedirect(”http://www.sohu.com”); //跳轉到sohu
}
區別:
1、forward重定向是在容器內部實現的同一個Web應用程序的重定向,所以forward方法只能重定向到同一個Web應用程序中的一個資
源,重定向后瀏覽器地址欄URL不變,而sendRedirect方法可以重定向到任何URL,
因為這種方法是修改http頭來實現的,URL沒什么限制,重定向后瀏覽器地址欄URL改變。
2、forward重定向將原始的HTTP請求對象(request)從一個servlet實例傳遞到另一個實例,而采用sendRedirect方式兩者不是同一個application。
3、基于第二點,參數的傳遞方式不一樣。forward的form參數跟著傳遞,所以在第二個實例中可以取得HTTP請求的參數。sendRedirect只能通過鏈接傳遞參數,response.sendRedirect(“login.jsp?param1=a”)。
4、 sendRedirect能夠處理相對URL,自動把它們轉換成絕對URL,如果地址是相對的,沒有一個‘/’,那么Web
container就認為它是相對于當前的請求URI的。比如,如果為response.sendRedirect(”login.jsp”),則會從當
前servlet 的URL路徑下找login.jsp:
http://127.0.0.1:8080/test/servlet/Servlet 重定向的URL:
http://127.0.0.1:8080/test/servlet/login.jsp,如果為response.sendRedirect(”
/login.jsp”)則會從當前應用徑下查找url:http://127.0.0.1:8080/login.jsp。而forward不能這樣處
理相對路徑。
java
他們的區別是:
response.sendRedirect是向客戶瀏覽器發送頁面重定向指令,瀏覽器接收后將向web服務器重新發送頁面請求,所以執行完后瀏覽器的url顯示的是跳轉后的頁面。跳轉頁面可以是一個任意的url(本服務器的和其他服務器的均可)。
RequestDispatcher.forward
則是直接在服務器中進行處理,將處理完后的信息發送給瀏覽器進行顯示,所以完成后在url中顯示的是跳轉前的頁面。在forward的時候將上一頁面中傳
送的request和response信息一同發送給下一頁面(而response.sendRedirect不能將上一頁面的request和
response信息發送到下一頁面)。由于forward是直接在服務器中進行處理,所以forward的頁面只能是本服務器的。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java resp req_java request和response区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ECS资源监控中网络流量显示无数据怎么办
- 下一篇: java ee io_JAVAEE细细看