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 :

Syntaxe EL pour l'accès aux collections


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut Syntaxe EL pour l'accès aux collections
    Bonjour

    Je n'arrive pas à accéder à certains éléments dans une jsp.

    En principe, une expression du type ${form.individu.adresses[0].ville} me renvoie la ville de la première adresse d'un individu qui se trouve dans un attribut de la requête/session nommé "form". Jusque là, je ne dis pas de bêtises ?

    Maintenant, les 2 informations "form" et "individu.adresses[0].ville" sont passés (sous cette forme : il s'agit de texte) en paramètre à une balise jsp. J'aimerais donc récupérer les objets correspondants en écrivant quelque chose comme ${requestScope[paramForm][paramReste]}

    Et ça ne marche pas parce que paramReste ne devrait contenir le nom que d'un seul attribut, la séquence "individu.adresses[0].ville" n'est pas interprétée correctement (l'analyseur de la jsp me dit que cet attribut n'existe pas, sans le décomposer apparemment).

    Des idées ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    961
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 961
    Par défaut
    J'ai souvent eu le cas où un trop grand nombre de "." successifs dans une jsp aboutit à un plantage. Dans ce cas, je crée un objet dédié à la page, dont chaque champ correspond à un champ de la page. Ca fonctionne parce qu'il n'y a qu'un seul point.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Merci de votre réponse

    Dans mon cas, la formulation ${form.individu.adresses[0].ville} fonctionne correctement.

    Mon problème et que j'ai un attribut qui contient la chaîne "form" et un autre qui contient la chaîne "individu.adresses[0].ville" et j'aimerais récupérer l'objet correspondant (celui que j'aurais en tapant la forme du paragraphe précédent).

    Quand j'ai deux attributs a1 et a2 dans une balise jsp perso, contenant respectivement "form" et "attribut1", je peux faire ${requestScope[a1][a2]}, ce que je peux écrire en dur sous cette forme : ${form.attribut1}. Mais si a2 contient quelque chose de plus compliqué (une séquence d'attributs), la forme avec requestScope ne fonctionne pas.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Je ne parviens pas bien à saisir ce que tu veux faire...

    Citation Envoyé par kkort Voir le message
    Mon problème et que j'ai un attribut qui contient la chaîne "form" et un autre qui contient la chaîne "individu.adresses[0].ville" et j'aimerais récupérer l'objet correspondant.
    Tu as quelque chose du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    request.setAttribute("form", form);
    request.setAttribute("individu.adresse[0].ville", individu.adresse[0].ville);
    request.setAttribute("att1", "form");
    request.setAttribute("att2", "individu.adresse[0].ville");
    Et tu veux résoudre dynamiquement un truc qui ressemblerait à ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${ ${requestScope['att1']} } => form

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il veut parler d'un objet "form" qui contient un objet "individu" qui lui même contient un tableau "adresse" qui elles, contiennent un objet "ville"...
    (mais je peux me tromper )
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Euh, merci pour votre participation... et désolé pour les explications compliquées !

    Je vais essayer de réexpliquer mon problème plus clairement (effacez ce que j'ai dit avant) :

    * Prenons ces classes de données (avec les références entre elles) :

    Formulaire -> Individu -> Adresse (il s'agit d'un collection) -> String (la ville par exemple)

    - En Java, je peux en principe écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monFormulaire.getIndividu().getAdresses().get(0).getVille()
    - Et dans une jsp (si l'objet est dans la requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${monFormulaire.individu.adresses[0].ville}
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${requestScope["monFormulaire"]["individu"]["adresses"][0]["ville"]}
    Jusque là, je n'ai pas de problème.


    * Maintenant, j'écris une balise jsp perso qui prend en paramètre deux éléments : le nom de l'objet de base et la chaîne pour atteindre l'attribut.

    En clair, l'utilisation de la balise a cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maBalise objet="monFormulaire" attribut="individu.adresses[0].ville"  />
    Dans le code de la balise, j'ai donc deux paramètres qui s'appellent objet et attribut. Et je veux écrire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${requestScope[objet][attribut]}
    Dans le cas d'une utilisation "simple" de la balise, de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maBalise objet="monFormulaire" attribut="individu"  />
    ça fonctionne, le code est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${requestScope["monFormulaire"]["individu"]}
    Mais dans le cas d'une utilisation plus compliquée de la balise, telle que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maBalise objet="monFormulaire" attribut="individu.adresses[0].ville"  />
    ça ne fonctionne pas, le code est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${requestScope["monFormulaire"]["individu.adresses[0].ville"]}
    et il me dit
    "beuh... ça existe pas l'attribut "individu.adresses[0].ville" "
    alors que j'aurais aimé qu'il décompose ma suite d'attributs pour aller chercher l'individu, puis son adresse, puis sa ville

    Le problème est que ça ne marche manifestement pas avec requestScope parce que le nombre de mes attributs est indéfini et qu'il faut que je les sépare pour utiliser requestScope. Et je ne vois pas non plus comment faire sans, parce que les noms de l'objet et de sa suite d'attributs se trouvent dans les paramètres de la balise. En gros il faudrait que je fasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${ ${objet}.${attribut} }
    Voilà, voilà, j'espère que c'est plus clair... et que quelqu'un pourra m'aider

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Pour faire ça, il va falloir utiliser l'introspection parce que, ce qui est passé à ton objet tag, c'est une String, rien d'autre.
    Donc, via java.lang.reflect..., tu vas devoir rechercher tes objets...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    J'aurais espéré une autre réponse

    J'ai bricolé un truc en Java qui fonctionne, mais c'est bien compliqué pour si peu...

    Il est normal que je ne passe que des chaînes : je passe les noms des attributs à la balise (parce que j'ai besoin des noms et parce qu'effectivement on ne peut passer que des chaînes aux balises) et je voudrais retrouver les objets dans la balise. J'ai réussi quand il n'y a qu'un attribut à récupérer. Cet appel marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maBalise objet="monFormulaire" attribut="individu"  />
    mais pas celui-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <maBalise objet="monFormulaire" attribut="individu.adresses[0].ville"  />
    Donc on peut retrouver un objet à partir de son nom passé en paramètre, mais je ne sais pas si on peut récupérer quelque chose de plus complexe comme un attribut d'un attribut d'un objet...

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    C'est normal, c'est comme si tu faisais un request.getAttribute("nom") ou session.getAttribute("nom")...
    Mais si tu fais, request.getAttribute("nom.sousObjet.sousSousObjet"), ça ne fonctionnera pas non plus...
    CQFD

    Donc, java.lang.reflect est ton ami

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Oui, mais la forme ${} est plus souple par exemple : on peut lui passer une "chaîne" d'attributs de longueur indéfinie et elle la décompose. Mais ça ne fonctionne que si on connaît les noms à l'avance, pas avec des variables j'ai l'impression.

    Merci pour ton aide.
    Et oui, j'ai bricolé un truc à base de Java et d'introspection, ça m'a pris beaucoup moins de temps que d'essayer de faire marcher ces ¤@#%µ£ de balises jsp et d'expressions ! Par contre c'est plus compliqué.

    Est-ce qu'il y a moyen en Java d'accéder aux paramètres de la balise ? Parce que là j'utilise <c:set ...> pour stocker la valeurs des paramètres dans la requête, pour pouvoir ensuite y accéder en Java, qui réécrit dans la requête pour que le reste du code de la balise puisse accéder à l'objet récupéré par introspection...

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kkort Voir le message
    Est-ce qu'il y a moyen en Java d'accéder aux paramètres de la balise ? Parce que là j'utilise <c:set ...> pour stocker la valeurs des paramètres dans la requête, pour pouvoir ensuite y accéder en Java, qui réécrit dans la requête pour que le reste du code de la balise puisse accéder à l'objet récupéré par introspection...
    Je n'ai pas compris ta question, peux-tu être plus clair ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Certainement.

    Je définis une balise avec un attribut nommé "attribut", comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ attribute name="attribut" required="true" %>
    On utilise donc la balise de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <mabalise attribut="valeur" />
    Pour récupérer la valeur de l'attribut dans le corps de la balise, je peux écrire (dans du code jsp, avec des EL) :
    Et si je veux le faire avec du code Java ?
    Actuellement, j'écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <c:set var="frm_texte_nomAttribut" value="${attribut}" scope="request" />
    <%
        String valeur = (String) request.getAttribute ("frm_texte_nomAttribut") ;
    %>
    Y a-t-il moyen de faire mieux ?

    Merci

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Désolé, je ne connais pas la directive <%@ attribute %>, ça vient d'où ?

    Maintenant, si dans un taglib tu veux récupérer un attribut, tu peux le faire via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pageContext.getRequest().getAttribute("nomAttribut");
    ou 
    ((HttpServletRequest)pageContext.getRequest()).getSession().getAttribute("nomAttribut");
    Je ne suis toujours pas sûr d'avoir compris ton problème...
    Pourrais-tu me dire ce que tu cherches à faire exactement dans ta balise ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    La directive <%@ attribute %> sert à définir un paramètre quand tu définis une balise perso.

    Par exemple si j'ai une balise qui s'utilise de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <mabalise attribut="valeur" />
    Je définis ma balise comme un fragment de jsp qui contient la directive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <%@ attribute name="attribut" required="true" %>
    C'est la valeur de ce paramètre que je ne sais pas récupérer en Java directement. Je ne sais pas si on peut le faire, d'ailleurs. Je ne sais y accéder que par cette forme : ${attribut}. Dans l'exemple de mon message précédent, je récupère cette valeur pour la mettre dans un attribut de la requête http, qui est accessible en Java, lui.

    Et dans ma balise j'ai besoin d'accéder à des valeurs qui se trouve dans la requête http. Je passe en paramètre de la balise :
    - le nom de l'attribut de la requête http contenant cet objet
    - le "chemin d'accès" à l'information dans le graphe d'objets, en partant de cet objet

    Par exemple, si mon objet de données de base se trouve dans la requête http sous le nom "formulaire" et que je veux récupérer la ville d'un individu stocké dans le formulaire, je passe :
    - "formulaire"
    - "individu.adresse.ville"

    L'utilisation de la balise a donc cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <mabalise objet="formulaire" donnees="individu.adresse.ville" />
    Et je voudrais accéder à la valeur correspondante en faisant l'équivalent du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${requestScope["formulaire"]["individu"]["adresse"]["ville"]}
    D'ailleurs je pourrais générer ce code... mais ce n'est pas tellement plus facile que l'introspection.

    Bon, je ne sais pas si c'est très clair... mais ça marche en Java grâce à l'introspection. C'est juste un peu plus compliqué, je voulais savoir si on pouvait le faire plus facilement.
    Ce n'est pas très grave, je vais le laisser comme ça. Merci pour ton aide .

  15. #15
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    As-tu regardé de ce côté http://commons.apache.org/beanutils/api/index.html ?
    Si c'est juste pour remplacer l'introspection, ça devrait te convenir (perso, je préfère java.lang.reflect, mais chacun ses choix )

    Quelle version jsp utilises-tu ?
    (chez moi, je ne peux pas saisir <%@ attribute ...%>, il ne trouve pas)

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 24
    Par défaut
    Je ne sais pas quelle version des jsp j'utilise. Celles qui se trouvent dans Tomcat 5.5 et Tomcat 6...

    Exemple de balise qui affiche un message
    (à placer dans un fichier WEB-INF/tags/tests/affMsg.tag)
    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
     
     
    <!-- Déclaration des bibliothèques nécessaires -->
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     
    <%@ tag isELIgnored="false" %>
     
     
    <!-- Informations sur la balise -->
    <%@ attribute name="msg" required="false" %>
     
     
    <!-- Code de la balise -->
     
    Message à afficher : <i> ${msg} </i>
     
    <c:if test="${empty msg}">
    	<i> (aucun message à afficher) </i>
    </c:if>
     
    <br/>
    Exemple de jsp utilisant la balise :
    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
     
     
    <% // Déclaration des bibliothèques de balises personnelles (sous forme de fragments jsp) %>
    <%@ taglib prefix="b" tagdir="/WEB-INF/tags/tests/" %>
     
    <%@ page isELIgnored="false" %>
     
    <html>
     
    	<body>
     
    		Page de test des balises personnalisées (fragments de jsp)
    		<br/>
    		<br/>
     
    		<b:affMsg/>
    		<b:affMsg msg="ici mon message"/>
     
    	</body>
     
    </html>

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/09/2011, 10h22
  2. Conseil pour un acces aux données a distance
    Par mactwist69 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 09/02/2009, 11h46
  3. Définir des rôles pour l'accès aux EJB
    Par Invité dans le forum Glassfish et Payara
    Réponses: 6
    Dernier message: 21/08/2008, 22h07
  4. Réponses: 19
    Dernier message: 04/04/2006, 14h27
  5. Recherche bêta-testeurs pour composant accès aux données
    Par Rémi Remoussenard dans le forum Access
    Réponses: 4
    Dernier message: 29/11/2005, 23h00

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