需求是表单提交后, 转到另外一个已经存在的页面, 并在页面上方的空白处显示一条醒目的消息, 而且只显示一次 (刷新后这条消息不应该再出现).
对 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 框架呢?