2009-04-07 46 views

回答

5

我建议实现这个作为会话范围的HashTable,用字符串键映射到自定义FlashItem对象。 FlashItem将简单地包含您要存储的对象或字符串以及一个布尔值,可能称为IsNew,当您将新项目插入到HashTable中时,该值应该设置为true。

在每一页上加载,然后迭代HashTable,将任何IsNew = true项目设置为false,并删除IsNew已经为false的任何项目。这应该给你一个Rails的闪光灯功能的工作。

0

如果你还没有投入大量的工作到你的spring java应用中,你可以看看jruby的运行轨。在Rails上运行jRuby的美妙之处在于,您可以混合搭配ruby宝石和java库。

如果您已将相当数量的工作放入您的应用程序,那么这可能不是一个选项。

+3

不幸的是我相当致力于春天。 – wachunga 2009-04-08 02:29:57

6

我刚刚在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> 
2

我用马诺洛桑托斯例如与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"; 
    } 
} 
4

这已经添加到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

+0

说真的,但那是迟到的! – momomo 2012-04-05 13:24:20