Rails用Java编写flash消息
在Java世界中,实现类似Rails的flash消息(如“更新成功” http://api.rubyonrails.org/classes/ActionController/Flash.html )的最佳方法是什么? 我正在使用Spring MVC。
我建议将其实现为会话范围的HashTable,其中字符串键映射到自定义FlashItem对象。 FlashItem将只包含您正在存储的对象或字符串以及一个布尔值(可能称为IsNew),当您将新项目插入HashTable时,该值应设置为true。
在每个页面上加载然后迭代HashTable,将任何IsNew = true项设置为false,并删除IsNew已经为false的任何项。 这应该会让你的工作与Rails的闪存function相似。
我在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; }}
诀窍是在第一次读取消息后完成消息。 这样它可以在post后存活到重定向。
我假设只有一种类型的消息可以请求! 如果您不想这样,您可以按照建议创建一个hashmap。
我在我的控制器中注入了这个bean(实际上我将它注入到所有其他人inheritance的基本控制器中)。
在JSP中,您必须添加如下代码:
${fn:escapeXml(flash.message)}
这已被添加到Spring MVC 3.1.RC1:
3.1.15 Flash属性和RedirectAttributes
Flash属性现在可以存储在FlashMap中并保存在HTTP会话中,以便在重定向后继续存在。 有关Spring MVC中flash属性的一般支持的概述,请参见第16.6节“使用flash属性” 。
在带注释的控制器中,@ RequestMapping方法可以通过声明RedirectAttributes类型的方法参数来添加flash属性。 此方法参数现在还可用于精确控制重定向方案中使用的属性。 有关更多详细信息,请参见第16.3.3.10节“指定重定向和闪存属性” 。
(JIRA问题: SPR-6464 )
我使用Manolo Santos的例子与Spring MVC如下:
使用@Component注释Flash类,并添加一个布尔变量以指示该消息是否应该再生成一个请求。
@零件 公共类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; //为另外一个请求保留msg(当控制器方法重定向到另一个时) private void message(字符串严重性,字符串消息){ msgs.put(消息,严重性); } 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(通知,消息); } public void warning(String message){ this.message(警告,消息); } public void error(String message){ this.message(错误,消息); } public boolean isEmptyMessage(){ return msgs.isEmpty(); } public void clear(){ msgs.clear(); isKept = false; } public Map getMessage(){ 返回消息; } public boolean isKept(){ return isKept; } public void keep(){ isKept = true; } public void unKeep(){ isKept = false; } }
使用拦截器将flash消息添加到模型对象。
公共类FlashMessageInterceptor扩展HandlerInterceptorAdapter { @Resource 闪光灯; @覆盖 public void postHandle(HttpServletRequest请求,HttpServletResponse响应,Object handler,ModelAndView modelAndView)抛出Exception { if(!flash.isKept()){ modelAndView.addObject(“flash”,flash); } } @覆盖 public void afterCompletion(HttpServletRequest请求,HttpServletResponse响应,对象处理程序,Exception ex)抛出Exception { if(flash.isKept()){ flash.unKeep(); } 其他{ flash.clear(); } } }
在你的控制器中,如果你有一个方法可以重定向到另一种方法你可以说; flush.keep(),显示flash消息。
@Controller 公共类ComputerCampLove { @Resource 私人闪光灯; @RequestMapping(method = RequestMethod.GET) public String takeMeToAnotherPlace(Model model){ flash.info(“发发发!”); flash.keep(); 返回“重定向:某处”; } }
如果你还没有在你的spring java应用程序中投入大量的工作,你可以看看在jruby上运行rails。 在Rails上运行jRuby的美妙之处在于你可以混合搭配ruby gems和java libs。
如果您已经在您的应用程序中投入了大量的工作,那么这可能不是一个选择。