Was ist der beste Weg, um Rails-ähnliche Flash-Nachrichten wie "Update erfolgreich" http://api.rubyonrails.org/classes/ActionController/Flash.html) in der Java-Welt zu erreichen? Ich benutze Spring MVC.Rails-Flash-Nachrichten in Java
Antwort
Ich würde empfehlen, dies als sitzungsweite HashTable zu implementieren, mit String-Schlüsseln Zuordnung zu benutzerdefinierten FlashItem-Objekten. Das FlashItem enthält einfach das Objekt oder die Zeichenfolge, die Sie speichern, sowie einen booleschen Wert, möglicherweise IsNew genannt, der beim Einfügen eines neuen Elements in die HashTable auf true festgelegt werden sollte.
Auf jeder Seite laden Sie dann die HashTable, setzen alle IsNew = True-Elemente auf false und löschen alle Elemente, bei denen IsNew bereits falsch ist. Das sollte dir eine Ähnlichkeit mit der Flash-Funktion von Rails geben.
Wenn Sie nicht viel Arbeit in Ihre Spring-Java-App investiert haben, können Sie sich running rails auf jruby anschauen. Die Schönheit von jRuby on Rails ist, dass Sie Ruby-Edelsteine und Java-Bibliotheken mischen und abgleichen können.
Wenn Sie bereits eine Menge Arbeit in Ihre Anwendung gesteckt haben, dann ist dies wahrscheinlich keine Option.
Ich habe genau das in Spring MVC mit einer Session-Bereich Bean gemacht.
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;
}}
Der Trick besteht darin, die Nachricht zu konsumieren, sobald sie zum ersten Mal gelesen wurde. Auf diese Weise kann es zu einer Weiterleitung nach dem Post überleben.
Ich gehe davon aus, dass es nur eine Art von Nachricht für die Anfrage geben wird !. Wenn Sie das nicht möchten, können Sie eine Hashmap erstellen, wie bereits vorgeschlagen.
Ich injiziere diese Bean in meine Controller (tatsächlich injiziere ich es in einem Basis-Controller geerbt von allen anderen).
In Ihrem JSP müssen Sie einige Code wie folgt hinzufügen: mit @Component
Beschriften Sie das Flash-
Klasse:<c:if test="${!flash.emptyMessage}" >
<div class="${flash.klass}">${fn:escapeXml(flash.message)}</div>
</c:if>
ich Manolo Santos' Beispiel mit mit Spring MVC wie folgt verwendet haben und fügen Sie eine boolesche Variable hinzu, um anzugeben, ob die Nachricht für eine weitere Anfrage bestehen soll.
@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; } }
Verwenden Sie einen Interceptor, um die Flash-Nachricht zum Modellobjekt hinzuzufügen.
In Ihrem Controller, wenn Sie eine Methode haben, die zu einer anderen Methode umleitet, könnten Sie einfach sagen; flush.keep(), um die Flash-Nachricht anzuzeigen.
@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"; } }
Dies wurde Spring MVC 3.1.RC1 hinzugefügt:
3.1.15 Flash Attributes and RedirectAttributes
Flash-Attribute können nun in einem FlashMap und in der HTTP-Sitzung gespeichert gespeichert werden, um eine Umleitung zu überleben. Einen Überblick über die allgemeine Unterstützung für Flash-Attribute in Spring MVC finden Sie unter Section 16.6, “Using flash attributes”.
In annotierten Controllern kann eine @ RequestMapping-Methode Flash-Attribute hinzufügen, indem ein Methodenargument vom Typ RedirectAttributes deklariert wird. Dieses Methodenargument kann nun auch verwendet werden, um eine genaue Kontrolle über die in einem Umleitungsszenario verwendeten Attribute zu erhalten. Weitere Informationen finden Sie unter Section 16.3.3.10, “Specifying redirect and flash attributes”.
(JIRA Ausgabe: SPR-6464)
- 1. Java-Streams in Java 7
- 2. Messzeit in Java JNI (nativer Aufruf Java)
- 3. Java: Methoden wie ord PHP in Java
- 4. Java-Funktionen in Java serialisieren 8
- 5. Convert Java Servlet in Standalone-Java-Anwendung
- 6. Java instanziiert Short-Objekt in Java
- 7. Worin liegt die Diskrepanz in Java-Versionen: Java 6 (in Terminal, Eclipse) und Java 7 (in Java Control Panel)?
- 8. Assign Operator in Java
- 9. Generisches Vererbung in Java
- 10. Übergeordnete Standardcodierung in Java
- 11. MSXML-Parser in Java
- 12. Rasterung in Java
- 13. diff Implementierung in Java
- 14. Benutzerdefinierte Konvertierungsspezifikatoren in Java
- 15. blenden (kryptologie) in java
- 16. Bouncing Ball in Java
- 17. Erzeuger Verbraucher in Java
- 18. Dateierstellungsdatum ermittelt in Java
- 19. Standard-Initialisierung in Java
- 20. Objektbaum-Navigationssprache in Java
- 21. Mehrere Müllsammler in Java
- 22. Decorator in Java
- 23. Prime Factorization in Java
- 24. Float-Nummern in Java
- 25. Monitor-Klasse in Java
- 26. Whitespaces in Java
- 27. letztes Objekt in Java
- 28. 'Reentrancy' in Java
- 29. Escaping Komma in Java
- 30. Dangling Threads in Java
Leider bin ich ganz auf Frühling verpflichtet. – wachunga