Rechercher : dans
Par :

Struts (probleme dans un formulaire )

Dernière réponse le 8 mai 2008 à 02:58:14 sssmix, le 1 mai 2008 à 13:09:23 
 Signaler ce message aux modérateurs

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?

Configuration: Windows XP
Opera 9.26

Meilleures réponses pour « struts (probleme dans un formulaire ) » dans :
[Webmaster] Un formulaire de contact pour votre site VoirCe formulaire permet d'avoir une page pour être contacté sur son site, sans utiliser de logiciel de messagerie. La personne qui vous contacte indique son adresse, l'objet du message et son message (évidemment). Le code est une version...
Javascript - Effacer un champ de formulaire lors du clic (focus) VoirIl vous est sûrement arrivé de tomber sur un formulaire HTML avec des valeurs pré-remplies décrivant par exemple le type de valeur attendue. L'intention est louable mais il est désagréable de devoir sélectionner ce texte et le supprimer avant de...
Les formulaires HTML VoirIntérêt d'un formulaire Les formulaires interactifs permettent aux auteurs de pages Web de doter leur page web d'éléments interactifs permettant par exemple un dialogue avec les internaute, à la manière des coupons-réponse présents dans certains...
Servlets - Gestion des formulaires VoirIntroduction aux formulaires Les servlets rendent très simple la récupération de données envoyées par l'intermédiaire de formulaires HTML, c'est-à-dire une interface graphique permettant à l'utilisateur de saisir des données. Grâce à la balise...
Bases de données - Utilisation de formulaires VoirUtilisation de formulaires Afin d'exploiter les bases de données, il faut fournir une interface à l'utilisateur lui permettant de visualiser des données en fonction de certains critères. Pour cela il existe un outil : les formulaires. Un formulaire...

1

Marco la baraque, le 3 mai 2008 à 12:15:44

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 !

Répondre à Marco la baraque

2

sssmix, le 3 mai 2008 à 17:50:23

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;
...

Répondre à sssmix

3

Marco la baraque, le 4 mai 2008 à 15:54:35

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

Répondre à Marco la baraque

4

Sssmix, le 6 mai 2008 à 04:06:46

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.

Répondre à Sssmix

5

 Marco la baraque, le 8 mai 2008 à 02:58:14

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.

Répondre à Marco la baraque