在Java世界中实现类似Rails的Flash消息(如“更新成功”http://api.rubyonrails.org/classes/ActionController/Flash.html)的最佳方式是什么?我正在使用Spring MVC。Java中的Rails flash消息
回答
我建议实现这个作为会话范围的HashTable,用字符串键映射到自定义FlashItem对象。 FlashItem将简单地包含您要存储的对象或字符串以及一个布尔值,可能称为IsNew,当您将新项目插入到HashTable中时,该值应该设置为true。
在每一页上加载,然后迭代HashTable,将任何IsNew = true项目设置为false,并删除IsNew已经为false的任何项目。这应该给你一个Rails的闪光灯功能的工作。
如果你还没有投入大量的工作到你的spring java应用中,你可以看看jruby的运行轨。在Rails上运行jRuby的美妙之处在于,您可以混合搭配ruby宝石和java库。
如果您已将相当数量的工作放入您的应用程序,那么这可能不是一个选项。
我刚刚在Spring MVC中做了一个会话范围 bean。
public class FlashImpl implements Flash, Serializable{
private static final long serialVersionUID = 1L;
private static final String ERROR = "error";
private static final String WARNING = "warning";
private static final String NOTICE = "notice";
private String message;
private String klass;
public void message(String klass, String message) {
this.klass = klass;
this.message = message;
}
public void notice(String message) {
this.message(NOTICE, message);
}
public void warning(String message) {
this.message(WARNING, message);
}
public void error(String message) {
this.message(ERROR, message);
}
public boolean isEmptyMessage() {
return message == null;
}
public void clear() {
this.message = null;
this.klass = null;
}
public String getMessage() {
String msg = message;
this.clear();
return msg;
}
public void setMessage(String message) {
this.message = message;
}
public String getKlass() {
return klass;
}
public void setKlass(String klass) {
this.klass = klass;
}}
诀窍是在第一次读取消息时完成消息。这样它可以在帖子后生存到重定向。
我假设将只有一种类型的消息请求!如果你不想要这个,你可以像已经建议的那样创建一个hashmap。
我在我的控制器中注入了这个bean(实际上我将它注入到所有其他控件继承的基本控制器中)。
在你的JSP你必须添加一些像这样的代码:
<c:if test="${!flash.emptyMessage}" >
<div class="${flash.klass}">${fn:escapeXml(flash.message)}</div>
</c:if>
我用马诺洛桑托斯例如与Spring MVC的如下:
注释闪存类@Component,并添加一个布尔变量来指示该消息是否应该存在多一个请求。
@Component public class Flash { private static final String INFO = "info"; private static final String SUCCESS = "success"; private static final String ERROR = "error"; private static final String WARNING = "warning"; private static final String NOTICE = "notice"; private final Map msgs = new HashMap(); private boolean isKept; // keep msg for one more request (when the controller method redirects to another) private void message(String severity, String message) { msgs.put(message, severity); } public void info(String message) { this.message(INFO, message); } public void success(String message) { this.message(SUCCESS, message); } public void notice(String message) { this.message(NOTICE, message); } public void warning(String message) { this.message(WARNING, message); } public void error(String message) { this.message(ERROR, message); } public boolean isEmptyMessage() { return msgs.isEmpty(); } public void clear() { msgs.clear(); isKept = false; } public Map getMessage() { return msgs; } public boolean isKept() { return isKept; } public void keep() { isKept = true; } public void unKeep() { isKept = false; } }
使用拦截器将Flash消息添加到模型对象。
public class FlashMessageInterceptor extends HandlerInterceptorAdapter { @Resource Flash flash; @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { if (!flash.isKept()) { modelAndView.addObject("flash", flash); } } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { if (flash.isKept()) { flash.unKeep(); } else { flash.clear(); } } }
在你的控制器中,如果你有一个重定向到另一个方法的方法,你可以说; flush.keep(),以显示Flash消息。
@Controller public class ComputerCampLove { @Resource private Flash flash; @RequestMapping(method = RequestMethod.GET) public String takeMeToAnotherPlace(Model model) { flash.info("Fa-fa-fa!"); flash.keep(); return "redirect:somewhere"; } }
这已经添加到Spring MVC的3.1.RC1:
3.1.15 Flash Attributes and RedirectAttributes
闪光属性现在可以存储在FlashMap并保存在HTTP会话生存重定向。有关Spring MVC中对flash属性的一般支持的概述,请参阅Section 16.6, “Using flash attributes”。
在带注释的控制器中,@RequestMapping方法可以通过声明RedirectAttributes类型的方法参数来添加Flash属性。此方法参数现在也可用于精确控制重定向场景中使用的属性。有关更多详细信息,请参见Section 16.3.3.10, “Specifying redirect and flash attributes”。
(JIRA问题:SPR-6464)
说真的,但那是迟到的! – momomo 2012-04-05 13:24:20
- 1. Rails flash消息
- 2. Rails 4中的Flash消息
- 3. Rails 4 Flash消息:随机消息
- 4. Rails中的flash消息在哪里?
- 5. Rails显示模型中的Flash消息
- 6. Rails 3.2.3和json中的Flash消息
- 7. 用javascript触发的Rails flash消息
- 8. Rails 3 - respond_to作为JS和flash消息
- 9. Rails页面缓存和Flash消息
- 10. 将HTML渲染为Rails flash消息
- 11. Rails禁用设计flash消息
- 12. Laravel 5.3中的Flash消息
- 13. EJS中的Flash消息
- 14. Flash消息(ajax)
- 15. BackboneJS Flash消息
- 16. 如何模拟StackOverflow在Rails中用于flash [:notice]和flash [:error]消息的顶部站点消息栏
- 17. after_create回调:flash消息
- 18. Rails 3.2.1中的Flash消息发生了什么?
- 19. 在GAE(python)中是否存在等价于Rails的“flash”消息?
- 20. Rails中的flash消息会保留到下一个网页
- 21. Rails中的Flash消息转入下一页
- 22. 在Rails中无法使用的Flash消息3.2.2
- 23. 如何在Rails中识别Flash []消息的类型
- 24. ruby 1.9.3和rails 3.2.2中的flash消息问题
- 25. 在Rails应用程序中的Flash消息错误?
- 26. 的Flash消息在局部模板(Rails 3中)
- 27. 玉的动态flash消息
- 28. 如何在Rails中仅显示一次该Flash消息?
- 29. 如何在rails 4中修改引导程序flash消息
- 30. 如何在Rails 3.2中正确使用Flash消息
不幸的是我相当致力于春天。 – wachunga 2009-04-08 02:29:57