Bonjour à tous,
Une erreur incongrue me bloque depuis quelques heures, et malgré les recherches que j'ai pu faire, je n'ai rien trouvé de probant.
Je développe une petite application pour me remémorer les fondamentaux de java, dans laquelle je ne fais pour l’instant que saisir des clients et des commandes via un deux formulaires, encapsuler les données saisie dans les beans adhoc, gérer les erreurs de saisie et enregistrer en session toutes les entités (clients ou commandes, ainsi que l'association entre les deux) saisies.
J'ai donc un formulaire de saisie de clients ainsi qu'un formulaire de saisie de commandes.
Dans le formulaire client, il est possible d'uploader une image. Le formulaire post est donc multipart.
Concernant les commandes, aucun type de données nécessitant du multipart, mais il es possible d'inclure les champs pour saisir un nouveau client, donc le formulaire est multipart également.
D'où le code de ma jsp concernant les commandes :
Code html : 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 <%@ page pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Création d'une commande</title> <link type="text/css" rel="stylesheet" href=<c:url value="inc/style.css" /> /> <script type="text/javascript" src="inc/scripts/menuCommande.js"></script> </head> <body> <c:import url="/inc/inc_menu.jsp" /> <div> <form method="post" action="saisirCommande" > enctype="multipart/form-data"> <div> <span> <input type="radio" name="saisieClient" value="nouveau" id="clientNouveau" onClick="majChamps()" checked> Nouveau client <br /> <input type="radio" name="saisieClient" value ="existant" id="clientExistant" onClick="majChamps()"> Client existant </span> <span id="comboClient" style="visibility:hidden"> <select name=nomClientExistant> <c:forEach var="clientCombo" items="${sessionScope.clients}"> <option value="${clientCombo.key}"><c:out value="${clientCombo.value.nom} ${clientCombo.value.prenom}"/></option> </c:forEach> </select> </span> </div> <!-- définition d'une variable "client" pour la jsp inclue, qui contient les champs du client --> <c:set var="client" value="${commande.client}" scope="request" /> <c:import url="/inc/inc_client_form.jsp" /> <fieldset> <legend>Informations commande</legend> <label for="dateCommande">Date</label> <input type="text" id="dateCommande" name="dateCommande" value="<c:out value="${commande.date}" />" size="20" maxlength="20" disabled/> <br /> <label for="montantCommande">Montant <span class="requis">*</span></label> <input type="text" id="montantCommande" name="montantCommande" value="<c:out value="${commande.montant}" />" size="20" maxlength="20" /> <span class="erreur">${formCommande.erreurs['montantCommande']}</span> <br /> <label for="modePaiementCommande">Mode de paiement <span class="requis">*</span></label> <input type="text" id="modePaiementCommande" name="modePaiementCommande" value="<c:out value="${commande.modePaiement}" />" size="20" maxlength="20" /> <span class="erreur">${formCommande.erreurs['modePaiementCommande']}</span> <br /> <label for="statutPaiementCommande">Statut du paiement</label> <input type="text" id="statutPaiementCommande" name="statutPaiementCommande" value="<c:out value="${commande.statutPaiement}" />" size="20" maxlength="20" /> <span class="erreur">${formCommande.erreurs['statutPaiementCommande']}</span> <br /> <label for="modeLivraisonCommande">Mode de livraison <span class="requis">*</span> </label> <input type="text" id="modeLivraisonCommande" name="modeLivraisonCommande" value="<c:out value="${commande.modeLivraison}" />" size="20" maxlength="20" /> <span class="erreur">${formCommande.erreurs['modeLivraisonCommande']}</span> <br /> <label for="statutLivraisonCommande">Statut de la livraison</label> <input type="text" id="statutLivraisonCommande" name="statutLivraisonCommande" value="<c:out value="${commande.statutLivraison}" />" size="20" maxlength="20" /> <span class="erreur">${formCommande.erreurs['statutLivraisonCommande']}</span> <br /> </fieldset> <input type="submit" value="Valider" /> <input type="reset" value="Remettre à zéro" /> <br /> </form> <span class="erreur">${formCommande.resultat}</span> </div> </body> </html>
La jsp est un peu fournie car je remplis les champs texte de ce qui a été saisi dans le cadre d'une éventuelle mauvaise saisie précédente.
Les données saisies, constituant normalement les paramètres de la requête sont interceptée dans une servlet, dans laquelle j'ai factorisé tous les processus de validation des champs (ce que j'ai appelé "objet formulaire" dans les commentaire, il y en a un pour les commandes, et un pour les clients au vu du couplage entre les deux entités, un client étant un attribut de commande) :
Code java : 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 public static final String ATT_COMMANDE = "commande"; public static final String ATT_FORM = "formCommande"; public static final String SESSION_CLIENTS = "clients"; public static final String SESSION_COMMANDES = "commandes"; public static final String VUE_SUCCES = "/WEB-INF/userAccess/listerCommandes.jsp"; public static final String VUE_FORM = "/WEB-INF/userAccess/creerCommande.jsp"; public static final String CHEMIN = "chemin"; [...] public void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { /* Préparation de l'objet formulaire */ CreationCommandeForm form = new CreationCommandeForm(); /* récupération du paramètre initial du chemin du fichier, pour manipuler les fichiers * d'image pour les clients de la commande*/ String chemin = this.getServletConfig().getInitParameter(CHEMIN); /* Traitement de la requête et récupération du bean en résultant */ Commande commande = form.creerCommande( request, chemin ); /* Ajout du bean et de l'objet métier à l'objet requête */ request.setAttribute( ATT_COMMANDE, commande ); request.setAttribute( ATT_FORM, form ); /* Si aucune erreur */ if ( form.getErreurs().isEmpty() ) { /* Alors récupération de la map des clients dans la session */ HttpSession session = request.getSession(); Map<String, Client> clients = (HashMap<String, Client>) session.getAttribute( SESSION_CLIENTS ); /* Si aucune map n'existe, alors initialisation d'une nouvelle map */ if ( clients == null ) { clients = new HashMap<String, Client>(); } /* Puis ajout du client de la commande courante dans la map */ clients.put( commande.getClient().getNom(), commande.getClient() ); /* Et enfin (ré)enregistrement de la map en session */ session.setAttribute( SESSION_CLIENTS, clients ); /* Ensuite récupération de la map des commandes dans la session */ Map<String, Commande> commandes = (HashMap<String, Commande>) session.getAttribute( SESSION_COMMANDES ); /* Si aucune map n'existe, alors initialisation d'une nouvelle map */ if ( commandes == null ) { commandes = new HashMap<String, Commande>(); } /* Puis ajout de la commande courante dans la map */ commandes.put( commande.getDate(), commande ); /* Et enfin (ré)enregistrement de la map en session */ session.setAttribute( SESSION_COMMANDES, commandes ); /* Affichage de la fiche récapitulative */ this.getServletContext().getRequestDispatcher( VUE_SUCCES ).forward( request, response ); } else { /* Sinon, ré-affichage du formulaire de création avec les erreurs */ this.getServletContext().getRequestDispatcher( VUE_FORM ).forward( request, response ); } }
Le souci, c'est que la map des paramètres de la requête (paramètre request de la méthode doPost) reste désespérément vide !
Le maping dans le web.xml est ok, vu que la méthode doPost s'exécute lorsque je valide le formulaire.
Auriez vous, de part votre expérience, une idée de ce qui pourrait bloquer la transmission des paramètres de la requête ?
(A noter que pour le formulaire de saisie de client, conçu selon la même strucutre, avec une servlet dédiée et un objet factorisant les opérations de validation des champs, tout marche nickel).
Mon serveur d'application est un tomcat 8, et je développe sous eclipse.
Je pense avoir mis ce qu'il est nécessaire de savoir pour se faire une idée du problème, mais n'hésitez pas si vous avez besoin de précisions.
Merci d'avance !
Partager