一、請求的兩種操作方式
在進行servlet+jsp簡單功能構建的時候發現在訪問jsp頁面時遇到這兩種操作方式:
1、req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);
2、resp.sendRedirect("jsp/index.jsp");
這兩種方式瀏覽器在請求該servlet的時候都可以訪問到jsp頁面,但是他們的區別貌似這么長時間沒有接觸到servlet比較基礎的東西有些模糊了,通過網上搜索查看一些資料進行重新了解了一下。
req.getRequestDispatcher("jsp/index.jsp").forward(req, resp)方法叫做轉發(服務器行為由servlet直接將資源返回瀏覽器完成的),而resp.sendRedirect("jsp/index.jsp")方法叫做重定向(瀏覽器行為,由瀏覽器重新定位訪問對應資源的方式)
二、轉發與重定向的具體操作時序圖:
1、轉發:req.getRequestDispatcher("jsp/index.jsp").forward(req, resp),通過servlet的request內部請求訪問轉發的資源,由服務器進行操作,客戶端(瀏覽器)對服務器內部的轉發不感知。
時序圖:
操作演示:瀏覽器訪問通過轉發的方式響應時,瀏覽器的地址欄不會變更。
2、重定向:resp.sendRedirect("jsp/index.jsp"),通過response直接將資源路徑返回給瀏覽器,由瀏覽器重新發起對服務器的請求(這里資源路徑也可以是其他web站點的資源),也就是瀏覽器會對服務器進行兩次請求。
操作演示:進行重定向訪問時瀏覽器的地址欄的url會發生變化,變為第二次請求訪問的資源url
三、轉發與重定向關於路徑的試探
1、轉發url相對路徑與絕對路徑的訪問結果:絕對路徑與相對路徑對服務器轉發來說無影響。(?)
使用相對路徑req.getRequestDispatcher("jsp/index.jsp").forward(req, resp);
使用絕對路徑req.getRequestDispatcher("/jsp/index.jsp").forward(req, resp);
2、重定向url相對路徑與絕對路徑的訪問結果:相對路徑訪問時以web站點項目路徑為前綴返回瀏覽器的,絕對路徑訪問時以web站點路徑為前綴訪問路徑的。
使用相對路徑resp.sendRedirect("jsp/index.jsp");
使用絕對路徑resp.sendRedirect("/jsp/index.jsp");
四、轉發與重定向的特性總結:
通過時序圖可以比較出兩者的不同:
1、重定向時瀏覽器會發起兩次請求;轉發時瀏覽器只進行了一次請求。
2、重定向因為是兩次請求所以第一次的request與第二次請求的request是不一樣的,數據不可傳遞;轉發因為是servlet的行為,是服務器內部把對一個request/response的處理權,移交給另外一個處理程序,數據是可傳遞的。
3、重定向時servlet將資源url發送給客戶端,由客戶端進行重新請求,那么這個url可以是任意的資源請求url;轉發因為時servlet的服務器端操作的行為,所以只能轉發服務器的該web內站點資源url。