在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中文網。
相關推薦:
#以上是網頁的轉寄與重新導向的詳細內容。更多資訊請關注PHP中文網其他相關文章!