在web開發中,轉寄與重新導向有很大的區別。
直觀看來,轉寄不會發生URL址的變換,而重新導向則會發生URL的改變。
這僅僅只是一種表象。HttpServlet中的request對象和response對象是在使用者請求網頁時由伺服器根據瀏覽器傳過來的參數封裝產生的。一旦從瀏覽器請求過來,伺服器響應回去那麼request和response的也就到了生命的終點了。
當使用轉寄的時候,瀏覽器僅僅請求一次但是伺服器端可能經曆了多次的跳轉。伺服器端執行時發生了轉寄那麼伺服器就停止正在執行的任務,去指定轉寄給定地址的任務。
而使用重新導向的話,瀏覽器則會項伺服器發生多次請求。在伺服器端執行代碼的時候,發現發生了重新導向,那麼它就會通知瀏覽器,去訪問另一個URL。瀏覽器就會向被發送的URL請求資源。
看一段代碼:
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>login</title></head><body> <form action="myServlet" method="post"> name :<input type="text" name="username"/><br/> <input type="submit" value="submit"/> </form></body></html>
這是一段jsp代碼,當點擊提交的時候,會把表單提交給myServlet。
介面長這樣:
public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = (String)request.getParameter("username"); request.setAttribute("welcome", "welcome!!!"); RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp"); rd.forward(request,response); }}
這是MySerlet,當使用者點擊提交表單,伺服器就會調用MyServlet的doPost方法,在這個方法裡面進行的是頁面轉寄。
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>welcome</title></head><body> <%=request.getParameter("username")%> <br/> <%=request.getAttribute("welcome") %></body></html>
這是welcome.jsp的代碼。
提交結果為:
當點擊提交按鈕後後我們可以看一下網路的請求過程。
可以發現瀏覽器只向伺服器發送了一個請求。
接下來看一下重新導向。
如果把MyServlet的代碼改一下。
public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = (String)request.getParameter("username"); request.setAttribute("welcome", "welcome!!!");// RequestDispatcher rd = request.getRequestDispatcher("welcome.jsp");// rd.forward(request,response); response.sendRedirect("welcome.jsp"); }}
可以看到結果為:
而且瀏覽器項伺服器發送了兩次請求:
從上面的結果可以看出重新導向後,因為是發起的另一個請求因此welcom頁面中的內容都是null。而轉寄則由於是同一個request對象和response對象因此既能獲得瀏覽器請求的參數,還能拿到request總放入的屬性值。
其實從代碼也可以看出來,sendRedirect()方法是HttpServletResponse對象的回應程式法,既然調用了響應對象的方法,那麼就表明整個請求結束了,伺服器端項用戶端返回執行結果。而getRequestDispatcher方法是request對象的方法,表明依舊在請求因此不會立即向瀏覽器返回結果,而是繼續執行其轉寄的任務。
有一點需要說明的時,不論forward方法還是sendRedirect方法中傳的URL需要注意,如果以“\”開頭那麼,就表示這個URL是現對於servlet容器根的請求,即localhost:8080,如果沒有以“\”開頭,那麼表明這個請求地址是相對於當前的請求URL來定址的。
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>login</title></head><body> <!--這裡改成了絕對位址 --> <form action="/myServlet" method="post"> name :<input type="text" name="username"/><br/> <input type="submit" value="submit"/> </form></body></html>
當我再次點擊提交的時候:
不以”\”開頭的請求地址為:
轉寄模型為:
重新導向模型為:
本文講解了網頁的轉寄與重新導向,更多相關內容請關注php中文網。