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。

如果您已经在您的应用程序中投入了大量的工作,那么这可能不是一个选择。