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

JSF Java Discussion :

Request vs Session + récuperation d'un identifiant d'un node


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut Request vs Session + récuperation d'un identifiant d'un node
    Bonjour,

    Je suis nouveau sous JSF, et je pense ne pas avoir parfaitement assimilé les concepts de cycle de vie.
    Je tente de faire une opération assez simple:
    Dans une 1ere page, j'ai un richTree (ou une dataTable, le comportement est identique) contenant des objets ayant un identifiant.
    Le tree est inclus dans le bean de la page qui contient en plus un champ selectedID. L'idée est que lorsque l'on clique sur un élément du tree, cela mette à jour le selectedID avec l'identifiant de l'objet cliqué, puis lance une nouvelle fenêtre de détails.

    Voici le code de la première page:

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <h:form id="monForm">
    	<h:inputHidden value="#{monBean.selectedID}" id="selectedID" />
    	<rich:tree value="#{monBean.monBeanTree}" switchType="client"var="maNode" >
    		<rich:treeNode icon="monFolder.gif" iconLeaf="monFolder.gif" >
    		<h:commandLink id="maNodeLink" action="#{monBean.showDetail}" target="_new">
    			<a4j:actionparam name="identifiantMAJ" value="#{maNode.identifiant}" assignTo="#{monBean.selectedID}" />
    			<h:outputLabel value="#{maNode.identifiant}" styleClass="link"></h:outputLabel>
    		</h:commandLink>
    	</rich:treeNode>
    </rich:tree>

    De la fiche de détails (qui pour l'instant ne montre que l'identifiant):
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:outputText id="value_id" value="#{monBean.selectedID}"/>

    Et le showDetail du Bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public String showDetail(){
    	if(selectedID!=null){
    		return "consult";
    	}
    	return "error";
    }
    Mon problème: la fiche de détails est vide si monBean est un bean de request. La page affichera les bonnes informations si il est un bean de session.
    Dans le cas d'un scope de request, au debuggueur j'observe (après avoir cliqué sur le lien du node) qu'un premier setSelectedID() est fait avec null; puis un deuxième avec la bonne valeur; puis on passe dans showDetail(), puis *pouf* plus rien dans le bean: selectedID est à nouveau null.

    Je suppose qu'il y a une phase de re-post qui n'est pas faite correctement, pourriez vous éclairer ma lanterne?
    Aurait-il mieux valut utiliser des actionListener?

    Question subsidiaire: pourquoi un c:if est incapable de lire #{maNode.identifiant} ?

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    c'est logique, un bean en scope request est disponible que pour une requete, ensuite, il est réinitialisé, et comme une requete ajaxa le même fonctionnement qu'une requete normale les informations du bean ne seront plus disponibles au deuxième appel.
    la solution en effet, est d'utiliser le scope session, où utiliser le bean avec keepAlive

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    C'est justement là que je ne comprend pas. Si l'ajax a fait une requête et a modifié les informations du bean, j'obtiens une nouvelle page avec ce nouveau bean. Lorsqu'il re-post une 2eme fois, je m'attendais à avoir les bonnes valeurs du fait de ce second bean.

    Peut-on dans ce cas utiliser une méthode similaire pour un tree de récupération de l'élément cliqué comme expliquer dans la faq? (http://javaweb.developpez.com/faq/js...le_active_row1 et http://javaweb.developpez.com/faq/js...le_active_row3)

    Aurais-tu un exemple de KeepAlive?

    Enfin, peut-on m'expliquer pourquoi le c:if est incapable de lire #{maNode.identifiant} ?

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par pasquiel Voir le message
    C'est justement là que je ne comprend pas. Si l'ajax a fait une requête et a modifié les informations du bean, j'obtiens une nouvelle page avec ce nouveau bean. Lorsqu'il re-post une 2eme fois, je m'attendais à avoir les bonnes valeurs du fait de ce second bean.
    le bean est recrée à chaque nouvelle requete lorsqu'il est en scope request, les anciennes valeurs seront automatiquement perdues.

    Citation Envoyé par pasquiel Voir le message
    Peut-on dans ce cas utiliser une méthode similaire pour un tree de récupération de l'élément cliqué comme expliquer dans la faq? (http://javaweb.developpez.com/faq/js...le_active_row1 et http://javaweb.developpez.com/faq/js...le_active_row3)
    Non pour la tree, y'a un exemple sur le site demo de Richfaces, tu peux utiliser le listener ou/et aj4:support.

    Citation Envoyé par pasquiel Voir le message
    Aurais-tu un exemple de KeepAlive?

    Enfin, peut-on m'expliquer pourquoi le c:if est incapable de lire #{maNode.identifiant} ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4k:keepAlive beanNAme="monBean" />
    tu peux utiliser le rendered de JSF au lieu de c:if.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 15
    Par défaut
    Toujours dans une impasse.

    Toutes les techniques citées précédemment marchent parfaitement lorsque l'on fait un rafraichissement d'une partie de la page, mais ne marche pas du tout si l'on envoie sur une nouvelle page (popup fyi) à travers une règle de navigation JSF.
    Le keepalive ne m'a pas aidé non plus.
    N'y a-t-il pas un moyen de dire de faire un re-post avec les données calculées? Au final c'est pourtant simple, il s'agit juste de passer un paramètre dans un formulaire à partir d'une liste. Cela ne doit pas être si compliqué!

    le bean est recrée à chaque nouvelle requete lorsqu'il est en scope request, les anciennes valeurs seront automatiquement perdues.
    Oui j'ai bien compris que le bean était réinitialisé, pourtant c'est bien le but même de JSF de faire un postback sur lui même afin de garder les informations et de recréer le bean à partir de ces infos. Pourquoi donc je n'ai pas d'attribut "selectedID" re-posté?

    tu peux utiliser le rendered de JSF au lieu de c:if.
    Excellente suggestion, merci cela m'évitera pas mal d'ennui. Ceci dit, cela ne satisfait pas ma curiosité concernant le _pourquoi_ c:if est incompatible avec un objet généré par une table ou un tree.

    Non pour la tree, y'a un exemple sur le site demo de Richfaces, tu peux utiliser le listener ou/et aj4:support.
    Merci, ca marche nickel sur le reRender d'un champs dans la page, mais pas du tout (ou plutôt je ne sais pas faire) à travers une règle de navigation et une nouvelle page.

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    montre le code où tu veux recuperer les valeurs dans une popup, la regle de navigation si le bean est en session ou keepAlive.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Scope request vs session
    Par programaniac dans le forum Struts 1
    Réponses: 4
    Dernier message: 21/09/2011, 16h46
  2. [Débutant] Différences entre request et session
    Par kinshinori dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/07/2009, 10h51
  3. [1.x] session : récupération de l'identifiant d'un utilisateur
    Par kifouillou dans le forum Symfony
    Réponses: 1
    Dernier message: 17/08/2008, 20h43
  4. Récupération des objets request et Session
    Par guillaume06 dans le forum Struts 2
    Réponses: 3
    Dernier message: 14/12/2007, 12h08
  5. [scope] request ou session ?
    Par phoebe dans le forum Struts 1
    Réponses: 27
    Dernier message: 19/07/2007, 00h39

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