Struts (probleme dans un formulaire )

Fermé
sssmix - 1 mai 2008 à 13:09
 gentil58 - 3 févr. 2010 à 15:41
Bonjour,
je travaille sur mon projet de fin d'année et j'utilise struts mais je suis bloqué là!
j'ai créé un formulaire qui recupere des donnée saisies par l'utilisateur pour les inserer dans la base :

<%
String string = "select r.ARTICLE,r.PARAGRAPHE,r.LIGNE,r.INTITULE,d.TYPE from intendensao.rubrique r,intendensao.depenses d,intendensao.budget b where r.ID_RUBRIQUE=d.ID_RUBRIQUE and r.exercice='"+exercice+"'";
MyConnection connexion = new MyConnection();
ResultSet result = connexion.getRequest(string);
while(result.next()){

%>
<tr>
<td><%=result.getString("ARTICLE")%></td>
<td><%=result.getString("LIGNE")%></td>
<td><%=result.getString("PARAGRAPHE")%></td>
<td><%=result.getString("INTITULE")%></td>
<td><%=result.getString("TYPE")%></td>
<td><html:text property="creditOuvert" value="0" /></td>
<td><html:text property="disponible" value="0" /></td>
</tr>
<%
}
%>
<tr>
<td colspan="7"><html:submit value="enregistrer" /></td>
</tr>
</tbody>


le probleme ce que les deux champs de texte "creditOuvert et "disponible" sont inclus dans la boucle while et donc créés automatiquement tous sous les mêmes noms, ce qui me cause un probleme dans le bean ActionForm, parce que je ne sais pas comment appeler les attributs du bean qui doivent normalement correspondre aux champs du formulaire, et j'ai besoin de définir les getter et setter pour chaque attribut creditOuvert et disponible.
sachant que je connais le nombre de ligne retourné par la boucle!
quelqu'un a une idée?

5 réponses

Marco la baraque
3 mai 2008 à 12:15
Salut,
Je ne connais pas super bien struts mais voici 2 solutions envisageables:
1/ Comme tu connais le nombre de lignes retournées par ta boucle, rien ne t'empêche de créer tes attributs dans ta classe action, ainsi que les accesseurs :
private String creditOuvert0;
private String creditOuvert1;
...
private String disponible0;
private String disponible1;
...
public void setCreditOuvert0(String co0){
...
}
...

Une fois ceci fait, rien ne t'empêche de le fournir à ta request et de les utiliser dans un bean dans ta jsp (du moins avec struts2 c'est possible, avec le 1 j'imagine que c'est faisable aussi).

2/Autre solution:
Je ne sais pas si c'est choisi ou non, mais plutôt que d'afficher tes données sous forme de tableau, tu pourrais disposer ça autrement. Par exemple un menu déroulant pour sélectionner l'article, et une fois que c'est fait un menu déroulant pour choisir le paragraphe apparait...

+ L'avantage serait qu'au final, tu n'aurais qu'un seul choix possible, donc tes identifiants seraient uniques, et ce serait plus agréable pour l'utilisateur car il ne passe pas de temps à chercher l'information qu'il veut modifier dans ton tableau, il la choisi lui-même.
- Les inconvénients c'est :
1/qu'il faut faire ça en dynamique donc c'est plus long à coder
2/que tu as plus de connexions à ta DB qu'actuellement (même si les requêtes sont plus simples et très ciblées, ça sera plus coûteux)

Voilà, enfin, c'est juste un conseil et peut-être l'as tu fait et as tu simplifié le code pour qu'on comprenne ton exemple, mais essaie de bien respecter ton pattern MVC. En principe, ta logique métier n'a rien à faire dans tes jsp, elles ne devraient servir qu'à de l'affichage (je pense que tes profs seraient contents si tu leur expliquais ça durant ta soutenance).

Tiens nous au courant !
0
merci bcp Marco, j'opte pour la premiere solution,mais il reste toujours un probleme, c'est que le nombre de lignes retournées par la boucle n'est connu qu'après l'execution du code,
alors je me demende comment appeler les attributs de la classe action pour avoir :
private String creditOuvert0;
private String creditOuvert1;
...
0
Marco la baraque
4 mai 2008 à 15:54
Salut !
Si tu ne connais pas le nombre de résultats obtenus à l'avance, la méthode 1 ne peut pas marcher (ou alors il faut que tu prévois un nombre d'attributs suffisant pour ne jamais être bloqué, et j'imagine que ce n'est pas la peine de t'expliquer qu'il n'y a rien de plus crade).

En général ce qui est fait est beaucoup plus simple, mais un peu moins permissif pour l'utilisateur : il peut modifier les données ligne par ligne, et non pas la table entière (donc quand il sauvegarde une ligne, sa page est rechargée).

Tu dois simplement définir deux attributs dans ta classe action:
private String creditOuvert;
private String disponible;

Ensuite tu écris/génères les getters et setters.

Exemple avec struts2, dans ta jsp tu as ça:
<table>
<s:iterator id="ligne" value="list">
<tr>
<s:form action="Envoi">
<td><s:property value="id"/></td>
<s:hidden name="id"/>
<td><s:property value="chaine"/></td>
<s:hidden name="chaine"/>
<td><s:textfield key="creditOuvert"/></td>
<td><s:textfield key="disponible"/></td>
<td><s:submit value="Envoyer"/></td>
</s:form>
</tr>
</s:iterator>
</table>

Permettre à l'utilisateur de modifier toute la table d'un seul coup, ce n'est pas possible dans ton cas car :
- tu as un formulaire dont tu ne connais pas la taille
- pour pouvoir gérer correctement tout ça, comme tu l'as dit, il faudrait que tu puisses générer les attributs de ta classe action (donc ton code java!) en fonction de la réponse à ta requête

Enfin, cette méthode est beaucoup plus facile à gérer dans tes services pour toi et c'est plus performant car :
- tu ne gères pas de boucle
-tu ne récupères pas 50 000 paramètres à la fois, et au niveau de la base de données, tu ne fais un update que sur les données pertinentes (celles qui ont été modifiées) et non pas sur toutes tes données alors que 90% d'entre elles n'auront pas été modifiées
0
Bonjour,
j'ai pensé a utiliser un tableau ou une des collections java pour stocker les valeur des champs avant de les transmettre à l'actionForm pour valider et action pour faire mon traitement,seulement je sais pas comment faire cette transmission!
j'ai essayé avec un tableau,j'ai utilisé le code suivant:
<%
int i=1;
while(result.next()){
%>
<tr>
<td><html:text property="<%="creditOuvert["+i+"]"%>" /></td>
<td><html:text property="<%="disponible["+i+"]"%>" /></td>
</tr>
<%
i++;
}
%>
mais ça me donne une erreur au niveau de la validation(actionForm),aparament il ne reconnait pas une ecriture du genre :
if (!getCreditOuvert()[1].matches("[0-9]{3,10}")){
er.add("creditInvalid", new ActionMessage("error.credit.required"));
}
sachant de j'ai créer 2 tableaux creditOuvert[] et disponible[] avec leur getters et settters!!
as-tu une idée?
et merci.
0
Marco la baraque
8 mai 2008 à 02:58
Bonsoir,
Selon moi, ce que tu essaies de faire n'est pas possible.
En effet, tu tentes de passer des listes à travers un formulaire alors que ceux-ci sont conçus pour passer des strings (en fait les formulaires ajoutent tes différentes entrées dans une table de hachage (couple clé-string) dans la request. Je crois que cette table s'appelle la parameterMap).
Struts doit utiliser cette parameterMap pour faire le mapping entre les objets envoyés par ton formulaire et tes attributs déclarés dans tes classes action.

Par contre, si tu essaies de passer une liste de string dans cette parameterMap, je ne pense pas que ce soit bien géré au niveau de la request envoyée (je ne pense pas que la parameterMap contienne effectivement les données que tu veux envoyer).

L'idéal serait déjà de vérifier si ta request est bien formée (si tu utilises Eclipse, tu peux le voir en utilisant la vue debug, en plaçant un break point dans ta classe action, juste avant ta validation. Tu pourras ensuite en profiter pour vérifier que tes attributs ont été correctement remplis avec les données que tu as passé dans ta request).

Tiens moi au courant de tes investigations, car ta méthode m'intéresse et j'aimerais savoir comment c'est effectivement géré par le protocole http.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour
franchement je ne voie pas l'utilité d'utilisé ce code java àl'intérieur de ton page!!? d'habitude on fait une class action qui appel des DAO pour intéroger ta BDD. une fois tu as le résultat, le method de l'api java SQL getmetadate te permet d'avoir des infos sur le nombre des lignes de ton ResultSet!
dans ta page tu as le tag iterator qui te permet de boucler sur les lignes de ta table.
j'espere que ca va t'aider!!
0