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 框架呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章