Quelle est la meilleure façon de réaliser des messages flash de type Rails comme "Update successful" http://api.rubyonrails.org/classes/ActionController/Flash.html) dans le monde Java? J'utilise Spring MVC.Rails messages flash en Java
Répondre
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.
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.
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>
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"; } }
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)
- 1. Rails, perdant flash après redirect_to
- 2. convertir l'applet java awt en flash/flex
- 3. Modifier flash avec Java
- 4. Attributs traduits dans les messages d'erreur Rails (Rails 2.3.2, I18N)
- 5. Comment fournir des messages d'état AJAX dans un emplacement de mise en page standard avec Rails
- 6. Créer une application Flash en utilisant WebOrb Ruby/Rails
- 7. Envoi de messages de php vers Java
- 8. Batch Downloader - Flash, Java, Air?
- 9. Comment comparer les performances graphiques vectorielles en Java avec Flash?
- 10. Mise en cache d'actions et messages en file d'attente dans les rails
- 11. Files d'attente de messages dans Ruby on Rails
- 12. Modification des messages d'erreur par défaut dans Rails
- 13. Rails Polymorphisme 'en arrière'
- 14. Grails erreur en double Messages
- 15. (Rails, Flash) Pourquoi mon graphique Flash mis à jour ne serait pas actualisé dans Internet Explorer?
- 16. dz's Open Flash Chart 2 problème d'animation de désactivation (Rails)
- 17. Personnalisé ScrollBar en Flash
- 18. Expression régulière en Flash
- 19. Comment réinitialiser les messages d'erreur de la langue en anglais
- 20. Rails message flash reste pour deux chargements de page
- 21. Communication par applet Java avec l'application Rails
- 22. erreurs de validation d'entrée commune en flash
- 23. Envoi de messages entre utilisateurs
- 24. Conversion Pdf en Swf en utilisant Java
- 25. Plusieurs connexions locales en Flash - quelle est la meilleure architecture?
- 26. obtenir des messages d'erreur définis par l'utilisateur en utilisant antlr3
- 27. Envoi de messages MIDI dans une page Web
- 28. appel flash en utilisant javascript
- 29. Envoyer des messages à un jeu Flash avec C# et AutoIt
- 30. Java: Flash une fenêtre pour attirer l'attention de l'utilisateur
Malheureusement, je suis tout à fait engagé au printemps. – wachunga