c'est bizard ton cas, tu dois avoir quelque chose qui ne va pas dans la configuration ou dans ta page.
Normalement un bean en keepAlive, n'est jamais réinitialisé entre deux requete ajax, le constructeur est appelé qu'une fois.
Version imprimable
c'est bizard ton cas, tu dois avoir quelque chose qui ne va pas dans la configuration ou dans ta page.
Normalement un bean en keepAlive, n'est jamais réinitialisé entre deux requete ajax, le constructeur est appelé qu'une fois.
Si ça te dérange pas tu pourrais tester cet exemple la et me dire si tu le même la chose que moi, s'il te plait.
Salut Sniper,
J'ai un test un poil plus compliqué, mais j'ai compris le fonctionnement de KeepAlive en le fessant. Je te donne les sources :
Le bean en (request) :
et la page :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 public class Bean { /** Creates a new instance of Bean */ private List<String> list; public Bean() { list = new ArrayList<String>(); System.out.println("Test !!!!"); } private String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } public void addValue(){ list.add(value); } public List<String> getList() { return list; } public void setList(List<String> list) { this.list = list; } }
C'est un exemple tout simple, tu tape un mot dans le champs de saisi et si tu appuis sur add il se met dans la list, puis cette list est affiché dans la table.Code:
1
2
3
4
5
6
7
8
9
10
11 <a4j:keepAlive beanName="bean" /> <h:panelGrid columns="3"> <h:inputText value="#{bean.value}"/> <a4j:commandButton value="Add !" reRender="table" action="#{bean.addValue}"/> <h:dataTable id="table" value="#{bean.list}" var="var" > <h:column> <h:outputText value="#{var}"/> </h:column> </h:dataTable> </h:panelGrid>
Alors si j'enlève le keepAlive, la list est réinitialisée à chaque fois, et au niveau de l'affichage j'aurais toujours 1 entrée dans la table. La dessus on est d'accord.
Par contre si je mets le keepAlive, la list n'est pas réinitialisée, mais je persiste (désolé), mais le programme passe bien dans le constructeur ! Dans la console à chaque fois que je clique sur le bouton add, "test !!!!" est affiché.
Donc pour résumer même avec keepAlive, le programme passe bien dans le constructeur, mais les attribut ne sont pas réinisitialisé (qu'ils aient des getter et setter ou pas).
Donc il faut que trouve ce qui est réinitialisé dans le constructeur, et que je corrige le problème.
tu es sur de ton cas :?:?:?
Si le constructeur est appelé c'est à dire qu'il y'a une nouvelle instance de l'objet créée, j'ai testé avec Rifhcfaces 3.3.2.GA et le constructeur est appelé qu'une seule fois ..
J'utilise Richfaces 3.3.3. Mais alors s'il le prog ne passe pas par le constructeur, pourquoi il affiche le Systeme.out.println ? Je vais tester avec ta version de Richfaces.
Heu par contre j'ai une exception quand je déploie mon project :
Tu utilise qu'elle version de apache commons ?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 com.sun.faces.config.ConfigurationException: Source Document: jar:file:/C:/Users/Erouan/Documents/NetBeansProjects/TestWeb2/build/web/WEB-INF/lib/richfaces-impl-3.2.2.GA.jar!/META-INF/faces-config.xml Cause: Unable to create a new instance of 'org.ajax4jsf.application.AjaxStateManager': java.lang.reflect.InvocationTargetException at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:295) at com.sun.faces.config.processor.ApplicationConfigProcessor.setStateManager(ApplicationConfigProcessor.java:503) at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:296) at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114) at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:116) at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114) at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:223) at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:335) at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:223) at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4664) at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:535) at org.apache.catalina.core.StandardContext.start(StandardContext.java:5266) at com.sun.enterprise.web.WebModule.start(WebModule.java:499) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:928) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1947) at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1619) at com.sun.enterprise.web.WebApplication.start(WebApplication.java:90) at org.glassfish.internal.data.EngineRef.start(EngineRef.java:126) at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:241) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183) at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272) at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1176) at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$900(CommandRunnerImpl.java:83) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224) at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:365) at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204) at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166) at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:265) ... 49 more Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LazyMap at org.ajax4jsf.application.ComponentsLoaderImpl.<init>(ComponentsLoaderImpl.java:27) at org.ajax4jsf.application.AjaxStateManager.<init>(AjaxStateManager.java:142) ... 54 more Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.map.LazyMap at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at org.glassfish.web.loader.WebappClassLoader.findClass(WebappClassLoader.java:959) at org.glassfish.web.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1430) ... 56 more
EDIT : désolé j'ai trouvé 3.2.1
Bonjour,
Après une bataille acharné contre JSF, j'ai laissé tombé le scope request et le KeepAlive, et j'ai cherché à mettre en place une solution (plus ou moins barbare) avec un scope session. J'ai créé un autre managed bean, appelé Navigation en scope session, et c'est lui qui va gérer les redirections de page et la durée des autres manageds beans en scope session grâce à ce petit bout de code :
Code:
1
2
3
4
5 ValueExpression createValueExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{databaseexplorer}", DabaseExplorer.class); createValueExpression.setValue(FacesContext.getCurrentInstance().getELContext(), null); NavigationHandler hand = FacesContext.getCurrentInstance().getApplication().getNavigationHandler(); hand.handleNavigation(FacesContext.getCurrentInstance(), null, Constant.EXPLORER_NAVIGATION_KEY);
En gros, à chaque fois que je veux changer de page je ré-instancie le bean concerné en mettant sa binding value à null (une nouvelle instance sera créé automatiquement), et j'effectue la redirection grâce au NavigationHandler.
Par contre ça ne marche pas lorsque l'on veux rafraichir la page courante avec un managed bean tout neuf. Il faut faire ça de cette façon :
Code:
1
2
3
4
5
6
7
8
9 ValueExpression createValueExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().createValueExpression(FacesContext.getCurrentInstance().getELContext(), "#{databaseexplorer}", DabaseExplorer.class); createValueExpression.setValue(FacesContext.getCurrentInstance().getELContext(), null); createValueExpression.setValue(FacesContext.getCurrentInstance().getELContext(), new DabaseExplorer()); FacesContext context = FacesContext.getCurrentInstance(); String viewId = context.getViewRoot().getViewId(); ViewHandler handler = context.getApplication().getViewHandler(); UIViewRoot root = handler.createView(context, viewId); context.setViewRoot(root);
Ce coup ci, il faut d'abord mettre la value binding à null, puis réinstancier à "la main" le managed bean. Sinon soit il vous fait croire que le managed à été ré-instancier, mais à la moindre manipulation de la page, il vous ressort l'ancienne instance. Ou alors il vous garde tout simplement l'ancien. Enfin pour actualiser la page je créé un nouveau UIViewRoot qui à les mêmes caractéristiques que l'ancien, et le met dans le context courant.
Voila, c'est la seule solution que j'ai trouvé, qui loin d'être parfaite je pense. Enfin si vous avez des questions, n'hésitez pas :mrgreen:.
Bonne journée
PS : Et encore merci de m'avoir aidé Sniper :ccool:
Je ne comprends ce que tu voulais faire,tu n'a tout déclaré dans ton problème avec keepAlive,
J'ai l'impression que tu te complique un peu la tâche..
Si tu fais une redirection, le bean en keepAlive n'est plus 'alive'
Un bean en session reste pendant toute la durée de la session utilisateur.
Ce n'est pas la bonne et logique utilisation des beans..
Si tu explique un peu pourquoi tu fais la navigation dans la classe, et le problème rencontré avec le scope session pour essayer de recréer le viewRoot..
Mon problème c'est que avec le scope request + KeepAlive, quand je cumulais plusieurs requete ajax, la liste, que j'affichais dans un extendatatable, était réinitialisé. Donc j'ai trouvé cette solution, j'avoue pas très simple, mais qui a le mérite de fonctionner.
Si tu as que des requêtes ajax, la liste ne sera pas réinitialisée, regarde l'exemple de Richfaces, ce n'est pas un problème Richfaces, tu dois avoir un problème dans ton code ou dans ton environnement.
Ceci dit, avec un bean en session tu n'aura pas de problème.
Je te conseille de recommencer , d'utiliser keepAlive avec un autre composant, un simple inputText comme l'exemple de la démo de Richfaces..
Ba écoute j'ai tout testé, j'ai fait des exemples (qui marche là), mais sur mon application ça ne marche pas je te donne mes sources :
La page xhtml :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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.smartattitudes.framework.beans; import com.smartattitudes.framework.constants.Constant; import com.smartattitudes.framework.constants.DatabaseType; import com.smartattitudes.framework.sessionbeans.DatabaseConnectionBeanRemote; import com.smartattitudes.framework.utils.Column; import com.smartattitudes.framework.utils.InsertLocation; import com.smartattitudes.framework.utils.SelectItemFormated; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; import java.sql.SQLException; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.PostConstruct; import javax.faces.component.html.HtmlPanelGroup; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.ajax4jsf.component.html.HtmlAjaxSupport; import org.richfaces.component.html.HtmlExtendedDataTable; import org.richfaces.model.Ordering; import org.richfaces.model.selection.SimpleSelection; /** * * @author Erouan */ @org.ajax4jsf.model.KeepAlive public class DabaseExplorer implements ActionListener, Serializable { private DatabaseConnectionBeanRemote travel; // @EJB // private DatabaseConnectionBeanLocal travel; private String tableName; private String variableTable; private String nameColumnName; private String nameColumnDescription; private String nameColumnId; private Object deleteCheckboxValue; private List<List<Object>> listTable; private List<Boolean> deleteCheckboxStatus; private List<Column> columnsName; private Map<String, Object> arraySelection; private Ordering sortOrder; private SimpleSelection selection; private List<InsertLocation> insertsLocation; private NavigationBean navigation; private HtmlPanelGroup tablePanel; private HtmlExtendedDataTable dataTable; /** Creates a new instance of MainPage */ public DabaseExplorer() { try { Hashtable ht = new Hashtable(); ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); ht.put(Context.PROVIDER_URL, "t3://localhost:7001"); InitialContext ctx = new InitialContext(ht); travel = (DatabaseConnectionBeanRemote) ctx.lookup("DatabaseConnectionbean#" + DatabaseConnectionBeanRemote.class.getName()); initDatabaseConnection(); initTableParam(); initListTable(); } catch (NamingException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } private void initDatabaseConnection() { try { travel.createGroup("group1"); travel.createNewDatabaseConnection("group1", "Oracle database", "wsa", "localhost", "1521", DatabaseType.ORACLE, "wsa", "wsa"); travel.setDefaultDatabase("Oracle database"); } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } private void initTableParam() { try { FacesContext ctx = FacesContext.getCurrentInstance(); navigation = (NavigationBean) ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), "#{NavigationBean}", NavigationBean.class).getValue(ctx.getELContext()); tableName = navigation.getCurrentTableSelect(); variableTable = travel.getColumnTableName(tableName); dataTable = new HtmlExtendedDataTable(); } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (FileNotFoundException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } private void initListTable() { try { listTable = travel.getAllTableByOderByAndActive(tableName, Constant.ORDERBY_ASC); columnsName = new ArrayList<Column>(); List<Object> columnNameTmp = travel.getMetaDataTable(tableName); for (int i = 0; i < columnNameTmp.size(); i++) { columnsName.add(new Column(columnNameTmp.get(i))); if (columnsName.get(i).getHeader().toString().contains("_ORDERBY")) { columnsName.get(i).setSortOrder(Ordering.ASCENDING); } } columnsName.add(0, new Column("")); nameColumnName = travel.getColumnTableName(tableName) + "_NAME"; nameColumnDescription = travel.getColumnTableName(tableName) + "_DESCRIPTION"; nameColumnId = travel.getColumnTableName(tableName) + "_ID"; for (int i = 0; i < listTable.size(); i++) { if (deleteCheckboxStatus == null) { listTable.get(i).add(0, false); } else { listTable.get(i).add(0, deleteCheckboxValue); } } } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } public void processAction(ActionEvent event) throws AbortProcessingException { if (event.getComponent().getId().equals("selectOneListSuppord")) { } else { if (insertsLocation == null) { insertsLocation = new ArrayList<InsertLocation>(); } String[] data = ((HtmlAjaxSupport) event.getComponent()).getData().toString().split("#"); boolean buff = true; for (int i = 0; i < insertsLocation.size(); i++) { if (Integer.parseInt(data[1]) == insertsLocation.get(i).getId()) { if (insertsLocation.get(i).getColumnName().equals(data[0])) { insertsLocation.get(i).setValue(data[2]); buff = false; } } } if (buff) { insertsLocation.add(new InsertLocation(Integer.parseInt(data[1]), data[0], data[2])); } } } public void insertRowsSubmit() { try { if (insertsLocation != null) { if (!insertsLocation.isEmpty()) { travel.updateOneCase(tableName, insertsLocation); } } } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } public void takeSelection() { System.out.println("DatabaseExplorer bean => take selection !"); try { Iterator<Object> iterator = selection.getKeys(); boolean buff = true; for (int i = 0; i < columnsName.size(); i++) { if (columnsName.get(i).getSortOrder() == Ordering.ASCENDING) { arraySelection = travel.getArraySelection(tableName, columnsName.get(i).getHeader().toString(), Constant.ORDERBY_ASC, Integer.parseInt(iterator.next().toString())); buff = false; } else if (columnsName.get(i).getSortOrder() == Ordering.DESCENDING) { arraySelection = travel.getArraySelection(tableName, columnsName.get(i).getHeader().toString(), Constant.ORDERBY_DES, Integer.parseInt(iterator.next().toString())); buff = false; } } if (buff) { arraySelection = travel.getArraySelection(tableName, null, Constant.ORDERBY_UNS, Integer.parseInt(iterator.next().toString())); } } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (FileNotFoundException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } public void resetOrderBy() { for (int i = 0; i < columnsName.size(); i++) { columnsName.get(i).setSortOrder(Ordering.UNSORTED); if (columnsName.get(i).getHeader().toString().contains("_ORDERBY")) { columnsName.get(i).setSortOrder(Ordering.ASCENDING); } } } public void deleteCheckboxSubmit() { for (int i = 0; i < listTable.size(); i++) { listTable.get(i).set(0, deleteCheckboxValue); } } public void deleteRowsSubmit() { for (int i = listTable.size() - 1; i >= 0; i--) { System.out.println("MainPage bean => listTable.get(" + i + ").get(0) : " + listTable.get(i).get(1)); if (listTable.get(i).get(0).equals(Boolean.TRUE)) { try { travel.deleteById(tableName, String.valueOf(listTable.get(i).get(1))); listTable.remove(i); } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (FileNotFoundException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } } } deleteCheckboxValue = false; } public List<SelectItemFormated> getNameAndId() { try { return travel.getNameAndId(tableName); } catch (SQLException ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } catch (Exception ex) { Logger.getLogger(DabaseExplorer.class.getName()).log(Level.SEVERE, null, ex); } return null; } public void test() { // System.out.println("MainPage bean => test"); // System.out.println("MainPage bean => Insert location list : " + insertsLocation); } public List<List<Object>> getListTable() { return listTable; } public void setListTable(List<List<Object>> listTable) { this.listTable = listTable; } public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } public String getNameColumnName() { return nameColumnName; } public void setNameColumnName(String nameColumnName) { this.nameColumnName = nameColumnName; } public Ordering getSortOrder() { return sortOrder; } public void setSortOrder(Ordering sortOrder) { this.sortOrder = sortOrder; } public SimpleSelection getSelection() { return selection; } public void setSelection(SimpleSelection selection) { this.selection = selection; } public Map<String, Object> getArraySelection() { return arraySelection; } public void setArraySelection(Map<String, Object> arraySelection) { this.arraySelection = arraySelection; } public String getNameColumnDescription() { return nameColumnDescription; } public void setNameColumnDescription(String nameColumnDescription) { this.nameColumnDescription = nameColumnDescription; } public String getNameColumnId() { return nameColumnId; } public void setNameColumnId(String nameColumnId) { this.nameColumnId = nameColumnId; } public List<Column> getColumnsName() { return columnsName; } public void setColumnsName(List<Column> columnsName) { this.columnsName = columnsName; } public Object getDeleteCheckboxValue() { return deleteCheckboxValue; } public void setDeleteCheckboxValue(Object deleteCheckboxValue) { this.deleteCheckboxValue = deleteCheckboxValue; } public NavigationBean getNavigation() { return navigation; } public void setNavigation(NavigationBean navigation) { this.navigation = navigation; } public HtmlPanelGroup getTablePanel() { return tablePanel; } public void setTablePanel(HtmlPanelGroup tablePanel) { this.tablePanel = tablePanel; } public HtmlExtendedDataTable getDataTable() { return dataTable; } public void setDataTable(HtmlExtendedDataTable dataTable) { this.dataTable = dataTable; } }
Le problème c'est que la sélection ne marche pas correctement quand je fait un OrderBy de ma tableau. Je n'ai pas les bonnes valeurs qui affiche.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 <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:a4j="http://richfaces.org/a4j" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:rich="http://richfaces.org/rich" xmlns:f="http://java.sun.com/jsf/core"> <head> <title> <h:outputText value=""/> </title> <link rel="stylesheet" type="test/css" href="stylesheet.css"/> </head> <body> <h:form> <a4j:keepAlive beanName="databaseexplorer"/> <ui:include src="includes/menu/domainmenu.xhtml"/> <div class="panel_main"> <div class="panel_table"> <rich:extendedDataTable rows="18" binding="#{databaseexplorer.dataTable}" value="#{databaseexplorer.listTable}" selectionMode="single" selection="#{databaseexplorer.selection}" var="list" width="50%" id="databaseTable" columnClasses="col"> <f:facet name="header"> <h:outputText value="#{databaseexplorer.tableName}"/> </f:facet> <rich:columns sortBy="#{list[i]}" sortable="#{i!=0}" sortOrder="#{columnName.sortOrder}" selfSorted="false" value="#{databaseexplorer.columnsName}" label="#{databaseexplorer.columnsName[i].header}" var="columnName" index="i" visible="#{(databaseexplorer.nameColumnName == columnName.header ? 'true':'false' || i==0) || ('DATABASE_ORDERBY' == columnName.header ? 'true':'false')}" width="#{i==0?'50px' : '25%'}"> <f:facet name="header"> <h:panelGroup> <h:selectBooleanCheckbox rendered="#{i==0}" value="#{databaseexplorer.deleteCheckboxValue}"> <a4j:support event="onclick" action="#{databaseexplorer.deleteCheckboxSubmit}" reRender="databaseTable"/> </h:selectBooleanCheckbox> <h:outputText value="#{columnName.header}" rendered="#{i!=0}"/> </h:panelGroup> </f:facet> <rich:inplaceInput value="#{list[i]}" rendered="#{i!=0}" selectOnEdit="true" editEvent="ondblclick"> <a4j:support event="onviewactivated" data="#{columnName.header}##{list[1]}##{list[i]}" actionListener="#{databaseexplorer.processAction}"/> </rich:inplaceInput> <h:selectBooleanCheckbox value="#{list[i]}" rendered="#{i==0}"/> <f:facet name="footer"> <a4j:commandButton value="Delete row(s)" action="#{databaseexplorer.deleteRowsSubmit}" reRender="databaseTable" rendered="#{i==0}"/> </f:facet> </rich:columns> <a4j:support event="onselectionchange" action="#{databaseexplorer.takeSelection}" reRender="information"/> </rich:extendedDataTable> <rich:datascroller for="databaseTable" reRender="databaseTable"/> <a4j:commandButton value="Insert" action="#{databaseexplorer.insertRowsSubmit}"/> <a4j:commandButton value="Reset orderby" action="#{databaseexplorer.resetOrderBy}" reRender="databaseTable"/> </div> <div class="panel_information"> <rich:panel id="information"> <f:facet name="header"> <h:outputText value="Information (Item Id : #{databaseexplorer.arraySelection[databaseexplorer.nameColumnId]})"/> </f:facet> <h:panelGrid columns="2"> <h:outputText value="Create by : "/> <h:outputText value="#{databaseexplorer.arraySelection['CREATED_USER']}"/> <h:outputText value="On : "/> <h:outputText value="#{databaseexplorer.arraySelection['CREATED_DATE']}"/> <h:outputText value="Name : "/> <h:outputText value="#{databaseexplorer.arraySelection[databaseexplorer.nameColumnName]}"/> <h:outputText value="Description : "/> <h:outputText value="#{databaseexplorer.arraySelection[databaseexplorer.nameColumnDescription]}"/> </h:panelGrid> </rich:panel> </div> </div> <a4j:log popup="false" level="ALL" style="width: 800px; height: 300px;"></a4j:log> </h:form> </body> </html>
EDIT : Je ne sais pas si tu te souviens, Sniper le fait que le programme passe quand même dans constructeur (même dans mes exemples les plus basic) réinitialise juste ma liste en passant par le lookup. Je pense que si j'utilisai les session EJB en Local ça ne ferais pas la même chose. Le truc c'est que je n'arrive pas utilisé les session EJB Local avec weblogic. Enfin c'est un autre problème.