需求是表單提交后, 轉到另外一個已經存在的頁面, 并在頁面上方的空白處顯示一條醒目的消息, 而且只顯示一次 (刷新后這條消息不應該再出現).
對 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 框架呢?