2010-09-10 44 views
2

所有的在線參考和頭第一個JSP & Servlet的書我讀狀態RequestDispatcher的和重定向的特性(即resoponse.sendRedirect()),如:混淆的RequestDispatcher說瀏覽器地址欄並沒有改變

「請求分派器」 - 瀏覽器欄中的URL不會更改。

「重定向」 - 用戶在瀏覽器中看到新的URL。

但根據我的測試,對於RequestDispatcher,我看到URL的更改,所以我不明白它們的真正含義。

與下面的代碼,

  1. 我在http://whatever.com/tmp3.jsp這就是URL在瀏覽器中說。

  2. 點擊按鈕來調用servlet的作爲回報它的數據轉發到服務器,然後服務器發送響應返回給瀏覽器,所以URL在瀏覽器現在說http://whatever.com/register

所以..網址變了! (從.../tmp3.jsp到.../register)

任何人都可以向我解釋他們的意思是「瀏覽器中的URL不會改變」嗎?

實施例:

(tmp3.jsp)

<html> 
<head> 
</head> 
<body> 
    ${message} 
    <!-- click button to send request to servlet --> 
    <form method="POST" action="register"> 
     <input type="submit" value="click!"> 
    </form> 
</body> 
</html> 

(servlet的)

package com.masatosan.tmp; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class Tmp extends HttpServlet { 


    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     request.setAttribute("message", "processed!"); 

     String address = "/tmp3.jsp"; 
     request.getRequestDispatcher(address).forward(request, response); 
    }//end doPost() 

}//end class 

(web.xml中片段) - 映射servlet和URL

<servlet> 
    <servlet-name>test</servlet-name> 
    <servlet-class>com.masatosan.tmp.Tmp</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/register</url-pattern> 
</servlet-mapping> 
+0

我會把JSP放在'/ WEB-INF'文件夾中,並且一直使用'/ register'。 – BalusC 2010-09-10 11:27:51

+0

@BalusC:在/ WEB-INF下放置jsp文件的原因是什麼?我認爲/ WEB-INF包含類和庫,jsp文件轉到webapps/webContent/foo.jsp之類的東西? – 2010-09-10 11:32:17

+1

隱藏JSP直接訪問。這樣你最終得到更好的URL。您已經在GET請求上向JSP文件發送請求。那麼,爲什麼不直接使用servlet作爲控制器呢?另請參閱[「JSP/Servlet的隱藏功能」](http://stackoverflow.com/questions/2523430/hidden-features-of-jsp-servlet/2525995#2525995)。更多有用的信息和鏈接可以在[Servlets標籤信息頁面](http://stackoverflow.com/tags/servlets/info)中找到。 – BalusC 2010-09-10 11:37:43

回答

5

兩件事情發生在這裏:

  • 首先你提交表單到Servlet,這總是改變URL
  • 那麼你選擇重定向或轉發到一個視圖 - 即另一(或同一)JSP

對於第二個步驟:

  • 重定向發送一個特殊的報頭添加到瀏覽器,它使一個新的請求向其中重定向頁面要點
  • 轉發在相同的請求內部進行此操作,並且瀏覽器不會理解它不是它請求的資源

在您的示例中,由於您使用forward,因此URL保留爲/register。如果你使用redirect,它會先更改爲/register,然後將它變回tmp.jsp

+0

謝謝!在閱讀了5次這樣的答案之後,我終於明白了... – 2010-09-10 11:29:08

+1

@ masato-san,您可能會發現在這樣的交流中觀看由瀏覽器和服務器發送的HTTP頭是有用的。 – 2010-09-10 11:51:20

+0

@matt b:這實際上是偉大的一點,因爲我有螢火蟲。 – 2010-09-10 12:09:20

0

地址並沒有改變,從.../registertmp3.jsp,而響應來自後者。通過Redirect,您將在瀏覽器URL欄中看到.../tmp3.jsp