bizard, il doit y'avoir un problème dans ta classe..ça marche bien le a4j:actionparam.
l'attribut name est obligatoire.Code:<a4j:actionparam name="userId" value="{id}" assignTo="#{bean.selectedUserId}" />
bizard, il doit y'avoir un problème dans ta classe..ça marche bien le a4j:actionparam.
l'attribut name est obligatoire.Code:<a4j:actionparam name="userId" value="{id}" assignTo="#{bean.selectedUserId}" />
le a4j:actionParam prend bien la valeur de {id} et l'envoie, mais une seule fois.:?
par contre le f:setPropertyActionListener fonctionne bien plusieurs fois, mais ne prend pas en compte le {id}.
J'ai pensé au début que ca venait de ma classe, c'est pour ca que j'ai voulu tester la démo richFaces, en utilisant une page .xhtml et un bean différent (de façon à ce que le test soit indépendant, et que seule la config de l'application soit commune).
Mais le problème reste le même. La seule différence, c'est que pour la démo richfaces, j'ai pu employer le setPropertyActionListener puisque la valeur est écrite "en dure" et non variable en fonction de la ligne.
J'avoue ne pas comprendre le fonctionnement qui limite à un seul envoi une action sur un bean. Du coup je reste bloqué sur ce problème, qui peux en cacher un autre (comme les trains).
En tout cas merci de consacrer du temps pour m'aider.
Je n'ai pas d'erreur, que ce soit au niveau du <h:messages />, du <a4j:log> ou des log JSF.
Je suis passé à un niveau plus détaillé de debug, afin de suivre plus précisément les log JSF, et j'ai repéré que lors de la première exécution, il y avait cette ligne
beforePhase RENDER_RESPONSE(6)
"get Alex"
afterPhase RENDER_RESPONSE(6)Code:Service class set to default implementation org.ajax4jsf.renderkit.AJAXDataSerializer
Process after phase RENDER_RESPONSE(6)
Qui n'était pas présente lors des appels suivants.(j'ai remis les phases ou se situe les lignes différentes, ainsi que l'appel au get).Code:default tidy parser properties loaded
J'avoue ne pas avoir trouvé à quoi correspondait ces deux lignes. Mais je continue de chercher.
tu peux montrer ton web.xml en entier.
Voilà, de la première à la dernière ligne.Code:
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 <?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <description>jsf proto annuaire.xml</description> <!-- Skin Richfaces --> <context-param> <param-name>org.richfaces.CONTROL_SKINNING</param-name> <param-value>enable</param-value> </context-param> <context-param> <param-name>org.richfaces.CONTROL_SKINNING_CLASSES</param-name> <param-value>enable</param-value> </context-param> <!-- Différents skin pré-implémenter possible, changer le nom du skin pour changer le skin liste des skins pré-existants: blueSky, classic, deepMarine, DEFAULT, emeraldTown, japanCherry, NULL, plain, ruby, wine --> <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param> <context-param> <param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name> <param-value>com.sun.facelets.FaceletViewHandler</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <!-- Importation de la librairie spécifique au projet --> <context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/compoAnnuaire.taglib.xml</param-value> </context-param> <!-- Special Debug Output for Development --> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>server</param-value> </context-param> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <!-- pour maintenir la session ouverte pour une vue (requête multiple) --> <filter> <filter-name>Hibernate Session In View Filter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>Hibernate Session In View Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class> org.apache.myfaces.webapp.StartupServletContextListener</listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <!-- Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>SpringContextServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <!-- Welcome files --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
Merci beaucoup.
ajoute le xmlparser:
Code:
1
2
3
4 <context-param> <param-name>org.ajax4jsf.xmlparser.ORDER</param-name> <param-value>NEKO, TIDY</param-value> </context-param>
sinon peux tu remettre le code qui ne marche pas, la syntaxe {xx}, ne fonctionne qu'avec componentControl il me semble..
Alors après rajout du filtre et chargement de la librairie:
Pour ma liste de personne et l'affichage de la fiche perso.
=> Lors du premier clic, j'obtiens la fiche demandé, et pour les clics suivants, pas de changements de l'id stockée, bref, ca n'a rien changé.
Pour la demo de richFaces:
=>le reRender ne s'effectue pas, je me retrouve avec une erreur que je n'avais pas avant dans le a4j:log.
rep correspondant à l'id du <h:outputText> ou est affiché le nom après sélection.Code:error[19:54:28,045]: New node for ID j_id2:rep is not present in response
Sinon au niveau des log, on a un seul set (premier clic) et puis fini.
Edit: j'avais oublié de répondre à la seconde partie.
Alors j'avais testé deux choses, la partie dataTable et ComponenetControl ne change pas:
et donc les deux solutions:Code:
1
2
3
4 <rich:componentControl event="onRowClick" for="menu" operation="show"> <f:param value="#{personne.nom}" name="nom" /> <f:param value="#{personne.idPersonne}" name="id" /> </rich:componentControl>
Code:
1
2
3
4
5
6
7
8
9
10 <rich:contextMenu attached="false" id="menu"> <f:facet name="header"> <h:outputText value="{nom}" /> </f:facet> <rich:menuItem action="fichePersonne" ajaxSingle="true"> <a4j:actionparam name="userId" value="{id}" assignTo="#{AffichageBean.tbPersonneId}" /> <h:outputText value="fiche" /> </rich:menuItem> </rich:contextMenu>
Code:
1
2
3
4
5
6
7
8
9
10 <rich:contextMenu attached="false" id="menu"> <f:facet name="header"> <h:outputText value="{nom}" /> </f:facet> <rich:menuItem action="fichePersonne" ajaxSingle="true"> <f:setPropertyActionListener value="{id}" target="#{personne.idPersonne}" /> <h:outputText value="fiche" /> </rich:menuItem> </rich:contextMenu>
Dans le premier cas, on observe le comportement que j'ai décrit: une seule modification de la valeur.
Dans le second cas:
Code:
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 An exception occurred javax.faces.FacesException: Exception while calling broadcast on component : {Component-Path : [Class: org.ajax4jsf.component.AjaxViewRoot,ViewId: /Pages/listePersonne.xhtml][Class: javax.faces.component.html.HtmlForm,Id: j_id43][Class: org.richfaces.component.html.ContextMenu,Id: menu][Class: org.richfaces.component.html.HtmlMenuItem,Id: j_id84]} at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:494) at javax.faces.component.UICommand.broadcast(UICommand.java:105) at org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55) at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324) at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299) at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256) at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469) at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:32) at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:103) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:76) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:148) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:423) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:966) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:957) at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:957) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:353) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:226) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:567) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:147) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:126) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:119) at org.mortbay.jetty.Server.handle(Server.java:248) at org.mortbay.jetty.HttpConnection.handlerRequest(HttpConnection.java:360) at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:628) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:611) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:197) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:288) at org.mortbay.jetty.nio.SelectChannelConnector$HttpChannelEndPoint.run(SelectChannelConnector.java:805) at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:475) Caused by: javax.el.PropertyNotFoundException: /WEB-INF/ComposantsCA/Personne/tableauPersonneAll.xhtml @103,40 target="#{personne.idPersonne}": Target Unreachable, identifier 'personne' resolved to null at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:95) at com.sun.facelets.tag.jsf.core.SetPropertyActionListenerHandler$SetPropertyListener.processAction(SetPropertyActionListenerHandler.java:113) at javax.faces.event.ActionEvent.processListener(ActionEvent.java:48) at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:489) ... 34 more
la variable personne (var de la dataTable) est à null dans ce cas.
tu peux créer un simple bean en session et passr l'id à ce bean, ne pas tester avec ton bean AfficheXxx..
et dans le componentControle ajoute.Code:submitMode="ajax"
Bonjour,
Alors déjà j'avais fait une erreur dans le code précédent:
au niveau du setProperty
En fait, fallait mettreCode:
1
2 <f:setPropertyActionListener value="{id}" target="#{personne.idPersonne}" />
Je réaffectait ma valeur à la personne correspondant à la ligne sur laquelle j'ai cliqué. Lors de mes premiers test, j'avais pas fait l'erreur.Code:
1
2 <f:setPropertyActionListener value="{id}" target="#{AffichageBean.tbPersonneId}" />
Donc maintenant j'ai la bonne erreur (enfin, si on peux considérer qu'une erreur soit bonne).
Sinon j'ai bien rajouter le submitMode="Ajax" dans le rich:componentControl, et ca ne marche pas mieux. Il renvoi toujours {id} au lieu de la valeur. (d'où l'erreur du dessus ou il me dit ne pas trouver la fiche avec l'id {id}.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 Caused by: javax.el.ELException: /WEB-INF/ComposantsCA/Personne/fichePersonne.xhtml @12,61 value="#{TbPersonneBean.tbPersonne.nom}": Error reading 'tbPersonne' on type proto.jsf12.bean.form.TbPersonneBean at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:76) at javax.faces.component.UIOutput.getValue(UIOutput.java:68) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getValue(RendererUtils.java:327) ... 43 more Caused by: java.lang.NumberFormatException: For input string: "{id}" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.<init>(Integer.java:660) at proto.jsf12.bean.form.TbPersonneBean.getTbPersonne(TbPersonneBean.java:46) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.getValue(BeanELResolver.java:60) at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:51) at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.access$301(FacesCompositeELResolver.java:46) at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver$4.invoke(FacesCompositeELResolver.java:108) at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.invoke(FacesCompositeELResolver.java:148) at org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:104) at org.apache.el.parser.AstValue.getValue(AstValue.java:97) at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71) ... 45 more
Je suis passé par un autre bean, ContextuelBean:
Je stock donc ma valeur dans ce bean, et au moment de l'enregistrement:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package proto.jsf12.bean.affichage; public class ContextuelBean { private String valeur; public ContextuelBean(){ super(); } public String getValeur() { System.out.println("récupération de la valeur Test"); return valeur; } public void setValeur(String valeur) { System.out.println("stockage de la valeur test: "+valeur); this.valeur = valeur; } }
La valeur stockée est bien {id} et non pas la valeur.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 beforePhase RESTORE_VIEW(1) afterPhase RESTORE_VIEW(1) beforePhase APPLY_REQUEST_VALUES(2) afterPhase APPLY_REQUEST_VALUES(2) beforePhase PROCESS_VALIDATIONS(3) afterPhase PROCESS_VALIDATIONS(3) beforePhase UPDATE_MODEL_VALUES(4) afterPhase UPDATE_MODEL_VALUES(4) beforePhase INVOKE_APPLICATION(5) stockage de la valeur test: {id} afterPhase INVOKE_APPLICATION(5) beforePhase RENDER_RESPONSE(6) valeur FkResponsable null afterPhase RENDER_RESPONSE(6)
faut mettre le même type si l'id est Integer et utiliser actionparam, je ne suis pas sur que setPropertyActionListener accepte la syntaxe JSON {id}.
En utilisant a4j:actionparam, je reviens au début.
L'id est bien stocké, mais une seule fois. (que je passe par AffichageBean ou par ContextuelBean).
à l'appel suivant, il n'y a plus exécution du setValeur (je ne rentre même pas dans la fonction).
Ce comportement est anormal, et j'avoue que je ne vois toujours pas pourquoi.
J'ai continué à faire des recherches, et je n'ai pas trouvé de personnes ayant le même cas de figure que moi. Je pense que c'est lié à un problème de configuration, mais je n'ai rien trouvé ne correspondant pas à ce qui est indiqué sur les différents tuto/site officiel.
Mais bon, je continue de chercher.
tu peux mettre l'exemple de actionparam dans un war, je testerai sur mon poste.
Voilà les sources, y a plus qu'à compiler (j'ai fait sauter les sources, mais avec le POM tu devrai pouvoir récup les sources facilemement).
En espérant que c'est ce que tu voulais.
J'ai mis le minimum syndical pour utiliser richfaces. Et j'ai toujours le même problème au final.
Par contre, je viens de penser, j'utilise jetty pour faire tourner mes test (plug in jetty pour eclipse), est ce que ca pourrait pas venir de là?
dans le pom il y'a pas de rtichfaces-api et richfaces-impl..?
En fait, en prenant org.richfaces.ui il va automatiquement te chercher Api et impl. (dépendance obligatoire).
Du coup dans le POM tu déclares uniquement org.richfaces.ui 3.3.2.SR1
ça marche bien chez moi sous tomcat 6 et du premier coup ;). .
Citation:
beforePhase RESTORE_VIEW(1)
afterPhase RESTORE_VIEW(1)
beforePhase APPLY_REQUEST_VALUES(2)
afterPhase APPLY_REQUEST_VALUES(2)
beforePhase PROCESS_VALIDATIONS(3)
afterPhase PROCESS_VALIDATIONS(3)
beforePhase UPDATE_MODEL_VALUES(4)
afterPhase UPDATE_MODEL_VALUES(4)
beforePhase INVOKE_APPLICATION(5)
enregistrement de la valeur Alex
afterPhase INVOKE_APPLICATION(5)
beforePhase RENDER_RESPONSE(6)
sortie de la valeur: Alex
afterPhase RENDER_RESPONSE(6)
beforePhase RESTORE_VIEW(1)
afterPhase RESTORE_VIEW(1)
beforePhase APPLY_REQUEST_VALUES(2)
afterPhase APPLY_REQUEST_VALUES(2)
beforePhase PROCESS_VALIDATIONS(3)
afterPhase PROCESS_VALIDATIONS(3)
beforePhase UPDATE_MODEL_VALUES(4)
afterPhase UPDATE_MODEL_VALUES(4)
beforePhase INVOKE_APPLICATION(5)
enregistrement de la valeur John
afterPhase INVOKE_APPLICATION(5)
beforePhase RENDER_RESPONSE(6)
sortie de la valeur: John
afterPhase RENDER_RESPONSE(6)
Ok, je vais tester de le mettre sur mon serveur de dev plutôt qu'en local avec jetty alors.
Si c'est ça, je craque.
Bonjour,
je remonte le sujet pour dire que ca marche bien sous tomcat.
J'ai eu un problème avec X11 (un peu bizarre puisque je n'utilise pas de graphique ou autres) et il me manquait 2 petites librairies:
Si ca peux servir à quelqu'un.Code:
1
2 com.sun.el javax.el
Une fois passé sur tomcat 5.5, tout marche très bien.
Tout s'exécute correctement, merci donc pour l'aide. Le problème venait donc du conteneur (jetty) que j'utilisais pour faire mes test.
Sujet résolu :resolu: