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 :

rich:combobox et aj:support


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut rich:combobox et aj:support
    Bonjour,

    J'ai un petit problème de mise à jour de mes combobox.
    Lorsque je sélectionne un élément dans mon premier combobox, le deuxième ne se met pas à jour. Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <rich:comboBox id="csp1" value="#{TableCsp.csp1Selected}" suggestionValues="#{TableCsp.test}" 
                               directInputSuggestions="true" defaultLabel="CSP Niveau 1">
                    <a4j:support event="onselect" reRender="csp2" action="#{TableCsp.updateCsp2}"/>
                </rich:comboBox>
     
    <rich:comboBox id="csp2" suggestionValues="#{TableCsp.test2}" 
                               directInputSuggestions="true" defaultLabel="CSP Niveau 2">
                </rich:comboBox>
    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
    public class TableCsp {
     
        List<String> test;
        String csp1Selected;
     
        List<String> test2;
        String csp2Selected;
     
        DBConnection db;
        Connection conn;
        Statement stat;
        String query;
     
     
        public TableCsp() throws SQLException {
            test = new ArrayList<String>();
            test2 = new ArrayList<String>();
     
            db = new DBConnection();
            conn = db.getConnection();
            stat = conn.createStatement();
            query = "SELECT * FROM csp_n1 ";
            ResultSet rs = stat.executeQuery(query);
            while(rs.next()){
                test.add(rs.getString("libelle"));
            }
        }
     
        public void updateCsp2() throws SQLException{
            query = "SELECT * FROM csp_n1 WHERE libelle = '"+csp1Selected+"'";
            ResultSet rs = stat.executeQuery(query);
            rs.next();
            String code = rs.getString("code_csp_n1");
     
            query = "SELECT * FROM csp_n2 WHERE code_csp_n1 = '"+code+"'";
            rs = stat.executeQuery(query);
            while(rs.next()){
                test2.add(rs.getString("libelle"));
            }
        }

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Comme il y a peux de chance lors du submit ajax que ton formulaire soit validé, il y a donc peu de chance que la valeur du premier combobox soit transférée vers le bean (phase update values), et donc ton code continue de travailler avec l'ancienne version. Ajouter un immediate=true dans ton premier combobox pour forcer le transfert vers le backing bean,

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    En rajoutant un immediate="true" dans le combobox et dans le a4j:support me permet de rentrer dans la méthode updateCsp2 (ce qui n'étais pas le cas avant). Cependant, mon champ csp1Selected reste vide (null), et donc la méthode updateCsp2 ne peut pas fonctionner.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Le plus simple est peut etre d'utiliser un component binding pour ta première combo. Ainsi, via le component binding, ta méthode d'update peut immédiatement interroger le composant plutot que d'attendre que les values soient tranférées sur le bean....

    Accesoirement, ajouter un <h:messages/> qui fasse partie de la liste des rerender, c'est pas du luxe pour voir les erreurs JSF....

  5. #5
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Bonjour,
    Le plus propore serait de passer par un valueChangeListener, sans toucher à l'immediate (qui serait une fuite vers l'avant )

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <a4j:region>
    	<h:selectOneMenu value="#{bean.val1}"
    		valueChangeListener="#{bean.val1Changed}">
    		<f:selectItems value="#{bean.list1}" />
    		<a4j:support event="onchange" reRender="list2" />
    	</h:selectOneMenu>
    </a4j:region>
    <a4j:region>
    	<h:selectOneMenu id="list2" value="#{bean.val2}"
    		valueChangeListener="#{bean.val2Changed}">
    		<f:selectItems value="#{bean.list2}" />
    	</h:selectOneMenu>
    </a4j:region>

    et dans la partie Java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void val1Changed(ValueChangeEvent event) {
    	HtmlSelectOneMenu element = (HtmlSelectOneMenu) event.getComponent();
    	//Tu récupères la sélection du premier combo
    	Long val1 = (Long) element.getValue();
    	//Et tu modifies la liste du second combo
    	list2 = ....;
    }

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Désolé de t'embêter encore, mais je n'a jamais vraiment bien compris le fonctionnement de binding.

    Voici ce que j'ai fait (qui ne marche pas bien sur ) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <rich:comboBox binding="#{TableCsp.csp1Selected2}" immediate="true" id="csp1" value="#{TableCsp.csp1Selected}" suggestionValues="#{TableCsp.test}" 
                               directInputSuggestions="true" defaultLabel="Sélectionner une csp">
                    <a4j:support id="blabla" immediate="true" event="onselect" reRender="csp2" action="#{TableCsp.updateCsp2}"/>
                </rich:comboBox>
    et dans ma méthode update, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String val = (String) csp1Selected2.getRowData();
    query = "SELECT * FROM csp_n1 WHERE libelle = '"+val +"'";
    mais visiblement ce n'est pas bon car voici ce que ca me donne :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    "Servlet.service()" pour la servlet Faces Servlet a généré une exception
    java.lang.IllegalArgumentException: Cannot convert org.richfaces.component.html.HtmlComboBox@17a3d13 of type class org.richfaces.component.html.HtmlComboBox to class org.richfaces.component.html.HtmlDataTable
            at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:374)
            at org.apache.el.parser.AstValue.setValue(AstValue.java:132)
            at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249)
            at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93)
            at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:237)
            at com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:119)
            at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
            at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
            at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:144)
            at org.ajax4jsf.taglib.html.facelets.IncludeHandler.applyNextHandler(IncludeHandler.java:81)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
            at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
            at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
            at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
            at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:64)
            at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:131)
            at com.sun.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:310)
            at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:280)
            at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:68)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.tag.jsf.core.ViewHandler.apply(ViewHandler.java:109)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
            at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
            at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
            at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
            at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:144)
            at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
            at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
            at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
            at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
            at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:524)
            at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:567)
            at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
            at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:189)
            at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
            at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
            at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
            at com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.render(PartialTraversalLifecycle.java:106)
            at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:154)
            at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:260)
            at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:366)
            at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:493)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
            at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
            at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
            at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
            at java.lang.Thread.run(Thread.java:619)

  7. #7
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Utilises HtmlComboBox au lieu de UIData dans :
    UIData csp1Selected2;

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Bon, la première méthode fonctionne nickel, mais je n'arrive pas à faire fonctionner celle de djo.mos

    Sinon, j'aurai juste une petite question "hors sujet".
    Lorsque je fais ma requête sql, parfois j'ai un apostrophe dans le libellé que recherche. J'ai essayé ceci mais ca ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val.replaceAll("'", "\'");
    Une petite idée ?

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    alors çà, on évite, surtout quand çà viens d'un navigateur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query = "SELECT * FROM csp_n1 WHERE libelle = '"+val +"'";
    et on lui préfère çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    query = "SELECT * FROM csp_n1 WHERE libelle = ?";
    PreparedStatement stm = connection.prepareStatement(query);
    stm.setString(1,val);
    resultSet=stm.executeQuery();
    C'est propre et sans trafiquage possible par le client.

  10. #10
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup, tout fonctionne maintenant

    Une derniere petite question :
    Est-il possible d'augmenter la taille du combobox ?
    J'ai essayé d'ajouter un style="width:300px;" mais cela ne fonctionne pas

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    y a directement un paramètre width disponible sur le composant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <rich:comboBox width="300" ...../>

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    Ah ok, je n'avais pas vu.

    En tout cas, merci beaucoup pour votre aide

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

Discussions similaires

  1. Problème de onchange dans un rich combobox
    Par lolita2008 dans le forum JSF
    Réponses: 6
    Dernier message: 27/04/2012, 14h16
  2. rich:comboBox a4j:support raffraichir
    Par raimus88 dans le forum JSF
    Réponses: 3
    Dernier message: 29/06/2010, 11h35
  3. probléme avec <rich:comboBox et <a4j:support
    Par aymenroma dans le forum JSF
    Réponses: 5
    Dernier message: 10/06/2009, 15h02
  4. affichage et récupération from rich:comboBox
    Par psycho_xn dans le forum JSF
    Réponses: 7
    Dernier message: 05/09/2008, 16h22
  5. Réponses: 5
    Dernier message: 16/04/2008, 17h53

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