Bonjour,
mon problème du jour concerne une propriété de ma JSP dont j'ai l'impression que le setter (dans le bean) est appelé dans la mauvaise phase...
Comme je ne commence que doucement à appréhender les différentes phases et leur manipulation, il est possible que j'aie commis une erreur de raisonnement.
L'idée là est d'importer un fichier puis d'en afficher les résultats :
- d'une part sous la forme d'une table
- d'autre part sous la forme d'un changement de sélection courante dans une liste défilante
Comme je dois prendre en compte les valeurs d'un certain nombre de champs de ma page avant de réaliser l'upload, je rempile l'événement associé au listener du fileupload afin de le déclencher dans la phase UPDATE_MODEL à la place de la ANY_PHASE (qui je suppose correspond à la phase"APPLY REQUEST VALUES").
Jusque là ça fonctionne... sauf pour la mise à jour de la sélection courante : son setter (setField1CurrentCurrentValue()) est appelé après mon listener avec l'ancienne valeur de la page, et ce sans que la nouvelle valeur calculée aie été mise à jour dans ma page.
J'ai tenté de déplacer mon événement plus loin (dans la phase "INVOKE_APPLICATION"), mais là encore le setter est de nouveau appelé après le listener, et vient écraser ma valeur fraîchement calculée.
Je n'arrive pas à comprendre que celà fonctionne pour les champs de la table, et pas pour la sélection courante...
Donc, si qqn a une idée pour éclairer ma lanterne vacillante...
Code ci-dessous :
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 <h:form id="form_Import"> <rich:fileUpload id="upload" acceptedTypes="csv" fileUploadListener="#{monBean.fileUploadListener}"> <a4j:support event="onuploadcomplete" oncomplete="SomeJavaScript();" reRender="form_Import" /> /> <a4j:support event="ontyperejected" oncomplete="ToggleSomeWarningMessage()" reRender="errorField" /> </rich:fileUpload> <h:outputText visible="false" id="errorField" style="color: red" value=" "/> <a4j:region id="tableImportedRegion"> <rich:extendedDataTable value="#{MyBean.importedFields}" var="importedFields" id="tableImportedFields"> <f:facet name="caption"> <h:outputText value="${bundle.some_caption}" /> </f:facet> <rich:column width="0%" visible="false"> <f:facet name="header"> <h:outputText value="#{bundle.field_id}" /> </f:facet> <h:outputText value="#{importedFields.id}" id="Id" /> </rich:column> <rich:column width="11%"> <f:facet name="header" > <h:selectOneMenu value="#{MyBean.field1CurrentValue}"> <f:selectItems value="#{MyBean.allPossibleValues}"/> </h:selectOneMenu> </f:facet> <h:outputText value="#{importedFields.field1}"/> </rich:column> <!-- same for Field2, 3, 4, ...--> <f:facet name="footer"> <h:outputText value="#{bundle.some_footer_text}" /> </f:facet> </rich:extendedDataTable> </a4j:region> </h:form>
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 private int field1CurrentValue; // + getter/setter private List<SelectItem> allPossibleValues; // + getter/setter /** * Triggered once a file is uploaded. * * @param event the upload event * @throws Exception the exception */ public final void fileUploadListener(final UploadEvent event) throws Exception { final PhaseId phaseId = event.getPhaseId(); if (phaseId.equals(PhaseId.ANY_PHASE)) { // In order to retrieve data updated from the model // we postpone the management of the file upload event event.setPhaseId(PhaseId.INVOKE_APPLICATION); // ou UPDATE_MODEL event.queue(); } else if (phaseId.equals(PhaseId.INVOKE_APPLICATION)) {// ou UPDATE_MODEL myRawFile = event.getUploadItem().getData(); loadImportedFields(myRawFile); } } /** * Loads the data to importedFields * * @param data the imported fields * @throws Exception the exception */ private void loadImportedFields(final String data) throws Exception { // MANY OPERATIONS importedFields = doManyThings(); // => OK so far field1CurrentValue = getField1NewValueAccordingToImportedFields(); // and so one for field 2, 3, ... }
Partager