在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