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 :

[JSF - RichFaces - Ajax4Jsf] commandButton - action


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut [RichFaces] commandButton - action - addMessage - le message ne s'affiche pas
    Bonjour à tous,

    J'utilise RichFaces et Ajax4Jsf pour faire de l'ajax sur mes pages.

    Voici un exemple de mes formulaires :
    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
    <a4j:form id="loginForm" ajaxSubmit="true">
    	<h:outputLabel for="username" value="#{bundle.USERNAME} :" styleClass="label" />
    	<h:inputText id="username" value="#{loginBean.username}" required="true" requiredMessage="#{bundle.YOUR_USERNAME_REQUIRED}" />
    	<rich:message for="username" styleClass="validator" />
     
    	<br />
     
    	<h:outputLabel for="password" value="#{bundle.PASSWORD} :" styleClass="label" />
    	<h:inputSecret id="password" value="#{loginBean.password}" required="true" requiredMessage="#{bundle.YOUR_PASSWORD_REQUIRED}" />
    	<rich:message for="password" styleClass="validator" />
     
    	<br />
     
    	<h:outputLabel for="theme" value="#{bundle.THEME} :" styleClass="label" />
    	<h:selectOneMenu id="theme" onchange="submit()" immediate="true" value="#{themeBean.name}">
    		<f:selectItem itemValue="default" />
    		<f:selectItem itemValue="negative" />
    	</h:selectOneMenu>
     
    	<br />
     
    	<rich:messages globalOnly="true" styleClass="error" />
     
    	<div class="form_footer">
    		<h:commandButton action="#{loginBean.login}" value="#{bundle.LOGIN_BUTTON}" styleClass="button" />
    	</div>
    </a4j:form>
    Comme vous pouvez le voir, une action est associé a mon commandButton.

    Voici le code de cette fonction :
    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
    public String login() 
    {	
    	User user = Gesnet.authenticationManager.login(username, password);
     
    	if(user == null)
    	{
    		System.out.println("Login Failed");
    		context.addMessage(null, new FacesMessage(JSFUtil.getResourceBundle(context, "bundle").getString("LOGIN_ERROR")));
    		return null;
    	}
    	else
    	{
    		System.out.println("Login Success");
    		return "success";
    	}
    }
    Voici ma règle de navigation dans mon fichier faces-config.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <navigation-rule>
    	<from-view-id>/pages/users/login.xhtml</from-view-id>
    	<navigation-case>
    		<from-outcome>success</from-outcome>
    		<to-view-id>/pages/index.xhtml</to-view-id>
    	</navigation-case>
    </navigation-rule>
    Voici mon problème :
    * Lorsque je valide le formulaire et que des champs sont vides, les messages s'affichent bien sans rechargement de la page.
    * Par contre lorsque les validations sont passé et qu'il exécute la fonction login(), j'ai bien le message "Login Success" qui s'affiche dans ma console et la fonction retourne "success". Mais la règle de navigation n'est pas respecté puisque lorsque je retourne "success", il est sensé aller à la vue : "/pages/index.xhtml". Et dans mon cas rien ne se passe.

    Est-ce que quelqu'un aurait un petit conseil à propos de cela ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Par défaut
    salut gufra, j'ai executer ton code dans une application en jsp et non en facelets et la navigation est correcte, ton code est bon, peut être que t'a un souci de chemin.

    ps: petite question concernant
    User user = Gesnet.authenticationManager.login(username, password);

    Gesnet c'est quoi ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    Mon code marche aussi sans ajax

    C'est justement la mon problème, une fois que je passe en ajax avec un a4j:form, ca ne marche plus.

    Et Gesnet, c'est une classe que j'ai développée.

    Merci quand même pour ta réponse Mediii.

    Pour le moment, j'ai rajouté la balise <redirect /> dans chaques règles de navigation et ca marche.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    Je suis bloqué avec ma balise <redirect /> dans mon faces-config.xml.
    J'ai un formulaire avec un a4j:include et des règles de navigation.

    <a4j:commandButton type="submit" action="next" value="#{bundle.NEXT}" actionListener="#{taskBean.mergeIntervention}" styleClass="button" />

    Je valide les champs de mon formulaire dans la méthode mergeIntervention qui est associé à l'actionListener du bouton.

    Le problème est qu'il faudrait que je puisse rester sur le même vue si la validation a échoué où passé à la vue définie dans le faces-config.xml si la validation a réussie.

    Comment puis-je faire cela ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    Je n'ai rien dis ca marche.
    Je dois associé l'action (et non l'actionListener) de mon button, et dans ma méthode retourner soit "next" soit null.

    Mon problème est maintenant que lorsque j'effectue les validations, j'ajouter un message. Ce message s'affiche bien dans le rich:messages, mais pas dans les rich:message particulier à chaque champs.

    Quelqu'un aurait-il une idée du pkoi ?

  6. #6
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Pour ajouter un FacesMessages dans le FacesContext, tu utilises la méthode addMessage(String, FacesMessage). Le String (1er argument) définit l'ID du composant qui est concerné par le message.
    Si ce String est null, alors c'est un message "général" que seul le composant messages pourra intercepter.
    Pour qu'un composant message puisse afficher le message de validation, il faut que tu spécifies l'ID du composant en faute lorsque tu appelles la méthode addMessage.
    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

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    C'est bien ce que je fais :

    Mon champ :
    <h:inputText id="interventionName" value="#{taskBean.interventionName}" maxlength="32" />
    <rich:message for="interventionName" />

    Mon message :
    FacesContext.getCurrentInstance().addMessage("interventionName", new FacesMessage(getResourceBundle("bundle").getString("NAME_REQUIRED")))

  8. #8
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Je ne suis pas complètement sûr, mais peut être lui faut-il l'ID complet.
    Autrement dit, si ton inputText d'ID interventionName se trouve dans un formulaire myForm, alors l'ID a donner sera myForm:interventionName.
    A tester donc.

    Pour information:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UIComponent compo = ...; // Récupération d'un composant JSF.
    System.out.println("ID#1: " + compo.getId());
    System.out.println("ID#2: " + compo.getClientId(facesContext));
    va retourner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ID#1: interventionName
    ID#2: myForm:interventionName
    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

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    J'ai compris pourquoi mes messages de validation ne s'affichait pas.

    Ils ne s'affichent pas quand la page contenant les "rich:message" est inclue (a4j:include) dans une autre page.

    Voci un exemple :

    testContainer.xhtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ui:composition template="#{themeBean.template}/main.xhtml"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:ui="http://java.sun.com/jsf/facelets"
    	xmlns:a4j="http://richfaces.org/a4j">
    	<ui:define name="content">
    		<a4j:include viewId="/pages/test.xhtml" />
    	</ui:define>
    </ui:composition>
    test.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:ui="http://java.sun.com/jsf/facelets"
    	xmlns:h="http://java.sun.com/jsf/html"
    	xmlns:f="http://java.sun.com/jsf/core"
    	xmlns:a4j="http://richfaces.org/a4j"
    	xmlns:rich="http://richfaces.org/rich">
    	<h:form id="myForm">
    		<h:outputLabel for="item" value="Item :" />
    		<h:inputText id="item" value="#{testBean.item}" />
    		<rich:message for="item" />
     
    		<br />
     
    		<a4j:commandButton value="Valider" action="#{testBean.action}" />
    	</h:form>
    </ui:composition>
    TestBean.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
    public class TestBean extends AbstractBean {
        private String item;
     
        public String getItem() {
    	return item;
        }
     
        public void setItem(String item) {
    	this.item = item;
        }
     
        public String action() {
    	FacesContext.getCurrentInstance().addMessage("myForm:item", new FacesMessage("summary"));
    	return null;
        }
    }
    Y a t il une solution pour afficher ces messages en gardant un a4j:include ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    Voici une solution temporaire :

    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
        private String id;
     
        public void actionListener(ActionEvent event) {
    	id = event.getComponent().findComponent("item").getClientId(FacesContext.getCurrentInstance());
        }
     
        public String action() {
    	System.out.println("action");
     
    	System.out.println("Id = " + id);
    	addMessage(id, "summary");
    	//FacesContext.getCurrentInstance().addMessage("myForm:item", new FacesMessage("summary"));
     
    	return null;
        }
    Faire un "getClientId". Le problème est qui faut définir à la fois un action et un actionListener sur le bouton. Y a t il un object qu'on puisse utiliser directement dans l'action sans passer par l'actionListener ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    J'ai la solution finale.

    * Donner un id au a4j:include.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a4j:include id="include" viewId="/pages/test.xhtml" />
    * Ajouter le message en spécifiant l'id de l'a4j:include.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addMessage("include:myForm:item", "summary")

  12. #12
    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 : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Oui en effet.
    Ca rejoint mon explication de tout à l'heure, avec le formulaire.
    Comme le composant lié à <a4j:include> implémente NamingContainer, tous ses composants enfants ont un ID qui sera préfixé par l'ID du <a4j:include>.
    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

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2007
    Messages : 201
    Par défaut
    Merci pour ton aide ;-) J'ai l'impression que ca devient rare ici !

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

Discussions similaires

  1. JSF RichFace et Ajax4JSF
    Par damien77 dans le forum JSF
    Réponses: 9
    Dernier message: 15/09/2008, 16h20
  2. Réponses: 1
    Dernier message: 18/10/2007, 16h32
  3. Réponses: 2
    Dernier message: 17/10/2007, 15h00
  4. Commandbutton action ..?
    Par Stylerz dans le forum JSF
    Réponses: 3
    Dernier message: 19/09/2007, 12h28
  5. [JSF] Problème : param & commandButton
    Par Maxbj dans le forum JSF
    Réponses: 6
    Dernier message: 12/06/2006, 19h32

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