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)
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;
 }
 
}
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
<%@ 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&eacuteation d'un nouvel utilisateur : &eacutetape 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>
"name" est un string, donc je set directement la propriété "name" de l'objet "Client" (couche modele) de la classe ClientForm

"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
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");
 }
}
Du coup , quand je saisie "toto" et "20" le resultat de l'Action affiche :

DANS MODEL > id du client :0 ,nom du client :Toto
DANS FORM > id du client :20
ç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.

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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Client c = c.getClient();
pour utiliser appliquer les méthodes de mes classes métiers avec cette objet Client de la couche modele.

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 :

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 */
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 ...

Quelle solution vous pourriez me proposer pour populer correctement cet objet Client encapsulé dans le beanForm ?

Merci.