2009-04-07 78 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