Bonjour,
j'ai un problème concernant Struts, avec un formulaire JSP qui doit populate un objet de la couche Modele encapsulé dans un beanForm.
Mon code est le suivant :
L'objet Client de la couche Modele
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 package struts.myPackage.model; public class Client { private String name; private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Le Bean Form qui prend un objet Client de la couche modele (plutot que d'avoir des setters/getters pour name et id)
Ma page JSP du formulaire contenant les champs name et id
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 package struts.myPackage.form; import org.apache.struts.action.*; import struts.myPackage.model.Client; import javax.servlet.http.*; public class ClientForm extends ActionForm { private Client client = new Client(); private String id; public void reset(ActionMapping mapping, HttpServletRequest request) { System.out.println("[ConnexionBean.java] La methode reset a ete appelee"); } // pour la validation public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){ // gestion des erreurs ActionErrors erreurs = new ActionErrors(); /* vide */ return erreurs; } public Client getClient() { return client; } public void setClient(Client client) { this.client = client; this.client.setId(Integer.parseInt(this.id)); } public String getId() { return id; } public void setId(String id) { this.id = id; } }
"name" est un string, donc je set directement la propriété "name" de l'objet "Client" (couche modele) de la classe ClientForm
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 <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested"%> <html> <head> <title>Formulaire</title> </head> <body> <center> <h1>Création d'un nouvel utilisateur : étape 1</h1> <hr> <html:form action="/send_client"> <table> <tr> <td>Nom</td> <td><nested:text property="client.name" size="20" maxlength="10"/></td> </tr> <tr> <td>Id</td> <td><nested:text property="id" size="20" maxlength="10"/></td> </tr> </table> <table> <tr> <td><input type="submit" value="Send"></input></td> <td><input type="reset" value="Reset"></input></td> </tr> </table> </html:form> </center> </body> </html>
"id" est un int, je dois adapter la saisie de l'id du string en int (car un formulaire prend des String), donc je set la propriété de l'objet ClientForm(et non la propriété id de son attribut Client, comme je l'ai fait avec "name")
Bref "on" ma dit en gros que l'action form encapsule un objet modele, et qu'il faut adapter du String vers le type (Date, Int) pour chaque propriété de l'objet du modele...
Ma classe action
Du coup , quand je saisie "toto" et "20" le resultat de l'Action affiche :
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 package struts.myPackage.action; import org.apache.struts.action.Action; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import struts.myPackage.form.ClientForm; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import javax.servlet.ServletException; public class ClientAction extends Action{ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ClientForm c= (ClientForm) form; System.out.println("DANS MODEL > id du client :" +c.getClient().getId()+ " ,nom du client :" +c.getClient().getName()); System.out.println("DANS FORM > id du client :" +c.getId()); return mapping.findForward("adresse"); } }
ça veut dire que je n'ai pas populé la propriété "id" (vu qu'elle vaut 0) de l'objet Client à l'intérieur de l'ActionForm. Par contre, j'ai bien Set la valeur de la propriété 'Id' de l'objet ActionForm.DANS MODEL > id du client :0 ,nom du client :Toto
DANS FORM > id du client :20
Le truc qui serait bien, ce serait de récupérer mon beanForm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ClientForm c= (ClientForm) form;
celui ci encapsule un objet de la couche modele (l'attribut "client" donc) que je souhaite recupérer intacte avec les données que j'avais saisies :
pour utiliser appliquer les méthodes de mes classes métiers avec cette objet Client de la couche modele.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Client c = c.getClient();
Ceci étant la problématique, lol
Ma question est alors :
comment je fais pour populer la propriété "id" de l'objet Client de la couche modèle dès la validation du formulaire (donc au niveau de la JSP).
Jusque là, j'ai comme solution le code suivant à ajouter en plus dans la méthode execute de la classe Action :
ok bon...c un peu moche tou ça no? Imaginez les propriétés qui ne sont pas des strings (Date, Int) faudra récupérer ça a chaque fois ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 c.getClient().setId(c.getId()) /* on fixe l'id dans l'objet Client */ Client c = c.getClient(); /* puis on travaille sur l'objet client avec les classes métiers ..etc */![]()
Quelle solution vous pourriez me proposer pour populer correctement cet objet Client encapsulé dans le beanForm ?![]()
Merci.
Partager