Dans un projet VisualWebApplication (NetBeans 5.5 + VWP), j'ai une page contenant des composants (TextField,DropDown...) crées dynamiquement à partir du backin bean de la page et ajoutés à un PanelLayout de cette même`page (Voir cette discussion pour plus de précisions)
Maintenant, je souhaiterais créer une méthode déclenchée lors d'un evenement sur un composant DropDown crée dynamiquement.
Dans le cas d'un composant "normal" j'ai l'habitue d'utiliser les fonctionnalités du VWP : click droit sur le composant puis " Auto-Submit on change" (VWP rajoute alors dans le tag JSP du composantPuis je double click sur le meme composant (VWP ajoute la propriete
Code : Sélectionner tout - Visualiser dans une fenêtre à part onChange="webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'dropDown1');".
et cree dans le backing bean une fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part valueChangeListenerExpression="#{Page1.dropDown1_processValueChange}"
Bien évidemment ces actions ne sont pas possibles sur un composant crée dynamiquement (car il n'est pas déclaré dans la page JSP).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 public void dropDown1_processValueChange(ValueChangeEvent event) {}
J'ai donc cherché à renseigner les parametres de mon composant de la maniere suivante :
Et crée dans le backingbean la fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 DropDown dd = new DropDown(); dd.setId("dd"); dd.setOnChange("webuijsf.suntheme.common.timeoutSubmitForm(this.form, 'dd);"); MethodExpression me = (MethodExpression)this.getApplication().getExpressionFactory().createMethodExpression(getFacesContext().getELContext(), "#{Page1.dd_processValueChange}", String.class,new Class[] {}); dd.setValueChangeListenerExpression(me); getLayoutPanel1().getChildren().add(0,dd);
Le composant reagit bien à l'evenement en rechargant la page quand je change la valeur selectionnee
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public void dd_processValueChange(ValueChangeEvent event) { System.out.println("VICTOIRE"); }
Malheureusement, la victoire n'a jamais eu lieu ... et a la place j'ai eu le message de defaite suivant :
AbortProcessingException thrown when processing event of type 'javax.faces.event.ValueChangeEvent' during phase 'PROCESS_VALIDATIONS 3' for component with ID or Client ID of 'dd'
javax.faces.event.AbortProcessingException: Method not found: webapplication1.Page1@13acc3c.dd_processValueChange()
Je dois reconnaitre que je manque de connaissances theoriques sur le sujet.
Quelqu'un a-t-il une solution technique a mon probleme ? Sinon, pourrait-on m'eclairer sur le principe de fonctionnement de la gestion d'evenements avec la tchnolopgie JSF (A quel moment du cycle de vie de la requete interviennent les evenements, ou et comment peut-on les recuperer ...)
Sinon, existe-t-il un autre moyen de récupérer la valeur de mon composant dropdown (en redefinissant une de ses methodes appellees lors de sa validation par exemple, mais comment faire??)
Partager