Juste pour te prévenir que j'ai corrigé le code que je t'ai donné dans le message précédent. Je l'ai regardé à tête reposée et je me suis rendue compte qu'il était faux.
Juste pour te prévenir que j'ai corrigé le code que je t'ai donné dans le message précédent. Je l'ai regardé à tête reposée et je me suis rendue compte qu'il était faux.
Merci de pour votre code c_nvy ,c vraiment gentil.
Cependant j'ai quelques questions :
Pkoi vous avez éliminé le premier element (kesk vous sous entendez par premier record)
Deuxiement on devrait employé un iteme de budgetType pr lui appliqué les methodes get et set car on ne peut les appliqués sur une liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if ( i != 0 ) ......
Et si j'ai bien compris financeList contiedera des objets triés par type et à l'interieur de ces objet on trouvera un ordre mensuel c ça ?
Je sens que j'y suis presque c_nvy parceque c'est le code dont j'avait besoin mais il reste just quelques détails à éclairsir .
Je n'élimine pas le premier élément mais j'ajoute l'objet finance dans la liste financeList à chaque rupture sur le type sauf la première rupture.
En effet, si on enlève le test suivant :
à la lecture du premier élément de la liste budgetTypeList, on ajoutera l'objet finance (avant même de l'avoir rempli) dans la liste financeList puisque le type étant initialisé à blanc avant d'itérer, il est automatiquement différent du premier type contenu dans la liste budgetTypeList.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if ( i != 0 ).....
Si tu ne comprends pas ça, tu n'as qu'à enlever ce test et tu verras le résultat obtenu en affichant le contenu de la liste financeList.
Jette un oeil au code et tu verras que c'est ce que j'ai corrigé.
Ok maintenant je voit très bien votre idée . J'ai eu quelques difficultés au début pr comprendre ce passage ,car je voulais initialiser le type par l'une des 4 valeurs que je connait déja(on se complique la vie parfois).puisque le type étant initialisé à blanc avant d'itérer, il est automatiquement différent du premier type contenu dans la liste budgetTypeList.
Et désole pr ma 2eme remarque j'avait pas fait attention à la ligne que vous avez rajouter lors de la correction.
Une question consrnant le tag nested:Est ce que j'aurais besoin d'intrduire des bibliothèques ,importer ou ajouter des lignes à l'entete de ma page jsp si je veut l'utiliser?
Une autre remarque : Dans mon formeBean lié a mon action , je déclarerais selement le getter et le setter de la collection et de l'année(getFianceList,setfinanceListe,getAnne,setAnnee) ,car les autres ont été declarés dans la class Finance.
Bon après avoir adapter le code et ajouter les données spécifiques,je me suit retouvé face à une erreur qui est la suivante:
Comme vous pouvez le constater il ne trouve pas la collection ,et si je me trompe pas il s'agit de la finaceListe associée au form de l'action.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 exception org.apache.jasper.JasperException: No collection found org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Après avoir constitué la collection, mets-tu bien à jour la propriété financeList de l'ActionForm via le setter :
Sinon, peux-tu montrer le code de la jsp ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TonActionForm tonActionForm = (TonActionForm) form ; tonActionForm.setFinanceList(financeList) ;
Voici le code ma jsp :
Consulatation1.jsp :
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 <%@ page language="java" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %> <html> <head> <title>JSP for Consultation1Form form</title> </head> <body> <html:form action="/consultation1"> <nested:iterate property="financeList"> typ:<nested:write property="type"/><br/> jav:<nested:text property="jan"/><br/> fev:<nested:text property="fev"/><br/> mars:<nested:text property="mar"/><br/> avril:<nested:text property="avr"/><br/> mai:<nested:text property="mai"/><br/> juin:<nested:text property="jun"/><br/> juil:<nested:text property="jul"/><br/> aout:<nested:text property="aou"/><br/> sep:<nested:text property="sep"/><br/> oct:<nested:text property="oct"/><br/> nov:<nested:text property="nov"/><br/> dec:<nested:text property="dec"/><br/> </nested:iterate> annee : <html:select property="annee" onchange="submit();"> <html:option value ="2007">2007</html:option> <html:option value ="2008">2008</html:option> <html:option value ="2009">2009</html:option> <html:option value ="2010">2010</html:option> </html:select> <br/> </html:form> </body> </html>
Mais l'Action qui remplit la liste est bien celle qui s'exécute avant l'affichage de la jsp ?
Bon en fait j'ai esseyé d'adabter le code que vous m'avez proposer, certes j'ai quelques doutes concernant mon action ,mais bon voila mon code :
Consulmataion1Action.java:
Bon ,faut savoir aussi que j'utilise myeclipse pour generer mes formes et autres.
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 public class Consultation1Action extends Action { public static Integer anne=2008; public static List<BudgetType> budgetTypeList = test1.BudgetType(anne); public static ArrayList<Finance> financeList = new ArrayList<Finance>() ; String typf="" ; public Finance finance=null; { for ( int i=0; i< budgetTypeList.size() ; i++) { BudgetType budgetType=(BudgetType) budgetTypeList.get(i) ; if ( ! typf.equals(budgetType.getType())) { if ( i != 0 ) { financeList.add(finance) ; } finance = new Finance() ; finance.setType(budgetType.getType()) ; if ( budgetType.getMois().equals("jav")) { finance.setJav(budgetType.getBudget());} else { if ( budgetType.getMois().equals("fev")) { finance.setFev(budgetType.getBudget()) ;} if (budgetType.getMois().equals("mars")) { finance.setMars(budgetType.getBudget()); } if ( budgetType.getMois().equals("avril")) { finance.setAvril(budgetType.getBudget()) ;} if (budgetType.getMois().equals("mai")) { finance.setMai(budgetType.getBudget()); } if ( budgetType.getMois().equals("juin")) { finance.setJuin(budgetType.getBudget()) ;} if (budgetType.getMois().equals("juil")) { finance.setJuil(budgetType.getBudget()); } if ( budgetType.getMois().equals("aout")) { finance.setAout(budgetType.getBudget()) ;} if (budgetType.getMois().equals("sep")) { finance.setSep(budgetType.getBudget()); } if ( budgetType.getMois().equals("oct")) { finance.setOct(budgetType.getBudget()) ;} if (budgetType.getMois().equals("nov")) { finance.setNov(budgetType.getBudget()); } if ( budgetType.getMois().equals("dec")) { finance.setDec(budgetType.getBudget()) ;} } } typf=budgetType.getType() ; if ( i == budgetTypeList.size() - 1 ) { financeList.add(finance) ;} // consultation1Form.setFinanceList(financeList) ; }} public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Consultation1Form consultation1Form = (Consultation1Form) form;// TODO Auto-generated method stub Integer anneeSelected=consultation1Form.getAnnee(); consultation1Form.setAnnee(anneeSelected); consultation1Form.setFinanceList(financeList) ; return mapping.findForward("all"); } }
Mais ton code de constitution de liste n'est même pas dans une méthode. Et il n'est pas appelé dans la méthode execute.
De plus, il ne faut pas définir des variables d'instance dans une Action, sauf si elles peuvent être partagées par tous les utilisateurs.
Et puis, l'Action Consultation1Action s'exécute au submit du formulaire. Il est donc normal qu'il ne trouve pas la collection au premier affichage étant donné que le code qui la constitue n'a pas encore été exécuté.
Dans ce cas, il faut que tu ajoutes un tag logic:notEmpty pour conditionner l'affichage de la collection.
Il est aussi étonnant que tu mettes le code d'affichage de la collection avant celui de la liste déroulante étant donné que c'est la sélection dans la liste déroulante qui déclenche l'affichage de la collection.
Dans ce code, j'ai supposé que consultation1Form était le nom du form-bean.
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 <html:form action="/consultation1"> annee : <html:select property="annee" onchange="submit();"> <html:option value ="2007">2007</html:option> <html:option value ="2008">2008</html:option> <html:option value ="2009">2009</html:option> <html:option value ="2010">2010</html:option> </html:select> <br/> <logic:notEmpty name="consultation1Form" property="financeList"> <nested:iterate property="financeList"> typ:<nested:write property="type"/><br/> jav:<nested:text property="jan"/><br/> fev:<nested:text property="fev"/><br/> mars:<nested:text property="mar"/><br/> avril:<nested:text property="avr"/><br/> mai:<nested:text property="mai"/><br/> juin:<nested:text property="jun"/><br/> juil:<nested:text property="jul"/><br/> aout:<nested:text property="aou"/><br/> sep:<nested:text property="sep"/><br/> oct:<nested:text property="oct"/><br/> nov:<nested:text property="nov"/><br/> dec:<nested:text property="dec"/><br/> </nested:iterate> </logic:notEmpty> </html:form>
A toi de le modifier en conséquence.
N'oublie pas de modifier le code de l'Action en mettant le code de constitution de la liste dans une méthode et en appelant cette méthode dans la méthode execute.
Dois-je créer donc une methode en dehors de mon action (à déclarer dans une autre class)qui chargera ma collection puis l'appeler dans l'excute de l'action ?
Ce serait effectivement plus propre de créer une méthode qui renvoie l'ArrayList financeList dans une autre classe et d'appeler cette méthode dans l'Action.
Je viens de faire les choses plus proprement comme convenu,mais cette fois dans ma page je n'est que la liste déroulante des années et rien d'autres .
Ce qui m'a fait repenser au code du chragement de la liste ,et je doit dire que j'ai soulvé quelques nuances que j'arrive pas tres bien à comprendre dans votre algorithme c_nvy surtout ce passage :
Pkoi vous traitez le mois Jav à part ,et vous rassembler les autres mois dans un seul else ,y a t il quelque chose dérrière ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 finance.setType(budgetType.getType()) ; if ( budgetType.getMois().equals("jav")) { finance.setJav(budgetType.getBudget());} } else { if ( budgetType.getMois().equals("fev")) { finance.setFev(budgetType.getBudget()) ;} if (budgetType.getMois().equals("mars")) { finance.setMars(budgetType.getBudget()); } .....
Tout simplement parce que si les données sont bien triées par type et mois, à chaque fois qu'il y a une rupture sur le type, la ligne lue devrait contenir le mois de Janvier.
Mais après réflexion, ça ne peut fonctionner que lorsque les mois sont de type numériques car ils seront bien triés dans le bon ordre (01,02,03,...,12).
Or, il est vrai que dans ton cas, les mois sont de type String. Le mois de Janvier, soit jav, ne sera donc pas le premier mois lu.
Dans ce cas, il faut effectivement revoir l'algorithme.
Mais s'il n'existait pas des pudget pr les mois de janvier ?ça donnerait quoi dans ce cas ?
Excuse moi d'avoir à poser tt ces questions . Mais il me manque quelques truc à comprendre dans votre algo surtout vers la fin .
Rq :Est ce que je pourrait utiliser un while (type =...) à l'interieur de la boucle for pour avoir tout les budgets d'un type donné puis les affécter par mois par un simple if .
Car je croit pas que l'ordre par mois soit important apres reflexion.
Se sont des prprety qui vont etre recupérer via le nested.Pas vrai ?
Quand j'ai donné cet exemple de code, j'ai bien précisé qu'il n'était pas optimisé.C'était juste pour te donner une idée de comment procéder pour constituer la liste finale qui permette l'affichage et ensuite la modification via les tags nested.
Ce problème est un problème de programmation et non un problème Struts.
Bon après reflexion j'ai réussi à trouver un code qui fera l'affaire pr charger ma liste , cependant le nested n'affiche rien sur ma jsp j'ai just la liste déroulante .Pkoi les champs associés au tag nested restent -elles invisibles ?
Bon voila mon nouveau code pour charger la liste :
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 public static List<BudgetType> budgetTypeList = test1.getbudgetType(Consultation1Action.anny); public static ArrayList<Finance> financeList = new ArrayList<Finance>() ; public static Finance finance1=null; public static Finance finance2=null; public static ArrayList<Finance> chargerList(){ for ( int i=0; i< budgetTypeList.size() ; i++) { if (budgetTypeList.get(i).getType().equals("type1")){ finance1 = new Finance() ; finance1.setType(budgetTypeList.get(i).getType()) ; if ( budgetTypeList.get(i).getMois().equals("jav")) { finance1.setJav(budgetTypeList.get(i).getBudget());} else if(budgetTypeList.get(i).getMois().equals("fev")){ { finance1.setFev(budgetTypeList.get(i).getBudget());} } } else if (budgetTypeList.get(i).getType().equals("type2")){ finance2 = new Finance() ; finance2.setType(budgetTypeList.get(i).getType()) ; if ( budgetTypeList.get(i).getMois().equals("jav")) { finance2.setJav(budgetTypeList.get(i).getBudget());} else if(budgetTypeList.get(i).getMois().equals("fev")){ { finance2.setFev(budgetTypeList.get(i).getBudget());} } } if ( i == budgetTypeList.size() - 1 ) { financeList.add(finance1) ; financeList.add(finance2) ; } }return financeList; }
par contre pour la jsp (consultation1.jsp) :
Et finallement mon Consultatio1Action :
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 <%@ page language="java" pageEncoding="ISO-8859-1"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> <%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%> <html> <head> <title>JSP for Consultation1Form form</title> </head> <body> <html:form action="/consultation1"> annee : <html:select property="annee" onchange="submit();"> <html:option value ="2007">2007</html:option> <html:option value ="2008">2008</html:option> <html:option value ="2009">2009</html:option> <html:option value ="2010">2010</html:option> </html:select> <br/> <logic:notEmpty name="consultation1Form" property="financeList"> <nested:iterate property="financeList"> typ:<nested:write property="type"/><br/> jav:<nested:text property="jav"/><br/> fev:<nested:text property="fev"/><br/> mars:<nested:text property="mars"/><br/> avril:<nested:text property="avril"/><br/> mai:<nested:text property="mai"/><br/> juin:<nested:text property="juin"/><br/> juil:<nested:text property="juil"/><br/> aout:<nested:text property="aout"/><br/> sep:<nested:text property="sep"/><br/> oct:<nested:text property="oct"/><br/> nov:<nested:text property="nov"/><br/> dec:<nested:text property="dec"/><br/> </nested:iterate> </logic:notEmpty> </html:form> </body> </html>
Est que j'ai oublier un truc par hazard consernat le tag nested .
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class Consultation1Action extends Action { public static Integer anny ; public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Consultation1Form consultation1Form = (Consultation1Form) form;// TODO Auto-generated method stub Integer anneeSelected=consultation1Form.getAnnee(); anny=anneeSelected ; //consultation1Form.setAnnee(anneeSelected); consultation1Form.setFinanceList(Charger.financeList) ; return mapping.findForward("all"); }
Le problème ne vient pas des tags nested mais tu ne fais pas appel à la méthode chargerList() dans ton Action.
De plus, plutôt que de définir une variable d'instance anny dans l'Action, ce qui est déconseillé, tu devrais plutôt passer l'année en paramètre de la méthode chargerList.
Méthode chargerList :
Code de l'Action :
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 public static ArrayList<Finance> chargerList(Integer annee) { List<BudgetType> budgetTypeList = test1.getbudgetType(annee); ArrayList<Finance> financeList = new ArrayList<Finance>() ; Finance finance1=null; Finance finance2=null; for ( int i=0; i< budgetTypeList.size() ; i++) { if (budgetTypeList.get(i).getType().equals("type1")){ finance1 = new Finance() ; finance1.setType(budgetTypeList.get(i).getType()) ; if ( budgetTypeList.get(i).getMois().equals("jav")) { finance1.setJav(budgetTypeList.get(i).getBudget());} else if(budgetTypeList.get(i).getMois().equals("fev")){ { finance1.setFev(budgetTypeList.get(i).getBudget());} } } else if (budgetTypeList.get(i).getType().equals("type2")){ finance2 = new Finance() ; finance2.setType(budgetTypeList.get(i).getType()) ; if ( budgetTypeList.get(i).getMois().equals("jav")) { finance2.setJav(budgetTypeList.get(i).getBudget());} else if(budgetTypeList.get(i).getMois().equals("fev")){ { finance2.setFev(budgetTypeList.get(i).getBudget());} } } if ( i == budgetTypeList.size() - 1 ) { financeList.add(finance1) ; financeList.add(finance2) ; } } return financeList; }
Et sinon, concernant les directives taglib dans la jsp, tu peux utiliser les uri pour les tld logic et nested comme pour les tlds html et bean :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class Consultation1Action extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Consultation1Form consultation1Form = (Consultation1Form) form; Integer anneeSelected=consultation1Form.getAnnee(); consultation1Form.setFinanceList(Charger.chargerList(anneeSelected) ; return mapping.findForward("all"); } }
Je précise que je n'ai pas vérifié la logique du code de la méthode chargerList().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 <%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager