請求轉發:
請求轉發,即request.getRequestDispatcher().forward(),是一種服務器的行為,客戶端只有一次請求,服務器端轉發后會將請求對象保存,地址欄中的URL地址不會改變,得到響應后服務器端再將響應發給客戶端;
請求重定向:
請求重定向,即response.sendRedirect(),是一種客戶端行文,從本質上講等同于兩次請求,前一次請求對象不會保存,地址欄的URL地址會改變。
用生活中一個常見的例子來說明兩者之間的區別,某人要去辦理護照:
轉發:某人去了甲局,甲局看了之后,直到護照應該由乙局來管,但甲局的工作人員并沒有趕走某人,而是讓某人等著,自己在辦公室后面聯系了乙局的工作人員,乙局護照辦好后送到了甲局,然后甲局的工作人員將護照交給了某人;
重定向:某人去了甲局后,甲局的工作人員說護照不歸他們關,應該去乙局。然后某人自己去了乙局,辦了護照。
這里寫一個例子演示兩者的不同。新建一個web項目,創建三個頁面:reg.jsp、response.jsp、request.jsp。
reg.jsp代碼如下:
<body><h1>你好</h1><hr><form name="regForm" action="response.jsp" method="post"><table><tr><td>用戶名:</td><td><input type="text" name="username"/></td></tr><tr><td colspan="2"><input type="submit" value="提交"/></td></tr></table></form></body>
這里輸入用戶名,然后交給response.jsp處理。頁面如下:
response.jsp代碼如下:
<%response.setContentType("text/html;charset=utf-8");out.println("<h1>response內置對象</h1>");out.println("<hr>");response.sendRedirect("request.jsp");//request.getRequestDispatcher("request.jsp").forward(request, response);
%>
首先,使用重定向交給request.jsp來處理。
response.jsp代碼如下:
<body><h1>request對象</h1><hr>你是誰?<%=request.getParameter("username") %></body>
這里僅僅獲得用戶名進行輸出。
使用重定向時,結果如下:
可以看到,輸入的用戶名沒有顯示出來,這是因為重定向本質上相當于兩次請求,而前一次請求不保存,所以沒能得到用戶名。同時,可以看到地址欄中的URL地址由response.jsp變為了request.jsp。
第二次,修改response.jsp的代碼如下:
<%response.setContentType("text/html;charset=utf-8");out.println("<h1>response內置對象</h1>");out.println("<hr>");//response.sendRedirect("request.jsp");request.getRequestDispatcher("request.jsp").forward(request, response);
%>
使用轉發,將請求轉發給request.jsp來處理,結果如下:
可以看到,頁面得到了請求中的用戶名并進行顯示,這是由于轉發時客戶端只有一次請求,服務器會保存這次請求,等到轉發返回時將結果返回給客戶端。同時,頁面顯示的是request.jsp的內容,但地址欄中的URL地址并沒有變化。
這就是請求轉發與請求重定向的區別。