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