RSS
 

JSF : HashMap et paramètres depuis l’url

21 août

En développant une application utilisant JSF (Java Server Faces) j’ai été confronté à différentes situations qui m’ont permis d’apprendre énormément sur cette technologie.

La plupart des choses que j’ai appris (mis à part les limites des JSF :) ) sont relativement simples au final, mais il y a deux astuces dont je souhaitais garder une trace … et bien sûr partager avec vous !

Cela concerne d’une part l’utilisation dans une page JSF des paramètres passés dans l’url, et d’autre part l’utilisation de tableaux ou de Hashmap depuis la vue. Si je rédige ce message c’est qu’en combinant ces deux astuces je suis tombé sur un problème qui a été laborieux à déboguer … jetez-y un oeil et ne perdez pas votre temps !

Manipuler les paramètres passés dans l’url

Il est parfois pratique d’utiliser des paramètres GET plutôt que POST ou qu’un attribut de backing bean afin de récupérer une valeur. Par exemple pour afficher le bon article de son blog :) Nous supposerons par la suite que nous souhaitons récupérer l’id passé dans l’adresse article.jsf?id=5

En effectuant une rapide recherche sur google on trouve rapidement comment récupérer une valeur passée en paramètre, et notamment sur cette page anglophone d’Apache. Voici différentes façons de récupérer l’id dans la page JSF :

#{param.id}
#{param['id']}
#{facesContext.externalContext.requestParameterMap.id}

On peut également y accéder depuis le bean ou bien l’injecter directement dans une de ses propriétés. La syntaxe est disponible sur la page donnée ci-dessus. Si vous êtes non-anglophones et que vous souhaitez absolument faire ceci, faites le moi savoir en commentant cet article et je vous aiderai ;)

Accéder à un élément de tableau ou de Hashmap

Supposons maintenant que nous ayons une variable articles de type Map<Long, String> dans un backing bean, qui contienne tous nos articles. On aimerait vraiment pouvoir faire l’équivalent de :

System.out.println(this.articles.get(id));

En cherchant encore une fois sur le web, on trouve une syntaxe qui permet d’effectuer un « get » sur le HashMap. Voici donc l’équivalent de la portion de code ci-dessus dans la vue JSF :

#{MonBean.articles[param.id]}

… et bien en exécutant ce code vous aurez une bien belle erreur dans votre page ! :D (sadique va …)

La raison est simple (quand on la connait) : cela vient tout simplement du fait que le paramètre issu de l’url est une String et non un Long, or la méthode getArticles() du backing bean renvoie un Map indexé par un Long ! Vous l’aurez compris, si l’on souhaite utiliser cette syntaxe il faudra donc faire une opération toute simple soit au niveau de getArticles(), soit ailleurs afin de retourner un Map<String, String>. Celui-ci sera alors directement utilisable !

Je ne sais pas si c’est la meilleure solution au problème, mais c’est celle que j’ai utilisé. Etant donné que cela n’était absolument pas dérangeant de parser le Map « articles » afin de caster ses clés en String j’ai choisi la solution de facilité !

Cependant, si vous avez une autre solution ou bien une suggestion pour éviter de se heurter à ce problème, je serai très heureux de la connaître …

Pensez à utiliser mon flux RSS pour vous tenir au courant des futurs articles ! Vous pouvez aussi me retrouver sur Twitter pour une actualité plus fréquente.

 
5 Comments

Posted in En vrac

 

Tags:

  • Alex

    Votre article est très intéressant, et montre certains astuces dont on ne trouve pas vraiment dans des tutoriels traitant du JSF, j’ai beau cherché comment récupérer les variables passées via l’url et je crois que ça va me permettre de résoudre mon problème. Merci

  • http://www.pierre-martin.fr Pierre MARTIN

    Merci beaucoup !
    C’était pour cette raison d’ailleurs que je l’avais rédigé :) heureux que cela puisse aider d’autres personnes.

  • Alex

    Slut!, je reviens sur un truc je n’arrives pas à recuperer les variables passer par l’url au niveau de mon bean.

    et à partir du faces-config.xml quand j’ajoutes

    inscription
    com.dev.systeme.core.classe.Validation
    request

    fst
    #{param.fst}
    jst
    #{param.jst}

    le serveur ne se lance pas il me renvoi l’erreur:
    HTTP Status 503 -
    type Status report
    message
    descriptionThe requested service () is not currently available.

    Merci! de me refiler un coup de main

  • http://www.pierre-martin.fr Pierre MARTIN

    Bonjour,
    Pour le coup, je suis désolé mais je ne peux pas t’aider plus. Je travaillais beaucoup avec JSF durant mon stage l’été dernier mais n’y ait pas retouché depuis (vive le PHP :) ) …

    Essaye de bien suivre les instructions mentionnées sur la page donnée en lien, sinon tentes ta chance sur un forum.

    Désolé, mais bonne continuation.

  • Suan Tay

    Pour JSF2 utiliser :

                Donc de l’url frm?param1=aaa vers le backbean bean