ThrowawayObject :在Java中实现Rails里的Flash Message


需求是表单提交后, 转到另外一个已经存在的页面, 并在页面上方的空白处显示一条醒目的消息, 而且只显示一次 (刷新后这条消息不应该再出现).

对 Web 开发相当不熟,  Pair说这需求类似 RoR里的 flash message, 问Java里有没有.  我们用SpringMVC + Velocity, 看了看文档, 问了问人, 短时间没有得到确定方案.

那就试一试吧, 明知几乎不可能成功, 还是写下了下面的代码:

  1. model.put("flashMessage""I'm stupid");
  2. return new ModelAndView(new RedirectView("anotherPage"),  model);

果然不行,  model无法跨Controller.  那就放在Session里?  以我有限的Web经验, 应该可以, 问题是何时把它从Session中清除?

这应该是一个概念: 你放一个东西到Session里, 但你只能获得一次, 下次它就不存在了.

用类来表示概念,  我们只需在生成对象时把自己加到Session里, 在提供的获取函数中把自己从Session中移除, 那么第二次你就得不到它了.

  1. import javax.servlet.http.HttpSession;

  2. public class ThrowawayObject {
  3.     private HttpSession session;
  4.     private String attribute;
  5.     private Object value;

  6.     public ThrowawayObject(HttpSession session, String attribute, Object value) {
  7.         this.session = session;
  8.         this.attribute = attribute;
  9.         this.value = value;
  10.         session.setAttribute(attribute, this);
  11.     }

  12.     public Object getValue() {
  13.         session.removeAttribute(attribute);
  14.         return value;
  15.     }
  16. }

在 Controller 里, 只需:

  1. new ThrowawayObject( session, "flashMessage""I'm Stupid" );


在 View 里, 这里是 velocity 模板:

  1. #if($flashMessage)
  2. <script language="javascript">
  3.     showNotificationMsg("$flashMessage.value")
  4. </script>
  5. #end

那么在 Spring MVC 中实现这类功能的标准做法是什么样的? 其它Java Web 框架呢?

阅读更多
换一批

没有更多推荐了,返回首页