2009-04-07 5 views

Répondre

5

Je recommanderais de l'implémenter en tant que HashTable à l'échelle de la session, avec des clés de chaîne correspondant aux objets FlashItem personnalisés. FlashItem contient simplement l'objet ou la chaîne que vous stockez, plus une valeur booléenne, éventuellement appelée IsNew, qui doit être définie sur true lorsque vous insérez un nouvel élément dans HashTable.

Sur chaque chargement de page, vous devez ensuite itérer le HashTable, définir tous les éléments IsNew = true sur false et supprimer tous les éléments dont IsNew est déjà false. Cela devrait vous donner un travail similaire à la fonction flash de Rails.

0

Si vous n'avez pas investi énormément de travail dans votre application Spring Java, vous pouvez consulter les rails de course sur jruby. La beauté de l'exécution de jRuby on Rails est que vous pouvez mélanger et assortir les gemmes ruby ​​et les librairies java.

Si vous avez déjà mis beaucoup de travail dans votre application, alors ce n'est probablement pas une option.

+3

Malheureusement, je suis tout à fait engagé au printemps. – wachunga

6

Je l'ai fait juste dans Spring MVC avec une session portée.

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

L'astuce consiste à consommer le message une fois qu'il a été lu pour la première fois. De cette façon, il peut survivre à une redirection après la publication.

Je suppose qu'il y aura seulement un type de message pour la demande!. Si vous ne le souhaitez pas, vous pouvez créer un hashmap comme déjà suggéré.

J'injecte ce bean dans mes contrôleurs (en fait je l'injecte dans un contrôleur de base hérité par tous les autres).

Dans votre JSP, vous devez ajouter un code comme ceci:

<c:if test="${!flash.emptyMessage}" > 
    <div class="${flash.klass}">${fn:escapeXml(flash.message)}</div> 
</c:if> 
2

Je l'ai utilisé l'exemple de Manolo Santos avec avec Spring MVC comme suit:

Annoter la classe Flash avec @component, et ajoutez une variable booléenne pour indiquer si le message doit vivre pour une requête supplémentaire.

 

@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; 
    } 
} 

Utilisez un intercepteur pour ajouter le message flash à l'objet modèle.

 

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(); 
     } 
    } 
} 

Dans votre contrôleur, si vous avez une méthode qui redirige vers une autre méthode, vous pouvez simplement dire; flush.keep(), pour afficher le message 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

Cela a été ajouté à Spring MVC 3.1.RC1:

3.1.15 Flash Attributes and RedirectAttributes

attributs Flash peut maintenant être stocké dans un FlashMap et enregistré dans la session HTTP pour survivre à une redirection. Pour un aperçu de la prise en charge générale des attributs Flash dans Spring MVC, voir Section 16.6, “Using flash attributes”.

Dans les contrôleurs annotés, une méthode @RequestMapping peut ajouter des attributs Flash en déclarant un argument de méthode de type RedirectAttributes. Cet argument de méthode peut maintenant être utilisé pour obtenir un contrôle précis sur les attributs utilisés dans un scénario de redirection. Voir Section 16.3.3.10, “Specifying redirect and flash attributes” pour plus de détails.

(question JIRA: SPR-6464)

+0

Sérieusement, mais c'est trop tard! – momomo

+0

Excellent! Cela a résolu mes problèmes décrits ici: http://stackoverflow.com/questions/11216550/how-should-i-send-resourcebundle-messages-across-controllers-in-spring-mvc – Tommy

Questions connexes