2010-02-01 4 views
3

Dans mon application jsf j'ai un bouton pour envoyer du courrier. Et chaque fois que j'ai cliqué, je veux montrer que le message a été ou n'a pas été envoyé.Comment émuler le comportement de portée de requête dans le bean de portée de session?

Il s'agit d'une fonctionnalité de demande-portée typique. Mais le problème est que j'ai 1 bean backing avec la portée de la session maintenant. Et toutes les données sont dans ce bean. Et la méthode 'send' référée par l'attribut action du bouton est dans ce bean.

Alors, quel est le moyen de sortir? Si je devais créer un autre bean request-scope, comment devrais-je me référer à mon bean session?

+0

Demande scope données qui appartiennent au périmètre de la requête. Les données de portée de session appartiennent à la portée de session. Cela ne peut pas être plus clair/évident. En d'autres termes: refactor. – BalusC

+0

Je dois envoyer par mail les données de la portée de la session (je ne peux pas les mettre dans la portée de la requête). Mais le message de résultat devrait être dans la portée de la demande (parce que je veux le voir seulement une fois juste après l'envoi du courrier). Que puis-je refactoriser? – Roman

+0

Je me rends compte, si c'est ** seulement ** la messagerie, alors vous pouvez simplement saisir 'FacesMessage'. Vois ma réponse. – BalusC

Répondre

3

Une autre approche, vous pouvez utiliser FacesMessage ici que vous ajoutez au contexte à l'aide FacesContext#addMessage(). FacesMessages est basé sur une requête et est probablement plus adapté à l'exigence fonctionnelle particulière qu'une approche de messagerie personnalisée.

Voici un exemple de la méthode d'action de haricot:

public void sendMail() { 
    FacesMessage message; 
    try { 
     Mailer.send(from, to, subject, message); 
     message = new FacesMessage("Mail successfully sent!"); 
    } catch (MailException e) { 
     message = new FacesMessage("Sending mail failed!"); 
     logger.error("Sending mail failed!", e); // Yes, you need to know about it as well! ;) 
    } 
    FacesContext.getCurrentInstance().addMessage(null, message); 
} 

Avec un null clientId le message devient « global », de sorte que vous pouvez utiliser la construction suivante pour afficher seulement messages globaux:

<h:messages globalOnly="true" /> 

Mise à jour: pour avoir le message de réussite et d'erreur affiché dans un style différent, jouer avec le FacesMessage.Severity:

 message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mail successfully sent!", null); 
    } catch (MailException e) { 
     message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Sending mail failed!", null); 

.. en combinaison avec infoClass/infoStyle et errorClass/errorStyle dans h:messages:

<h:messages globalOnly="true" infoStyle="color:green" errorStyle="color:red" /> 
+0

J'ai déjà trouvé une solution de contournement. J'ai un bean request-scope et je lui passe mon bean de portée session avec propertyActionListener. Le bean de la demande appelle la méthode send() dans le bean de portée session. Votre solution est évidemment meilleure car il est même difficile d'expliquer le mien. – Roman

+0

Il est assez clair, je l'ai déjà compris quand vous avez dit propertyActionListener. – BalusC

1

Soit:

  • il suffit de pousser le message dans le champ de requête à partir de la méthode send (via le ExternalContext)
  • refactor le procédé à un bean-champ de demande et d'injecter de l'information de session, il a besoin (le cadre géré de haricots peut le faire)
Questions connexes