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

Servlets/JSP Java Discussion :

[Servlet] Impossible de récupérer les données d'un formulaire POST


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut [Servlet] Impossible de récupérer les données d'un formulaire POST
    Bonjour,

    J'ai un problème que probablement beaucoup de personnes ont rencontré, mais je ne parviens pas à trouver de réponse pour la réception de données venant d'un formulaire POST dans une servlet :

    ma servlet :
    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
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
     
    public class UploadAttachmentHandler extends HttpServlet {
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		BufferedReader in = request.getReader();
    		while(in.ready()){
    			out.println(in.readLine());
    		}
    		out.println(request.getAttribute("sid"));
    		out.println(request.getParameter("sid"));
    		out.println(request.getContentType()+" "+request.getContentLength());
    	}
     
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setContentType("text/html");
    		PrintWriter out = response.getWriter();
    		out.println("GET");
    	}
    }
    Le formulaire HTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <html>
     <head>
     </head>
     <body>
      <form method="post" enctype="multipart/form-data" action="http://localhost:8080/WebUI/UploadAttachmentHandler">
       <input type="hidden" value="e0ac657a9d4883f73dac97da22434fd338060f1e" name="sid"/>
       <input type="submit" value="go" />
      </form>
     </body>
    </html>
    le descripteur de déploiement :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
     
    	<servlet>
    		<servlet-name>shell</servlet-name>
    		<servlet-class>com.google.gwt.dev.shell.GWTShellServlet</servlet-class>
    	</servlet>
     
    	<servlet-mapping>
    		<servlet-name>shell</servlet-name>
    		<url-pattern>/*</url-pattern>
    	</servlet-mapping>
     
    	<servlet> 
    	 	 <display-name>UploadAttachmentHandler</display-name> 
             <servlet-name>UploadAttachmentHandler</servlet-name> 
    		 <servlet-class>com.***.***.server.UploadAttachmentHandler</servlet-class> 
       	</servlet> 
       	<servlet-mapping> 
    		<servlet-name>UploadAttachmentHandler</servlet-name> 
    		<url-pattern>/UploadAttachmentHandler</url-pattern> 
       	</servlet-mapping>
    </web-app>
    Comme vous pouvez le constater, j'ai besoin d'une servlet pour l'upload de fichiers dans une appli GWT, mais dans le cas présent, j'en suis réduit à la plus simple expression : récupérer un attribut "sid" via un formulaire POST tout simple.

    Voici le résultat que j'obtient quand j'envoi le formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    null
    null
    multipart/form-data; boundary=---------------------------18691991225667 180
    J'ai très certainement loupé un truc, mais je n'arrive pas à trouver quoi ...

    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 383
    Par défaut
    J'ai rarement vu une property action avec un chemin absolu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    action="http://localhost:8080/WebUI/UploadAttachmentHandler"
    normallement ceci devrait suffire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    action="/UploadAttachmentHandler"

  3. #3
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Il faudrait ajouter le contexte de l'application :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action="<%=request.getContextPath()%>/UploadAttachmentHandler"
    Bon, sinon, avec un formulaire en multipart, tu ne peux pas utiliser le request.getParameter pour récupérer les paramètres de la requête.
    Par contre, il est possible de le faire via l'API Commons FileUpload par exemple.

  4. #4
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    @slevy :

    Merci pour ta réponse. En fait, dans mon cas, le formulaire est créé par GWT via la classe FormPanel. Pour simplifier le problème et m'assurer que l'erreur n'était pas du côté de GWT, j'ai créé un formulaire HTML simple, donc hébergé sur le port 80 (apache), ce qui implique que j'ai du mettre le chemin absolue de la servlet censée récupérer la requete.

    @c_nvy

    Merci pour ta réponse également ; je ne savais pas encore comment récupérer un fichier, maintenant je sais.
    Par ailleurs, lorsque je fabrique le formulaire dans GWT, je le fais de la sorte (code en partie généré par GWT Designer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    final FormPanel AttachmentsForm = new FormPanel();
    Attachments.add(AttachmentsForm);
    AttachmentsForm.setHeight("100%");
    AttachmentsForm.setEncoding(FormPanel.ENCODING_MULTIPART);
    AttachmentsForm.setMethod(FormPanel.METHOD_POST);
    AttachmentsForm.setAction("UploadAttachmentHandler");
    Comme cette définition se fait côté client (ce code java sera transformé en javascript), je n'ai pas accès directement au contexte de la servlet. De plus, ce code est trait pour trait l'exemple fourni dans la doc officielle de GWT.

    Dans ce contexte, la définition du contexte est-elle vraiment nécessaire ?

    Quoi qu'il en soit, merci pour vos conseils, ça va me permettre d'avancer, car là, je patauge depuis 3 jours

  5. #5
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Je ne connais pas GWT mais si ça fonctionne sans ajouter le contexte, alors il n'est pas utile de l'ajouter.

  6. #6
    Membre confirmé

    Inscrit en
    Juin 2003
    Messages
    229
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2003
    Messages : 229
    Par défaut
    Merci, c'était bien ça qu'il manquait :

    -Une requete multipart/form-data n'est analysée ni par la servlet, ni pas son conteneur, il faut demander ce service à l'extérieur, par exemple FileUpload.

    La page que tu donnes est très bien, je veux juste ajouter une ou deux petites choses pour ceux qui comme moi, veulent l'utiliser dans un projet GWT Designer sous Eclipse (c'est très très banal comme manip) :

    -Télécharger commons-fileupload-x.x.x-bin.zip sur le site Apache : http://commons.apache.org/downloads/...fileupload.cgi

    -Optionnellement, télécharger commons-io sur le meme site :
    http://commons.apache.org/downloads/download_io.cgi

    Dezipper le tout quelquepart, et recopier les fichiers jar dans tomcat/lib (pas sur que ça soit nécessaire, mais je préfère quand tout est au même endroit).

    Ensuite, dans Eclipse, ouvrez les propriétés du projet GWT -> Java Build Path -> Librairies
    Ajoutez à l'aide de "Add External JARs" les nouveaux .jar du dossier tomcat/lib et c'est terminé ; vous pouvez compiler et tester directement vos applications avec GWT Designer, pas besoin de redéployer.

    Je copie colle le code de la servlet que j'obtient, mais c'est exactement le même code que la doc d'apache.

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.util.*;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.fileupload.*;
    import org.apache.commons.fileupload.disk.*;
     
     
    public class UploadAttachmentHandler extends HttpServlet {
    	final static long serialVersionUID = 1;
     
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
     
    		boolean isMultipart = ServletFileUpload.isMultipartContent(request);
     
    		// Create a factory for disk-based file items
    		FileItemFactory factory = new DiskFileItemFactory();
     
    		// Create a new file upload handler
    		ServletFileUpload upload = new ServletFileUpload(factory);
     
    		// Parse the request
    		String name = "";
    		String value = "";
    		try{
    			List /* FileItem */ items = upload.parseRequest(request);
    			// Process the uploaded items
    			Iterator iter = items.iterator();
    			while (iter.hasNext()) {
    			    FileItem item = (FileItem) iter.next();
     
    			    if (item.isFormField()) {
    			    	name = item.getFieldName();
    			        value = item.getString();
    			    } else {
     
    			    }
    			}
    		}catch(Exception e){
    			e.printStackTrace();
    		}
     
    		PrintWriter out = response.getWriter();
     
    		out.println("Name : "+name);
    		out.println("Value : "+value);
    	}
     
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doPost(request,response);
    	}
    }
    En espérant que ça aide ...

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 05/10/2016, 17h27
  2. Impossible de récupérer les données
    Par Heroiik dans le forum Réseau
    Réponses: 3
    Dernier message: 08/08/2012, 11h56
  3. Impossible de récupérer les données XML avec JAX-RS
    Par Leaffy dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/04/2012, 11h50
  4. Réponses: 8
    Dernier message: 06/04/2011, 21h14
  5. XMLHttpRequest : Impossible de récupérer les données
    Par laurent_ifips dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 22/11/2005, 13h28

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