IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

[Débutant] Défaut de passage des paramètres d'une requête post


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut [Débutant] Défaut de passage des paramètres d'une requête post
    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 !

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 21
    Points : 20
    Points
    20
    Par défaut
    J'a trouvé mon erreur !
    Pour information, la jsp inclue dans le formulaire de saisie des commande était aussi inclue dans celle de saisie des clients.
    Cette dernière était, dans le web.xml, configurée en multi-part, ce qui n'était pas le cas de ma servlet dédiée au traitement de la saisie des commandes.

    Il manquait les balises multipart-config dans la définition de ma servlet :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <servlet>
    		<servlet-name>saisirCommande</servlet-name>
    		<servlet-class>com.eCom.servlets.SaisieCommandeServlet</servlet-class>
    		<init-param>
    			<param-name>chemin</param-name>
    			<param-value>/Users/jaknichan/workspace/AppFiles/</param-value>
    		</init-param>
    		<multipart-config>
    			<location>C:/Users/jaknichan/workspace/AppTempFiles</location>
    			<max-file-size>1048576</max-file-size> 
    			<max-request-size>5242880</max-request-size>
    			<file-size-threshold>1048576</file-size-threshold>
    		</multipart-config>
    	</servlet>

    Sans la configuration multipart, les paramètres ne sont pas contenus dans la map.
    Cette solution est valable si votre serveur d'appli ou conteneur implémente la version 3.0 de l'API Servlet.
    Pour les versions antérieures de l'API, il convient de mettre dans votre répertoire WEB-INF/lib les bibliothèques commons-fileupload.jar et commons-io.jar de la bibliothèque Apache Commons Fileupload.
    A partir de là, il est possible d'analyser à la mano le résultat de la méthode getInputStream de l'objet HttpServletRequest passé en paramètre de la méthode doPost.

    Je marque mon souci comme résolu ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. passage des paramètres pour une fonction
    Par monalise dans le forum NetBeans
    Réponses: 4
    Dernier message: 20/08/2009, 09h36
  2. Syntaxe des paramètres dans une requête
    Par TiboAppert dans le forum C#
    Réponses: 1
    Dernier message: 29/06/2009, 10h06
  3. Réponses: 1
    Dernier message: 21/03/2006, 14h29
  4. Récupération des paramètres d'une requête
    Par TomPad dans le forum Access
    Réponses: 10
    Dernier message: 16/06/2005, 15h11
  5. Passage de paramètres dans une requête imbriquée
    Par DrakkoFR dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/02/2005, 12h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo