IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Seam Java Discussion :

Utilisation des Nested Conversations


Sujet :

Seam Java

  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Utilisation des Nested Conversations
    Bonjour,

    je débute avec JBoss Seam (et en programmation Web en général), et je bloque sur un problème apparemment simple : la réutilisation de use-cases.

    Je m'explique, avec un exemple : j'ai trois entités, mettons un Pays, une Région et une Personne.
    Une personne est née dans un Pays, une Région fait partie d'un Pays.
    On peut donc affecter un Pays à ces entités. Jusque-là, tout va bien.

    Je veux aussi pouvoir créer un Pays qui n'est pas encore listé, à partir de la page d'édition de ces entités.

    J'ai donc un bouton "créer pays" qui m'envoie sur le formulaire de création adéquate. Par contre, impossible de revenir au process appelant, c'est à dire soit à la page d'édition de la Personne, soit à celle de la Région.

    Le bouton "créer" est cablé vers la méthode countryHome.create().
    Cette méthode est taggée :Une méthode countryHome.end() enregistre la saisie et achève la conversation.
    Mon soucis est que si elle retourne une viewID, cette viewID est appelée et non celle de la conversation mère. Si je ne revoie rien, j'ai un simple refresh de la page courante, i.e. celle d'édition du pays.
    L'utilisation de EndBeforeRedirect n'a pas eu d'effet, alors que la conversation parente aurait dû être réactivée, et donc remplacer la viewID courante.

    Quelqu'un aurait-il une idée sur la bonne utilisation des conversations dans ce cas ?

    Merci d'avance.



    Note: l'exemple seam-issues fourni utilise les conversations "joined" et "nested", mais n'est pas documentée et trop complexe pour moi.
    La documentation de référence n'est pas très bavarde sur le sujet ("ça marche tout seul").
    Enfin, j'ai lu que Seam ne se souvient pas (encore) automatiquement de la dernière vue au lancement d'une conversation, si cette vue n'appartenait pas à une conversation. Mais ce n'est pas mon cas : mon appel est déjà (normalement) dans le cadre d'une conversation existante...

    Vous pourrez trouver un exemple encore plus simple de mon propos sur http://www.malova.fr/musicdb
    Il y a une page de liste de régions. Lorsqu'une région est éditée/créée, une conversation se lance et on peut ajouter un Pays. Lorsque le pays est ajouté, clicker sur "Done" renvoie à la liste des pays, et non à l'édition de notre région. Et je tiens à ce mode de fonctionnement, et non pas à "assurez-vous que le pays existe avant de créer une région". Ce serait à s'arracher les cheveux dans l'appli que je souhaite monter.

    Merci pour votre aide,

    Jean

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Par défaut
    Tu dois garder une refence du viewID de la page dont tu viens (stocke dans la nested conversation par exemple) puis retourner cette viewId quand tu termines la nested conversation.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    Merci Thomas pour cette réponse.

    Si j'ai bien compris, il faudrait que modifie CountryHome par quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // cas général : appel direct
    private String doneOutcome = "countryList";
     
    @Begin(nested=true)
    public String create(){
       ...
       doneOutcome = Conversation.getCurrentViewId();
       return "country";
    }
     
    @End
    public String done(){
       // retour à countryList dans le cas normal ou à la page appelante si nested
       return doneOutcome;
    }
    (je n'ai pas en tête le détail des classes de Seam, mais il me semble que ça doit exister)

    Je vais tester ça.

    Par contre, je ne vois plus tellement l'intérêt des nested conversations, et encore moins du end before redirect...

    Merci pour le conseil,

    Jean

  4. #4
    Membre éprouvé
    Inscrit en
    Mars 2007
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 83
    Par défaut
    Tu as essaye endAndRedirect() ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    Citation Envoyé par theute
    Tu as essaye endAndRedirect() ?
    Je me rends compte que je ne sais pas trop comment il faut que j'appelle cette nested conv. Pour l'instant, j'ai :
    region.xhtml : formulaire de création d'une région -> appel création d'un pays
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:commandButton id="newCountry" value="New..." action="#{regionHome.newCountry}" />
    regionHome.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public String newCountry(){
            Redirect redirect = (Redirect)Component.getInstance("redirect");
            redirect.captureCurrentView();
     
            return "/country.xhtml";
        }
    country.xhtml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                <h:commandButton id="test" value="Test" 
                    action="#{countryHome.exit}"
                    rendered="#{countryHome.managed}"/>
    Et enfin, dans CountryHome.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
        public void exit(){
        	Conversation currentConversation = Conversation.instance();
               Redirect redirect = (Redirect)Component.getInstance("redirect");
        	if(currentConversation.isNested()){
        		System.out.print("Country Creation Nested");
        	}else{
        		System.out.print("Country Creation NOT nested");
        	}
    //    	currentConversation.endBeforeRedirect();
    //    	currentConversation.redirectToParent();
    //    	currentConversation.end();
        	currentConversation.endAndRedirect();
    //    	System.out.print("Parent conversation : "+currentConversation.
            // Have a chance here to modify the redirect.setParameters() for the following GET, e.g.
            // strip off the action=(addNote) parameter which would lead me into a circle
    //        redirect.returnToCapturedView();
     
        }
    La trace indique bien que la conversation est Nested.

    L'annotation @End(beforeRedirect) ne donne rien. Si elle est Void, ça rafraîchit, si elle retourne String, elle redirige vers la viewID spécifiée.

    currentConversation.endAndRedirect(); me renvoie sur /country.seam?cid=3&parentConversationId=2

    endBeforeRedirect(); me renvoie sur /country.seam

    Dans le cas où j'ai capturé la vue dans newCountry(), alors redirect.returnToCapturedView(); revoie sur /country.seam.

    Moralité (je n'ai pas encore testé ta première solution), pas moyen de retrouver automatiquement "region.seam", avec la conversation restaurée ni a fortiori les valeurs éventuellement déjà renseignées.

    Si ce n'est pas abuser, serait-il possible de m'envoyer un exemple en qq lignes ?

    Merci,

    Jean

  6. #6
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    Je souhaite revenir sur le conseil qui m'est donné de m'inspirer de l'exemple Seam Issues.

    Tout d'abord, il est un poil trop compliqué pour moi, et n'est pas documenté.

    Et surtout, les vues de retour sont prédéterminées :
    C'est simple, soit l'issue est créée directement, soit elle est créée depuis un projet (nested). À chaque point d'entrée correspond une méthode spécifique, où l'outcome final est hardcodé.

    Il n'y a donc pas de retour automatique à l'appelant, ce qui est précisément mon besoin.

    Sachant que normalement ce retour devrait être automatique, et que j'ai même tenté de bidouiller avec endAndRedirect() etc... quelqu'un aurait-il une idée ?

    Merci d'avance,

    Jean

    PS: je vois que l'exemple Seam Issues est supprimé de Seam1.3.0-Alpha.
    Est-ce un signe ?...

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2004
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 165
    Par défaut
    Salut, je débute aussi avec Seam !!

    Moi je suis à la recherche de documentation sur le sujet, si tu as des pistes de travail pour apprendre le plus efficacement possible seam, je suis prenneur !

    Merci d'avance

  8. #8
    Membre émérite Avatar de XmasRock
    Inscrit en
    Janvier 2007
    Messages
    729
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 729

  9. #9
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut
    (toujours d'actualité)
    ...

  10. #10
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par défaut
    Citation Envoyé par XmasRock Voir le message
    Concernant ce livre, je l'ai acheté et il ne parle pas des nested conversations. Il est pas mal mais répond finalement assez peu à bon nombre de questions. Il survole pas mal les choses mais peut constituer une bonne approche pour ceux qui débutent. Dès qu'on a des questions un peu ardues, ce n'est pas dans ce bouquin qu'il faut regarder!

    Je viens de voir une demande d'évolution et je me demande si ça ne correspond pas au problème évoqué dans ce topic : http://jira.jboss.org/jira/browse/JBSEAM-2854

    Une piste si tu utilises jPDL : http://www.seamframework.org/Communi...omJPDLPageflow

  11. #11
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    Citation Envoyé par Josief Voir le message
    Concernant ce livre, je l'ai acheté et il ne parle pas des nested conversations. Il est pas mal mais répond finalement assez peu à bon nombre de questions. Il survole pas mal les choses mais peut constituer une bonne approche pour ceux qui débutent. Dès qu'on a des questions un peu ardues, ce n'est pas dans ce bouquin qu'il faut regarder!
    Je suis entièrement d'accord.

    Concernant les conversations, ce livre se limite à expliquer l'exemple de l'hotel booking (avec une conversation s'étalant sur 2 3 vues pour réserver une chambre d'hôtel).

    Je me suis aussi poser la question concernant les conversations imbriqués.
    Si vous avez plus d'informations, je suis preneur.

  12. #12
    Membre confirmé Avatar de KneXtasY
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 121
    Par défaut
    Chapitre intéressant extrait d'un bouquin à paraître en Juillet (Seam in Action) :
    http://www.manning-source.com/books/dallen/Allen_SEAM_07.pdf
    Voir plus précisément la partie 7.5.2 Creating nested conversations.

  13. #13
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 2
    Par défaut
    J'ai réussi à faire fonctionner ces satanées nested conversations!

    Je vais essayer d'expliquer comment j'ai procédé en reprenant l'exemple de la création d'un pays depuis la page d'édition d'une personne.

    Dans la page d'édition d'une personne (qui a été appelée au cours d'une long-running conversation), j'ajoute un lien pour créer un pays:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <s:link action="#{countryHome.clearInstance()}"
    		propagation="nest" view="/editCountry.xhtml"
    		id="create"
    		value="Creer un pays">
    	</s:link>
    J'arrive donc dans la page d'édition du pays. Le code associé au bouton créer du pays est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <a4j:commandButton id="confirmCreateCountryButton" tabindex="8"
    		styleClass="button saveButton sessionEventTrigger"
    		reRender="createCountryForm" action="#{countryHome.persist}"
    		value="Créer"
    		propagation="end" rendered="#{!countryHome.managed}">
    	</a4j:commandButton>
    Le fichier editCountry.page.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <page>
    	<description>
    		Edition d'un pays
    	</description>
    	<begin-conversation nested="true" if="#{!conversation.nested}" />
    	<param name="countryId" value="#{countryHome.countryId}" />
    </page>
    Le code de la fonction persist de countryHome (class de scope converstation qui étend EntityHome<Country>):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       private void attachInstanceToEntityManager() {
            if (!super.isManaged() && (getInstance().getId() != 0)) {
                setInstance(getEntityManager().merge(getInstance()));
            }
        }
     
        @Override
        public String persist() {
            attachInstanceToEntityManager();
     
            final String outcome = super.persist();
     
            // End the nested conversation and redirect to the parent page view
            Conversation.instance().redirectToParent();
     
            return outcome;
        }
    J'espère que ces bouts de code vont en aider certains!

    De plus, je peux maintenant afficher une ligne de breadcrumbs en utilisant la pile de conversation.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut
    Attention, la ligne suivante ne termine pas la conversation.

    // End the nested conversation and redirect to the parent page view
    Conversation.instance().redirectToParent();
    contrairement à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Conversation.instance().endAndRedirect();

Discussions similaires

  1. Bonne utilisation des fonctions de conversion
    Par legentil dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2012, 20h13
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo