先來兩張圖,方便理解:
可以看出,重定向時,是服務器向游覽器重新發送了一個response命令,讓游覽器再次向url2發送請求,以獲取url2的資源
而請求轉發時,類似於是服務器自己向自己發了一個跳轉,然后將結果直接給游覽器,這也是問什么游覽器會不改變url地址。下面是具體總結他們的區別
一、response.sendRedirect(url)-服務器將新url發送給游覽器,游覽器再根據新url請求
Request.getRequestDispatcher(url).forward(request,response);請求轉發到指定url(服務器內部跳轉url然后將結果發給游覽器)
二、response.sendRedirect(url)--客戶端跳轉
Request.getRequestDispatcher(url).forward(request,response)--服務器跳轉
三、response.sendRedirect(url)--跳轉到指定url地址后,上個頁面的請求會結束,request對象會消亡,數據會消亡。
Request.getRequestDispatcher(url).forward(request,response)--內部跳轉,request對象一直存在
四、response.sendRedirect(url)--網址會改變
Request.getRequestDispatcher(url).forward(request,response)--以游覽器角度來看,他只是發送一個request然后收到一個response,所以url不變
五、response.sendRedirect(url)--傳參數需要在url后加參數。
Request.getRequestDispatcher(url).forward(request,response)-傳參數可以操作request對象方法setAttribute(“name”,value)
六、response.sendRedirect(url)-可以定位到任意的網址
Request.getRequestDispatcher(url).forward(request,response)-只能定位到服務器資源
七、response.sendRedirect(url)--可以重定向有frame的jsp文件
Resquest.getRequestDispatcher(url).forward(request,response)-不可以重定向有frame的jsp文件,可以定向到有frame的html文件,只有在客戶端沒有輸出時才可以調用forward方法,如果當前頁面緩沖區不是空的,那么該句可能不起作用,由於這種提交不會改變url地址,刷新會重復提交。