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 :

Submiter un formulaire


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut Submiter un formulaire
    Bonjour

    Je rencontre un problème pour submiter un formulaire avec JSF. Il y a deux boutons qui peuvent submiter le formulaire. Jusqu'ici aucun problème. Voici le code de mon managed bean.

    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
    20
    21
    22
    23
    24
    25
    26
     
    public class TotoBean {
     
    	private String attribut1;
     
    	private String attribut2;
     
    	public String process1() {
    		System.out.println("");
    		System.out.println("process1");
    		System.out.println("attribut1 = " + this.attribut1);
    		System.out.println("attribut2 = " + this.attribut2);
    		System.out.println("");
    		return null;
    	}
     
    	public String process2() {
    		System.out.println("");
    		System.out.println("process2");
    		System.out.println("attribut1 = " + this.attribut1);
    		System.out.println("attribut2 = " + this.attribut2);
    		System.out.println("");
    		return null;
    	}
    ... getters et setters
    }

    Et ici le code xhtml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <h:form id="form">
    	<h:inputText value="#{totoBean.attribut1}" />
    	<h:commandButton action="#{totoBean.process1}" value=" > " />
    	<br/>
    	<br/>
    	<h:inputText value="#{totoBean.attribut2}" />
    	<h:commandButton action="#{totoBean.process2}" value=" OK " />
    </h:form>
    Lorsque je clique sur le bouton " > ", la méthode process1() est bien exécutée et lorsque je clique sur " OK ", la méthode process2() est bien exécuté. Les traces affichent correctement ce qui a été rentré dans les inputText.

    Mais voici mon problème. Je souhaite n'afficher la deuxième partie de la page (2ème input text et 2ème bouton) que si la première partie a été renseignée. Voici donc mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <h:form id="form">
    	<h:inputText value="#{totoBean.attribut1}" />
    	<h:commandButton action="#{totoBean.process1}" value=" > " />
    	<br/>
    	<br/>
    	<h:inputText rendered="#{totoBean.attribut1 != null}" value="#{totoBean.attribut2}" />
    	<h:commandButton rendered="#{totoBean.attribut1 != null}" action="#{totoBean.process2}" value=" OK " />
    </h:form>
    Ça fonctionne pour la première étape. Lorsque la page s'affiche pour la première fois, seuls le 1er input text et le premier bouton apparaissent. Je renseigne le champ de texte puis je clique sur " > ". Là, le deuxième champs et le deuxième bouton apparaissent. Je renseigne le deuxième champ et c'est là que survient le problème. Quand je clique sur le deuxième bouton (le bouton " OK "), la méthode process2() n'est pas exécutée. La page se recharge en effaçant ce qui a été rentré dans le deuxième champ.

    Que se passe-t-il ?

    Merci d'avance pour votre aide.

  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
    ton bean est dans un scope request?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    oui le bean a un scope request

  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 El Saigneur Voir le message
    oui le bean a un scope request
    Donc normal que tu perds les valeurs du bean entre deux requêtes, le bean est disponible que pour la requete en cours, à la deuxième requete, il est réinitialisé.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    Alors comment faire ? Il serait tout de même aberrant de mettre le bean en scope session.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    J'utilise RichFaces. Peut-être y-a-t-il moyen de s'en sortir avec de l'Ajax ? J'ai essayé avec <a4j:form ajaxSubmit="true" reRender="idDeMesChampsCachés">. Mais ça ne marche pas.

    D'autre part, j'avoue que je comprends mal le fonctionnement de JSF sur ce coup. Je me replace dans un fonctionnement classique plus bas niveau avec la Servlet et les HTTP parameters. Quand je clique sur mon premier bouton, une HTTP request est envoyée au serveur. JSF traite l'info, voit que mon premier champ n'est pas null et décide donc de "renderer" mon deuxième champ et mon deuxième bouton. J'obtiens donc une seconde page avec mon code HTML complet avec mes deux parties de page. Là je submite. Le submit semble marcher puisque ma page est réaffichée. Il y a donc un aller - retour avec le serveur. Le Servlet doit bien recevoir les HTTP parameters correspondont au form HTML. Elle doit donc bien recevoir les HTTP parameters correspondant à mon deuxième champ de texte et à mon deuxième bouton. Pourquoi ne les traite-t-elle pas. Pourquoi il est compliqué de faire avec un nouveau framework ce qu'il était simple de faire avec les technologies sous-jacentes ?

  7. #7
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Tu as plusieurs solutions :

    • Utiliser un scope session.
    • Utiliser un bean session qui ne conserverait que les données que tu souhaites garder tout au long de ton processus (ou du moins sur plusieurs pages), et ainsi conserver ton bean request pour les données à ne faire transiter qu'une seule fois.
    • Utiliser un composant de type <a4j:keepAlive/> qui te permet de conserver tes données plus longtemps qu'avec le scope request, mais sans pour autant qu'il soit de scope session.
    • Utiliser Seam ou JSF 2.0 qui offrent d'autres types de scopes, du genre view...

    Voilà quelques pistes !
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  8. #8
    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 El Saigneur Voir le message

    D'autre part, j'avoue que je comprends mal le fonctionnement de JSF sur ce coup. Je me replace dans un fonctionnement classique plus bas niveau avec la Servlet et les HTTP parameters.
    Ce n'est pas lié à JSF, c'est le principe de fonctionnement d'une application web en java.
    Citation Envoyé par El Saigneur Voir le message
    Pourquoi il est compliqué de faire avec un nouveau framework ce qu'il était simple de faire avec les technologies sous-jacentes ?
    tu parles de quelles technologies? Il y'a des restrictions liées au protocole HTTP, d'autres liées à J2EE, d'autres liées à JSF, mais là tu aurais le même problème avec n'importe quelle framework.

    tu peux utiliser keepAlive si tu ne veux pas mettre ton bean en session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a4j:keepAlive beanName="nomDuBean"/>

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    Effectivement le <a4j:keepAlive /> a l'air intéressant pour mon problème : http://livedemo.exadel.com/richfaces...live&tab=usage

    Je vous tiens au courant. Je reste cependant un peu agacé de devoir feinter pour faire quelque chose que je savais faire très simplement avec un mécanisme Servlet / JSP à l'ancienne.

    Merci à vous pour votre aide.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 143
    Par défaut
    Bon super avec la <a4j:keepAlive /> ça marche.

    Sniper. J'entendais par techno sous-jacentes, l'utilisation à l'ancienne d'une Servlet couplée avec des JSP. Je te garantis qu'avec une pauvre JSP et une Servlet je te fais ça sans problème et sans feinter avec de l'Ajax.

    Bon je fais certes un peu de mauvaise foi. JSF et surtout RichFaces par dessus c'est pas mal. L'utilisation d'Ajax est simple, le rendu graphique et les composants RichFaces sont vraiment efficaces. J'aime bien le PanelMenu, le ListShuttle, ...
    Mais bon je suis désolé c'est pas la première fois que je suis bloqué sur un problème qui n'en était pas un avant avec les Servlet - JSP. J'avoue que, pour mes prochains projets, je pense sérieusement à passer sur Flex avec Spring BlazeDS integration pour faire des interfaces graphiques web riches.

    J'ouvre le débat. Qu'en pensez-vous ?

    Et merci encore pour votre aide.

  11. #11
    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
    à mon avis, ce n'est pas un problème ça, avec Flex, tu aura aussi d'autres soucis.
    JSF c'est quand même plus simple que de faire des Servlets et JSP, et, si tu comprends bien le fonctionnement de JSF c'est encore plus simple.
    de toute façon pour ta question, il faut bien garder quelquepart, en session, si le bean est en session, ou sur le client, comme le font d'autre framework et même Richfaces.

    Il y'a déjà un débat dans le forum Web qui parle de ça..

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 110
    Par défaut
    Ou as tu placé ton <a4j:keepAlive>, quand je rajoute ça dans mon code JSF, le bean n'arrive plus a s'initialiser

    java.io.NotSerializableException: controller.HistoryFormController

  13. #13
    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 ton code..
    le bean doit implémenter l'interface Serializable.
    Si tu utilise java5, tu peux aussi utiliser l'annotation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @keepAlive
    public class RequestBean implement java.io.Serializable

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

Discussions similaires

  1. Submit de formulaire et ancre nommée
    Par ssebuser dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 18/01/2007, 08h54
  2. Redirection vers la même page après submit de formulaire
    Par noOneIsInnocent dans le forum Struts 1
    Réponses: 5
    Dernier message: 27/10/2006, 15h36
  3. Boutons (submit) et formulaires
    Par the_prodigy2 dans le forum Langage
    Réponses: 5
    Dernier message: 17/07/2006, 16h56
  4. [AJAX] submit file Formulaire
    Par Azanael dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 06/06/2006, 19h36
  5. Réponses: 6
    Dernier message: 23/05/2006, 15h12

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