【发布时间】:2015-12-01 08:35:52
【问题描述】:
我创建了两组 servlet:视图和控制器/处理程序
- 视图:执行简单的读取并将数据转发到JSPs
- 控制器:执行数据库更新或插入并向 JSP 或视图类型 servlet 发送通知
这里的通知是给用户的状态消息。示例:“您已成功更新等等……”
如果我在控制器中使用requestDispatcher.forward() 并且用户通过确认重新发送来刷新(在控制器通过查看/jsp 控制之后)页面,则可能会执行重复操作
如果我使用response.sendRedirect(),如果不在会话中设置这些通知,我似乎无法发送任何通知
在这方面有没有好的设计实践?任何与处理此特定场景的 java w/o 框架的 MVC 的良好链接将不胜感激。
我没有使用 Spring 或 Struts - 只是普通的旧 HTTPServlets
示例 - 控制器:
public XServlet extends HttpServlet{
public void processRequest(request, response) throws ...{
//Do some stuff here
if(success){
setUserMessage("Hooray ur profile pic is uploaded!");
} else {
setUserMessage("Oh no! We couldn't upload that file its too biG!");
}
//Send the notification
request.setAttribute("status", getUserMessage());
request.getRequestDispatcher("editProfile.jsp").forward(request, response);
}
}
这样做意味着如果用户尝试刷新页面,控件将再次传递给该控制器,并且可能会不必要地重复某些操作。
但是,如果我使用sendRedirect(),那么我无法在不使用会话属性或将其附加到 url 的情况下显示状态消息。
【问题讨论】:
-
我似乎无法发送任何通知 这是什么意思?你想达到什么目的?给出一个具体的例子用例。
-
嗨,我已经用更多细节阐明了 Q。这里的通知意味着最终用户的状态消息。
-
您回答了自己的问题。发送重定向包括告诉浏览器发送新请求。因此,在处理新请求时,存储在第一个请求属性中的所有内容都会丢失。所以你确实需要 URL 中的会话属性或参数。
-
我明白了,但现在状态存储在会话中,这意味着一旦显示我必须清除它。是否有更清洁的机制来实现这一目标?谢谢
-
MVC 框架有一些叫做“flash 属性”的东西,基本上就是你所描述的:当访问它们时,它们会从会话中删除。由于您决定不使用任何更高级别的框架,因此您还决定自己重新发明和重做这些框架实现的所有功能。
标签: jsp servlets redirect message