2011-10-11 60 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框架都支持后重定向获取模式。