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 :

problème de redirection (la réponse a déjà été envoyée)


Sujet :

JSF Java

  1. #1
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut problème de redirection (la réponse a déjà été envoyée)
    Bonjour j'ai un site (un annuaire) dans lequel on peut inscrire son site, quand on clique sur "ajouter un site" le ManagedBean teste si l'utilisateur est connecté, si non il le redirige vers une autre page.
    Seulement ça ne passe pas mes log me disent que la réponse à déjà été envoyé, pourtant j'utilise la même technique sur mon site d'échange de liens (réutilisation du code même) et là ça marche.
    Voici mon code :
    La vue /WEB-INF/base/add_site.xhtml
    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
    <ui:composition template="/WEB-INF/#{deviceDetector.path}/template.xhtml"
                    xmlns="http://www.w3.org/1999/xhtml"
                    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                    xmlns:h="http://xmlns.jcp.org/jsf/html"
    		xmlns:pm="http://primefaces.org/mobile"
    		xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
        <ui:define name="title">Ajouter un site dans l'annuaire - #{datas.SITENAME}</ui:define>
        <ui:define name="description">
            <meta name="description" content="#{datas.SITENAME}, Ajoutez votre site dans l'annuaire." />
        </ui:define>
        <ui:define name="content" rendered="#{deviceDetector.model==0}">
            <ui:include src="/WEB-INF/pages/add_site.xhtml" />
        </ui:define>
     
        <ui:define name="mobile_body" rendered="#{deviceDetector.model==1}">
           <ui:include src="/WEB-INF/mobile_pages/soon.xhtml" />
        </ui:define>
    </ui:composition>
    La vue (inclusion du fichier /WEB-INF/pages/add_site.xhtml):
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <ui:composition
        xmlns="http://www.w3.org/1999/xhtml"
        xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
        xmlns:h="http://xmlns.jcp.org/jsf/html"
        xmlns:p="http://primefaces.org/ui"
        xmlns:f="http://xmlns.jcp.org/jsf/core">
        <h:panelGroup layout="block" class="ui-messages-error" rendered="#{addSite.test==2}">
    	<span class="ui-messages-error-icon"></span>
    	<span class="ui-messages-error-summary">Erreur !</span>
    	<p class="ui-messages-error-detail"><h:outputText value="#{addSite.errorMsg}" escape="false"/></p>
        </h:panelGroup>
        <p:panel header="Ajouter un site" rendered="#{addSite.test!=2}">
    	<h:panelGroup layout="block" class="ui-messages-info">
    	    <span class="ui-messages-info-icon"></span>
    	    <span class="ui-messages-info-summary">Info : </span>
    	    <p class="ui-messages-info-detail">Avant de remplir le formulaire, veuillez lire ceci :<br/>
    	    tout d'abord nous n'acceptons pas tous les sites, les sites douteux seront écartés, à savoir les sites pornos, les sites sur les armes, la politiques,
    	    la religion, les drogues ... les sites qui promeuvent les comportements illégaux.<br/>
    	    Si vous pensez que votre site ne fait pas parti de cette liste noire, soumettez votre site, sinon ne perdez pas votre temps.</p>
    	</h:panelGroup>
    	<br/>
    	<h:form id="form">
    	    <p:fieldset legend="Ajouter un site">
    		<p:tooltip for="categories" value="Jusqu'à #{datas.NBMAXCATEGORY} catégories, choisissez ou ajoutez les votres." showEffect="drop"
    			   hideEffect="drop"/>
    		<p:tooltip for="description" value="De #{datas.DESCSITEMINLEN} à #{datas.DESCSITEMAXLEN} caractères." showEffect="drop"
    			   hideEffect="drop"/>
    		<p:messages autoUpdate="false" globalOnly="true" closable="true" showDetail="true" showIcon="true" showSummary="true" escape="false" severity="error"/>
    		<p:messages autoUpdate="false" globalOnly="true" closable="true" showDetail="true" showIcon="true" showSummary="true" escape="false" severity="info"/>
    		<h:panelGrid columns="3">
    		    <p:outputLabel for="titre" value="Titre de votre site : "/>
    		    <p:inputText id="titre" value="#{addSite.titre}" required="true" requiredMessage="Champ vide" size="#{datas.TITLESITEMAXLEN}"
    				 maxlength="#{datas.TITLESITEMAXLEN}" placeholder="#{datas.TITLESITEMINLEN} à #{datas.TITLESITEMAXLEN} caractères"
    				 validator="titreSiteValidator"/>
    		    <p:message for="titre" severity="error"/>
    		    <p:outputLabel for="url" value="URL de votre site : "/>
    		    <h:panelGroup layout="block">
    			<p:selectOneMenu id="protocol" required="true" requiredMessage="Choisissez une option" validator="protocolValidator"
    					 class="inline_block align_middle" value="#{addSite.protocol}">
    			    <f:selectItem itemLabel="http://" itemValue="0"/>
    			    <f:selectItem itemLabel="https://" itemValue="1"/>
    			</p:selectOneMenu>
    			<p:inputText id="url" type="url" value="#{addSite.url}" required="true" requiredMessage="Champ vide" size="50"
    				     maxlength="#{datas.URLSITEMAXLEN}" placeholder="Adresse de votre site" validator="urlSiteValidator"
    				     class="inline_block align_middle"/>
    		    </h:panelGroup>
    		    <h:panelGroup layout="block">
    			<p:message for="protocol" severity="error"/>
    			<p:message for="url" severity="error"/>
    		    </h:panelGroup>
    		    <h:panelGroup layout="block">
    			<p:outputLabel for="description" value="Courte description de votre site : "/>
    			<br/>
    			<h:outputText id="display"/>
    		    </h:panelGroup>
    		    <p:inputTextarea id="description" value="#{addSite.description}" cols="100" rows="15" maxlength="#{datas.DESCSITEMAXLEN}"
    				     placeholder="#{datas.DESCSITEMINLEN} à #{datas.DESCSITEMAXLEN} caractères" counterTemplate="{0} caractère(s) restant."
    				     counter="display" validator="descriptionSiteValidator" required="true" requiredMessage="Champ vide"/>
    		    <p:message for="description" severity="error"/>
    		    <p:outputLabel for="categories" value="Catégories de votre site : "/>
    		    <p:autoComplete id="categories" multiple="true" value="#{addSite.categories.categories}" size="50" maxlength="50"
    				    maxResults="#{datas.NBMAXCATEGORY}"
    				    completeMethod="#{addSite.categories.complete}" required="true" requiredMessage="Champ vide" 
    				    forceSelection="true" validator="addCategoriesValidator" placeholder="#{datas.NBMAXCATEGORY} max"
    				    converter="categoryConverter"
    				    var="category" itemLabel="#{category.name}" itemValue="#{category}">
    			<p:ajax event="itemUnselect" update="categories"/>
    			<p:ajax event="itemSelect" update="categories"/>
    		    </p:autoComplete>
    		    <h:panelGroup layout="block">
    			<p:commandButton icon="ui-icon-trash" value="VIDER" action="#{addSite.categories.emptyCategories()}" update="categories"
    					 partialSubmit="true" process="@this"/>
    			<br/>
    			<p:message for="categories" severity="error"/>
    		    </h:panelGroup>
    		    <p:commandButton value="Valider" action="#{addSite.actionValidate()}" update="@form" icon="fa fa-check-circle"/>
    		</h:panelGrid>
    	    </p:fieldset>
    	</h:form>
        </p:panel>
    </ui:composition>
    Enfin mon Managed Bean AddSite.java
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    package beans;
     
    import classes.MyException;
    import classes.Site;
    import java.io.IOException;
    import java.io.Serializable;
    import java.io.UnsupportedEncodingException;
    import java.sql.SQLException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.annotation.PostConstruct;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ViewScoped;
    import javax.naming.NamingException;
     
    /**
     *
     * @author pj
     */
    @ManagedBean
    @ViewScoped
    public class AddSite extends Site implements Serializable {
     
        /**
         * Creates a new instance of AddSite
         */
        public AddSite() {
        }
     
        @PostConstruct
        public void postConstruct() {
            try {
                user.testConnection();
                if (user.getTest() == 3) {
                    test = 2;
                    createCookie("cookie_status", "1");
                    setHTTP();
                    facesContext.getExternalContext().redirect(response.encodeRedirectURL("/pas-connecte.html"));
                }
            } catch (SQLException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                sqlException(ex);
            } catch (MyException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                myException(ex);
            } catch (NamingException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                namingException(ex);
            } catch (IOException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                ioException(ex);
            } finally {
                closeConnection();
            }
        }
     
        public void actionValidate() {
            try {
                record();
                createCookie("ids", id + "");
                setHTTP();
                facesContext.getExternalContext().redirect(response.encodeRedirectURL("/soumission.html"));
            } catch (SQLException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                sqlException(ex);
            } catch (NamingException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                namingException(ex);
            } catch (MyException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                myException(ex);
            } catch (UnsupportedEncodingException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                unsupportedEncodingException(ex);
            } catch (IOException ex) {
                Logger.getLogger(AddSite.class.getName()).log(Level.SEVERE, null, ex);
                ioException(ex);
            } finally {
                closeConnection();
            }
        }
     
    }
    J'avoue que je bloque un peu, comme je disais sur mon autre site ça marche bien, le code est identique.
    Merci.

  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 dans l'action que tu dois faire ton redirect.

    Le postconstruct peux être appelé n'importe quand dans ton rendu de page, lorsque ton bean est créé. Si tu veux intervenir lors du get de la page, il vaux mieux passer par un filtre pour pouvoir intervenir avant le rendu. Ou à la rigueur un PhaseListener, mais çà relève de l'abus.

  3. #3
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    C'est dans l'action que tu dois faire ton redirect.

    Le postconstruct peux être appelé n'importe quand dans ton rendu de page, lorsque ton bean est créé. Si tu veux intervenir lors du get de la page, il vaux mieux passer par un filtre pour pouvoir intervenir avant le rendu. Ou à la rigueur un PhaseListener, mais çà relève de l'abus.
    Merci pour ta réponse, je pensais que le managedBean était traité avant l'affichage de la vue, par contre l'action se déclenche qu'au post du formulaire donc c le cas ou je ne dois pas refaire de redirection, ça fait un moment que j'utilise JSF et Primefaces et je ne sais toujours pas comment sont traités les beans et les vues, pour moi le bean était exécuté puis ensuite la vue affichée avec éventuellement récupération des attributs du bean, bref il me faudrait un bon tuto.
    Je vais essayer de voir du coté des filtres.
    Merci.

  4. #4
    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
    La vue est exécutée en phases. La vue forme un arbre. Chaque branche de l'arbre s'exécute à chaque phase relevante. Lors d'un get, tu saute directement à la phase render view. Chaque élément de l'arbre génère sa vue. Les beans sont simplement créés à la demande lorsque la première EL qui leur correspond est évaluée. Leur scope indique ensuite pendant combien de temps ils resteront vivant, mais ca n'indique nullement quand ils seront créés. Donc pour résumer:


    JSF => phase => composants => EL nécessaires à ce composant => bean

    Ainsi, l'EL associé à un action ne sera utilisée que pour l'exécution de l'action par le composant, l'EL associée à la value d'un output ne sera évaluée que lors du rendu html de ce composant, l'EL associée à une propriété rendered sera évaluée à chaque fois qu'on passe sur le composant pour savoir si on dois l'ignorer ou pas.

  5. #5
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    La vue est exécutée en phases. La vue forme un arbre. Chaque branche de l'arbre s'exécute à chaque phase relevante. Lors d'un get, tu saute directement à la phase render view. Chaque élément de l'arbre génère sa vue. Les beans sont simplement créés à la demande lorsque la première EL qui leur correspond est évaluée. Leur scope indique ensuite pendant combien de temps ils resteront vivant, mais ca n'indique nullement quand ils seront créés. Donc pour résumer:


    JSF => phase => composants => EL nécessaires à ce composant => bean

    Ainsi, l'EL associé à un action ne sera utilisée que pour l'exécution de l'action par le composant, l'EL associée à la value d'un output ne sera évaluée que lors du rendu html de ce composant, l'EL associée à une propriété rendered sera évaluée à chaque fois qu'on passe sur le composant pour savoir si on dois l'ignorer ou pas.
    ok merci pour ces précisions, j'y vois plus clair :-)

  6. #6
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Bonsoir, finalement j'ai opté pour de la génération de code js via mon managedBean, perso je trouve pas ça très élégant mais je dois créer un cookie avec une certaine valeur suivant la vue donc le seul moyen de le faire c dans le managedBean (bon c kiss koi).
    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
        @PostConstruct
        public void postConstruct() {
            try {
                testConnection();
                if (test == 3) {
                    createCookie("cookie_status", "2");
                    errorMsg="Vous devez être connecté.<br/>";
                    RequestContext.getCurrentInstance().execute("window.location.href='/pas-connecte.html';");
                }
            } catch (SQLException ex) {
                Logger.getLogger(Account.class.getName()).log(Level.SEVERE, null, ex);
                sqlException(ex);
            } catch (MyException ex) {
                Logger.getLogger(Account.class.getName()).log(Level.SEVERE, null, ex);
                myException(ex);
            } catch (NamingException ex) {
                Logger.getLogger(Account.class.getName()).log(Level.SEVERE, null, ex);
                namingException(ex);
            } finally {
                closeConnection();
            }
        }

  7. #7
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 014
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    ah maintenant c'est le cookie qui n'est pas créé.

  8. #8
    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
    cookie, redirect, même combat, ça se joue dans les headers, à faire avec le response.

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/04/2006, 16h16
  2. Problème de Redirection
    Par pirouette_07 dans le forum Apache
    Réponses: 1
    Dernier message: 30/03/2006, 13h50
  3. [Cookies] Problèmes de redirection
    Par mogway95 dans le forum Langage
    Réponses: 6
    Dernier message: 19/02/2006, 00h13
  4. Problème de redirection d'index
    Par Bluelane dans le forum Apache
    Réponses: 8
    Dernier message: 16/09/2005, 17h50
  5. Problème de redirection avec window.location
    Par Kosti dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/11/2004, 18h31

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