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 :

Ma HashMap est affichée en double dans ma JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut Ma HashMap est affichée en double dans ma JSP
    Bonjour,

    j'ai un soucis d'affichage des données issues d'une HashMap dans une JSP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Liste des paramètres
     
     
    Clé Valeur
    p    2
    v    8
     
    Clé Valeur
    p    2
    v    8
    Problématique initiale : afficher dans un tableau la liste des paramètres se trouvant dans l'URL.
    Je pensais pour cela utiliser un objet implicite contenant ces paramètres, normalement une Map, mais je n'y suis pas arrivé.
    J'ai donc demandé au controleur de faire passer à la JSP une HashMap que j'ai construite moi-même en y mettant les paramètres de la requête.

    Maintenant que cette Map est transmise à la JSP, je fais une boucle pour afficher son contenu dans un tableau, mais tout est doublé. Il semblerait que la boucle tourne autant de fois qu'il y a d'entrées dans la Map alors que je souhaiterais en toute logique qu'elle tourne autant de fois qu'il y a un couple clé/valeur.

    Affichage dans la JSP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		    <table>
    		    	<tr>
    		    		<th>Clé</th>
    		    		<th>Valeur</th>
    		    	</tr>
    			    <c:forEach items="${Params}" var="entry">
    			        <tr>
    				        <td>${entry.key}</td>
    				        <td>${entry.value}<br></td>
    			        </tr>
    			    </c:forEach>
    		    </table>

    Construction de la Map par le controleur

    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
     
    		/**
    		 * @requestParams HashMap stockant les paramètres de la requête
    		 */
    		HashMap<String,String> requestParams = new HashMap<String,String>(); //params de la requête
    		HashMap<String,String> paramsOut = new HashMap<String,String>(); //params à renvoyer à la JSP
    		requestParams = (HashMap) request.getParameterMap();
    		Iterator<Map.Entry<String,String>> it = requestParams.entrySet().iterator();
    		Iterator<Map.Entry<String,String>> itOut = paramsOut.entrySet().iterator();
    		while(it.hasNext()) {
    			Map.Entry couples = (Map.Entry)it.next();
    			paramsOut.put((String) couples.getKey(), request.getParameter((String)couples.getKey()));
    		}
    			request.setAttribute("Params", paramsOut);
    			RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(ma_page);
    			dispatcher.forward(request,response);
    Savez-vous me dire ce que je dois changer à ma boucle <c:forEach... afin que j'ai autant de lignes que de couples clé/valeur ?

    Accessoirement, comment dois-je invoquer l'obket implicite "param" pour obtenir le même résultat sans passer par le controleur pour faire le job ?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est déjà le cas, tu itère sur chaque couple.

    Vu que tu as deux fois les textes "Clé" et "Valeur", je pense que c'est plutot la jsp que tu appelle deux fois. Il faudrait que tu donne le code complet de ta méthode et de ta jsp.


    Aussi, c'est un code vachement alambiqué avec des castings incorrect que tu aurais pu écrire directement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		HashMap<String,String> paramsOut = new HashMap<String,String>(); //params à renvoyer à la JSP
                    for (String key: request.getParameterMap().keySet()){
    			paramsOut.put(key, request.getParameter(key));
                    };
    		request.setAttribute("Params", paramsOut);
    		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(ma_page);
    		dispatcher.forward(request,response);
    ou en java 8


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    		Map<String,String> paramsOut = request.getParameterMap().keySet()
                                 .stream()
                                 .collect(
                                      Collectors.toMap(
                                            Function.identity(),
                                            request::getParameter)
                                 );
    		request.setAttribute("Params", request.getParameterMap().keySet());
    		RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(ma_page);
    		dispatcher.forward(request,response);

  3. #3
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Bonjour Tchize_

    tu dis que mon code est alambiqué, et j'apprécie ton indulgence ^^

    En réalité, sur ce petit exemple, je me retrouve bloqué avec 2 petits problèmes qui expliquent pourquoi j'en suis arrivé là :
    - au départ, je souhaitais récupérer les paramètres directement dans la JSP au travers des expressions implicites (telles que ${header} ou ${request}), mais je ne parvenais pas à itérer directement dans la JSP sur les paramètres de la requête. J'ai donc réalisé cela dans la servlet qui appelle la page.
    - ensuite, dans la servlet, j'ai créé une HashMap dans laquelle j'ai rapatrié les paramètres de la requête ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HashMap<String,String> requestParams = new HashMap<String,String>();
    requestParams = (HashMap) request.getParameterMap();
    Ensuite j'ai itéré sur cette Map pour obtenir les couples clés/valeurs que je cherchais, mais j'ai eu un soucis :
    - la clé ressortait bien sous forme de String
    - la valeur correspondante était affichée sous forme de référence

    Comme je ne parvenais pas à obtenir une String avec ma "value", j'ai contourné le problème avec ce cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.getParameter((String)couples.getKey())
    Je renvoie alors le tout dans une autre HashMap que je transmets pour affichage à la JSP.

    Voilà le doGet() complet :

    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
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    		response.getWriter().append("Served at: ").append(request.getContextPath());
     
    		final String ACCUEIL = "/page.jsp";
     
    		/**
    		 * @requestParams HashMap stockant les paramètres de la requête
    		 */
    		HashMap<String,String> requestParams = new HashMap<String,String>();
    		HashMap<String,String> paramsOut = new HashMap<String,String>();
    		requestParams = (HashMap) request.getParameterMap();
    		System.out.println("Nb de paramètres : " + requestParams.size());
    		Iterator<Map.Entry<String,String>> it = requestParams.entrySet().iterator();
    		Iterator<Map.Entry<String,String>> itOut = paramsOut.entrySet().iterator();
    		while(it.hasNext()) {
    			Map.Entry couples = (Map.Entry)it.next();
    			paramsOut.put((String) couples.getKey(), request.getParameter((String)couples.getKey()));
    			System.out.println("Clé = " + couples.getKey() + " / Valeur = " + request.getParameter((String)couples.getKey()));
    		}
    			request.setAttribute("Params", paramsOut);
    			RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(ACCUEIL);
    			dispatcher.forward(request,response);
    	}
    Donc oui, tu as raison, c'est alambiqué parce qu'il y a 2 couches qui se superposent alors que ce n'était pas prévu comme ça au départ. J'envisageais plutôt quelque chose comme ce que tu m'as proposé pour être honnête ^^

    En tout cas, merci pour ton aide.

    PS : saurais-tu m'expliquer comment faire la même chose avec l'objet implicite de la JSP ?

    ++

  4. #4
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Je viens de tester le code que tu m'as transmis (pas celui en Java 8), et il rencontre le même problème que moi.
    Voici le message d'erreur :

    java.lang.Error: Unresolved compilation problem:
    Type mismatch: cannot convert from element type Object to String
    Les "values" sont transmises au format Object et il n'est pas possible d'itérer dessus à partir d'une clé au format String. D'où mes casts multiples pour arracher une String au bouzin.

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Faudrait que je vois sur un ide j'ai ecrit vite fait sans tester. Tu peux je pense iterer directement sur $params en jsp mais j'ignore si les valeurs sont des strings ou des tableaux de string.

  6. #6
    Membre du Club Avatar de Lovegiver
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2015
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2015
    Messages : 81
    Points : 57
    Points
    57
    Par défaut
    Ca y est, j'ai trouvé la bonne façon de le faire depuis la JSP ^^ Je ne comprends pas comment j'étais passé à côté avant.

Discussions similaires

  1. [ XML ][ XSL ][ JSP ] afficher du xml dans une JSP
    Par zozolh2 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 17/07/2009, 20h34
  2. Réponses: 2
    Dernier message: 12/10/2006, 15h29
  3. [PHP-JS] Afficher code PHP dans page JSP
    Par metatron dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/08/2006, 09h36
  4. afficher un arbre dans un JSP?
    Par MicroPuce dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 18/07/2006, 08h50
  5. [C/C++] afficher des doubles dans une message box
    Par lalaurie40 dans le forum MFC
    Réponses: 1
    Dernier message: 24/05/2005, 14h55

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