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 :

Pas de soumission de formulaire sur include dynamique


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
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Par défaut Pas de soumission de formulaire sur include dynamique
    Bonjour,

    J'utilise le code suivant pour pouvoir créer un site, dont la section 'page' est obtenue dynamiquement avec une variable, et tout en gardant le reste de l'architecture du site :

    principal.xhtml :
    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
    <html xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:c="http://java.sun.com/jsp/jstl/core">
     
    	<h:head>
     
    	<title>Miagetest-JSF</title>
    	</h:head>
     
    	<h:body>
    	<h1>Miagetest-JSF</h1>
     
    	infoSession
     
    	<ui:include src="menu.xhtml" />
     
    	${message}
     
    	<ui:include src="#{action.page}.xhtml" />
     
    	</h:body>
    	</html>
    Voici un exemple de sous page :

    creerClientForm.xhtml :
    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
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:h="http://java.sun.com/jsf/html">
     
     
    <h2>Créer client</h2>
     
    <h:form>
    	<h:panelGrid>
    	    <h:inputText label="Nom" value="#{clientAction.nom}" />
    	    <h:inputText label="Prenom" value="#{clientAction.prenom}" />
    	    <h:commandButton value="Enregistrer client" action="#{clientAction.newClient}"/> 
    	</h:panelGrid>
    </h:form>
     
    </ui:composition>
    En voici un autre :

    listeClients.xhtml :
    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
    27
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:h="http://java.sun.com/jsf/html">
     
    	<h2>Liste clients</h2>
     
    	<h:dataTable value="#{clientAction.clients}" border="1" var="client">
     
    		<h:column>
    			<f:facet name="header">id</f:facet>
        		#{client.id}
        	</h:column>
     
        	<h:column>
    			<f:facet name="header">Nom</f:facet>
        		#{client.nom}
        	</h:column>
     
        	<h:column>
    			<f:facet name="header">Prénom</f:facet>
        		#{client.prenom}
        	</h:column>    	   	 
     
    	</h:dataTable>
     
    </ui:composition>
    Voici mon bean JSF principal :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package beans;
     
    import gestion.GestionnaireRemote;
     
    import java.io.IOException;
     
    import javax.ejb.EJB;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
    import javax.faces.context.FacesContext;
     
    @ManagedBean
    @RequestScoped
    public class Action {
     
        @EJB
        GestionnaireRemote gestionnaire;
     
        private String page;
     
        private String message;
     
        public final String SUCCESS = "success";
     
        public String getPage() {
     
            if(page == null)
                return "default";
     
            return page;
        }
     
        public void setPage(String page) {
            this.page = page;
        }
     
        public String getMessage() {
            return message;
        }
     
        public void setMessage(String message) {
            this.message = message;
        }
     
        public String returnSuccessPageMethodName()
        {
            //Si par exemple on est dans la méthode listeClients(), on aura page = "listeClients";
            page = Thread.currentThread().getStackTrace()[2].getMethodName();        
            return SUCCESS;
        }
     
        public String listeClients()
        {
            return returnSuccessPageMethodName();
        }
     
        public String creerClientForm()
        {
            return returnSuccessPageMethodName();
        }
     
     
    }
    Voici mon bean dédié :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    package beans;
     
    import java.util.List;
     
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.RequestScoped;
     
    import dao.EntityAlreadyExistsException;
    import entities.Client;
     
    @ManagedBean
    @RequestScoped
    public class ClientAction extends Action {
     
        private String nom;
     
        private String prenom;
     
     
        public void setNom(String nom) {
            this.nom = nom;
        }
     
        public void setPrenom(String prenom) {
            this.prenom = prenom;
        }
     
        //nécessaire car sinon : The class 'beans.ClientAction' does not have a readable property 'nom'.
        public String getNom() {
            return nom;
        }
     
        public String getPrenom() {
            return prenom;
        }
     
        public List<Client> getClients() {
     
            return (List<Client>) gestionnaire.getAll(Client.class);
     
        }
     
        public void newClient()
        {
            try
            {
                gestionnaire.creerClient(nom, prenom);
                setMessage("Le client a été correctement créé.");
     
            } catch (EntityAlreadyExistsException ex) {
                setMessage(ex.toString());
            }
            //return "SUCCESS";
            //setPage("creerClientForm");
     
        }    
     
    }
    Ma page 'listeClients' fonctionne très bien, par contre 'creerClientForm' ne fonctionne pas. Les méthodes setNom et setPrenom ne sont pas appelés, et newClient non plus.

    Par contre, si je récupère le code de creerClientForm.xhtml sur principal.xhtml, ça marche correctement. Comme si le fait d'avoir le <ui:include src="#{action.page}.xhtml" /> détruisait tout, comme si le form envoyé était perdu en chemin.

    Que faut-il modifier pour que creerClientForm.xhtml puisse fonctionner ? Y-a-t-il une manière propre de faire ce genre de chose en JSF? (une sous page dynamique d'une même page principale)

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu n'aurais pas un <h:form> à l'intérieur d'un autre ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Par défaut
    A priori non, la seule autre page incluse sur principal.xhtml est menu.xhtml :

    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
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:h="http://java.sun.com/jsf/html">
     
    	<h2>Menu</h2>
     
    	<h:form>
    		<ul>
    			<li><h:commandLink action="#{action.listeClients}" value="Liste des Clients" /></li>
    			<li><h:commandLink action="#{action.creerClientForm}" value="Créer Client" /></li>
    		</ul>
    	</h:form>
     
    </ui:composition>

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 52
    Par défaut
    J'ai trouvé une solution, ajouter dans le web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	<context-param>
    		<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    		<param-value>false</param-value>
    	</context-param>
    Comme indiqué ici dans les commentaires :
    http://alvinsim.wordpress.com/2012/0...include-a-jsf/

    Apparemment, une nouvelle instance du bean est créée, ce qui supprime mes valeurs envoyées par le formulaire. Pourtant je n'utilise aucun @ViewScoped.

    Par contre, apparemment, ce n'est pas toujours bien d'utiliser cette solution. Il y a moyen de désactiver le 'partial state saving' uniquement pour certaines vues, mais ça n'apporte pas grand chose ici.

    Donc si vous avez mieux, je suis toujours preneur

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Par défaut
    Bonjour,

    Je ne sais si ça peut jouer dans la résolution du problème mais avez-vous considéré le fait d'utiliser les template de JSF ?

    Voic un exemple de ce que sont les templates:
    http://www.mkyong.com/jsf2/jsf-2-tem...elets-example/

    C'est extrêmement facile à utiliser et ça vous évite d'éventuel problème d'inclusions.

    Cordialement

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Par défaut
    Re-bonjour,

    Concernant le problème en lui-même, je pense que le soucis se situe au niveau du "scope" du ManagedBean ClientAction.

    Il est défini en Request et donc lorsque vous appelez l'action #{clientAction.newClient}, l'instance du ManagedBean est déjà perdue.

    L'autre page fonctione car il n'y a que de l'affichage, ce qui convient bien au scope request

    Cordialement,

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/12/2009, 13h17
  2. Réponses: 8
    Dernier message: 14/04/2009, 16h10
  3. appuier sur entree sans la soumission du formulaire
    Par john_wili dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/02/2009, 16h13
  4. [HTML] Ancre liée à formulaire fonctionne pas avec certains boutons "submit" sur ie6
    Par 12monkeys dans le forum Balisage (X)HTML et validation W3C
    Réponses: 9
    Dernier message: 28/02/2008, 21h30
  5. Confirm sur une soumission de formulaire
    Par ephemere2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/04/2006, 08h59

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