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

JSF Java Discussion :

Redirection vers une page avec CommandLink


Sujet :

JSF Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut Redirection vers une page avec CommandLink
    Bonjour à tous.

    Je cherche à créer un lien qui appelle une méthode d'un managedBean lorsque l'utilisateur clique dessus. L'exemple le plus simple serait un lien de logout qui appelle la methode logout et qui redirige via le outcome vers index.xhtml.

    Cela est impossible via un h:link ou h:outputLink (sinon la méthode est appelée lors de la résolution de l'EL). J'ai donc seulement h:commandLink.

    Seulement le problème est que commandLink ne renvoie pas vers une autre page comme le ferait commandButton. CommandLink génère une balise <a> dont le href est toujours '#'. Alors que commandButton renvoie bien vers une la page demandée.

    Ma question est donc la suivante.
    Suis-je obligé d'utiliser un commandButton pour exécuter ma méthode et redirigé vers une page définie par le outcome renvoyé? Ou alors il est possible de modifier le comportement de commandLink pour me rediriger?

    Merci pour toute information.

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Points : 7 275
    Points
    7 275
    Par défaut
    Il n'y a aucun problème pour utiliser un commandLink :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <h:commandLink action="#{bean.monAction}" .../>

    Et dans le code java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public String monAction() {
        ...
        return "idDeLaNavigationRule";
    }
    Certes cela génère un tag HTML <a href="#" .../>, mais ce n'est pas un problème. En effet, JSF va utiliser du JavaScript (voir l'attribut onclick) pour savoir quelle méthode Java appelée du côté serveur. Le fait d'utiliser un action qui retourne l'ID d'une règle de navigation te permet de rediriger l'utilisateur une fois l'action traitée.
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    Et bien écoute, j'avais le même raisonnement que toi!
    Mais tout en réessayant, ça ne fonctionne pas.

    En fait mon h:commandLink est dans un template JSF, peut-être que cela vient de là. Ou alors puisque j'invalide la session dans la méthode, ça fait "bugger".

    Voici mon commandLink :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:form>
        <h:commandLink styleClass="link_nodeco" value="( logout )"  action="#{userController.logout}"/>
    </h:form>
    et la méthode logout dans userController :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public String logout() throws IOException {
        ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();
        request.getSession(false).invalidate();
        return "logout";
    }
    Et ma navigation-rule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <navigation-rule> 
            <from-view-id>/WEB-INF/templates/advisor_template.xhtml</from-view-id> 
            <navigation-case> 
                <from-outcome>logout</from-outcome> 
                <to-view-id>/index.xhtml</to-view-id> 
            </navigation-case> 
        </navigation-rule>
    Ma session est bien invalidée mais je ne suis pas redirigé vers accueil.
    J'en déduis que ma navigation-rule ne doit pas etre correcte, à cause du template.
    Mais alors, je dois mettre quoi dans from-view-id ?

    Autrement, j'ai contourné le problème en modifiant quelque peu logout() et ç fonctionne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void logout() throws IOException {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
     
            HttpServletRequest request = (HttpServletRequest) ec.getRequest();
            request.getSession(false).invalidate();
     
            ec.redirect("/MyApp");
        }

  4. #4
    Membre chevronné
    Avatar de fxrobin
    Homme Profil pro
    Architecte SI, Java Fan, API Manager
    Inscrit en
    Novembre 2007
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte SI, Java Fan, API Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2007
    Messages : 875
    Points : 2 112
    Points
    2 112
    Par défaut
    ton <from-view-id> n'est pas pas bon.

    Il faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <from-view-id>*</from-view-id>
    en fait, une "vue" JSF n'a rien à voir le fichier de template ...
    le "*" signifie "depuis n'importe quelle vue".


    ensuite, ton logout doit renvoyer une String, car sur ton commandLink, c'est une action (donc avec une règle de navigation) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public String logout() throws IOException {
            ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
     
            HttpServletRequest request = (HttpServletRequest) ec.getRequest();
            request.getSession(false).invalidate();
     
            return "logout";
        }
    tu noteras que j'ai fait disparaitre ton "redirect" par la génération de "logout" qui est l'outcome de ta règle.


    donc si je résume en français :

    depuis n'importe quelle vue, quand l'action retournée par une commande (link ou button) est "logout", ça redirige par la page d'accueil. Et comme le lien appelle la méthode "logout", la session est invalidée.
    Moins on code, moins il y a de bug ... et vice-versa ainsi qu'inversement ...

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 104
    Points : 102
    Points
    102
    Par défaut
    hello,

    le problème venait effectivement de from-view-id.
    /* résoud bien le problème.

    merci

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

Discussions similaires

  1. Redirection vers une page avec des données en post
    Par TokTokTok dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 11/03/2013, 16h31
  2. Redirection vers une page, avec des arguments
    Par ::Fistons dans le forum JSF
    Réponses: 3
    Dernier message: 29/07/2007, 15h25
  3. Redirection vers un page avec variable en parametre
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 18h49
  4. [PRO] redirection vers une page
    Par Mister_FX dans le forum ASP
    Réponses: 10
    Dernier message: 23/06/2004, 17h31
  5. Réponses: 13
    Dernier message: 16/04/2004, 12h00

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