需求是表單提交後, 轉到另外一個已經存在的頁面, 並在頁面上方的空白處顯示一條醒目的消息, 而且只顯示一次 (刷新後這條消息不應該再出現).
對 Web 開發相當不熟, Pair說這需求類似 RoR裏的 flash message, 問Java裏有沒有. 我們用SpringMVC + Velocity, 看了看文檔, 問了問人, 短時間沒有得到確定方案.
那就試一試吧, 明知幾乎不可能成功, 還是寫下了下面的代碼:
- model.put("flashMessage", "I'm stupid");
- return new ModelAndView(new RedirectView("anotherPage"), model);
果然不行, model無法跨Controller. 那就放在Session裏? 以我有限的Web經驗, 應該可以, 問題是何時把它從Session中清除?
這應該是一個概念: 你放一個東西到Session裏, 但你只能獲得一次, 下次它就不存在了.
用類來表示概念, 我們只需在生成對象時把自己加到Session裏, 在提供的獲取函數中把自己從Session中移除, 那麼第二次你就得不到它了.
- import javax.servlet.http.HttpSession;
- public class ThrowawayObject {
- private HttpSession session;
- private String attribute;
- private Object value;
- public ThrowawayObject(HttpSession session, String attribute, Object value) {
- this.session = session;
- this.attribute = attribute;
- this.value = value;
- session.setAttribute(attribute, this);
- }
- public Object getValue() {
- session.removeAttribute(attribute);
- return value;
- }
- }
在 Controller 裏, 只需:
- new ThrowawayObject( session, "flashMessage", "I'm Stupid" );
在 View 裏, 這裏是 velocity 模板:
- #if($flashMessage)
- <script language="javascript">
- showNotificationMsg("$flashMessage.value")
- </script>
- #end
那麼在 Spring MVC 中實現這類功能的標準做法是什麼樣的? 其它Java Web 框架呢?