2011-10-11 62 views
2

我遇到了JSP/Servlet設置問題,以及瀏覽器URL中顯示的內容。 page1.jsp通過一個具有「SAVE.do」動作的表單提交給servlet。該servlet希望在保存時將成功消息傳遞迴page1.jsp。我這樣做,通過使用JSP轉發與重定向以及瀏覽器URL

request.setAttribute("message", "Save Successful"); 

放置消息中的請求,那麼我打電話

request.getRequestDispatcher("page1.jsp").forward(req,resp); 

然而,瀏覽器將顯示的http://localhost:8080/SAVE.do代替http://localhost:8080/page1.jsp

的URL當我改變轉發到使用重定向

response.sendRedirect("page1.jsp"); 

Th該屬性丟失。

我想我正在尋找正確的方法來做到這一點,以便我可以在page1.jsp再次加載時返回屬性,並在瀏覽器中顯示正確的URL。

+0

相關(不完全是一個愚蠢):http://stackoverflow.com/questions/6068891/difference-between-jsp-forward-and-redirect – BalusC

回答

8

正確的URL是瀏覽器提交的URL。請求首先由servlet處理,然後由JSP處理的事實與瀏覽器無關。順便說一下,JSP很可能位於受保護的文件夾中(如/WEB-INF),因爲瀏覽器從不直接向此JSP發送請求,而是通過調度程序servlet的URL發送請求。

重定向與前向完全不同。轉發意味着:我使用另一個服務器組件來完成對我的請求的處理。重定向意味着:我已完成處理請求,並且我會要求瀏覽器訪問另一個URL,從而提出新的請求。這個新的網址可能是完全外部的網址(例如google.com)。

在您的情況下,您可能需要應用post-redirect-get模式,以便刷新「成功」頁面不會觸發表單的重新提交。但是,如果您想顯示動態選擇的消息,則必須將其保存到會話中,並在第二個請求中檢索它。不過,如果你想正確應用MVC模式,你的第二個請求也應該通過一個servlet。

請注意,大多數MVC框架都支持後重定向獲取模式。