2009-04-07 7 views

Antwort

5

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.

0

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.

+3

Leider bin ich ganz auf Frühling verpflichtet. – wachunga

6

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> 
2

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"; 
    } 
} 
4

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)

+0

Ernsthaft, aber das ist viel zu spät! – momomo

+0

Ausgezeichnet! Dies löste meine hier beschriebenen Probleme: http://stackoverflow.com/questions/11216550/how-should-i-send-resourcebundle-messages-across-controllers-in-spring-mvc – Tommy