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 :

Participez à la FAQ JSF


Sujet :

JSF Java

  1. #1
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 72 948
    Points
    72 948
    Par défaut Participez à la FAQ JSF
    Bonjour,

    La FAQ JSF est ouverte à tous, vous pouvez donc y participer activement. Soit vous pouvez poster vos questions et réponses dans cette enfilade, soit vous pouvez utiliser l'application collaborative d'édition de FAQ.

    L'adresse de la FAQ : http://javaweb.developpez.com/faq/jsf/

    Merci à tous pour vos contributions.

    L'équipe Java

  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
    Q: Comment créer un composant personnalisé par composition ?

    R: Tout d'abord, il faut disposer de la librairie Facelets.

    Etape 1: Créer le fichier XHTML du composant.
    Créons par exemple le fichier myComponentCompositionPage.xhtml dans le répertoire tag:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" ...>
        <!-- Code JSF du composant -->
    </ui:composition>
    Etape 2: Ajouter la définition du composant dans le Taglib Facelets (dans un fichier xxx.taglib.xml)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <facelet-taglib>
        <namespace>http://my.components/jsf</namespace>
        ...
        <tag>
            <tag-name>componentName</tag-name>
            <source>tags/myComponentCompositionPage.xhtml</source>
        </tag>
    </facelet-taglib>
    Etape 3: Utilisation dans son code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <html xmlns:my ...>
        ...
        <my:componentName .../>
        ...
    Astuce: Donner des attributs à son composant.

    En écrivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <my:componentName unAttribut="uneValeur"/>
    on peut récupérer la valeur de cet attribut dans sa composition ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <ui:composition ...>
        <h:outputText value="#{unAttribut}"/>
        ...
    Avantages: Facile et rapide à écrire et à intégrer.
    Inconvénients : Ne permet pas de définir l'ID de son composant, composition parfois complexe à écrire (nécessite beaucoup d'expression EL).

  3. #3
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: Comment désactiver le cache du browser coté serveur ?

    Réponse:

    - Implementer le phase listner:

    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
     
    public class  CacheControlePhaseListener implements javax.faces.event.PhaseListener {
     
    	public void afterPhase(PhaseEvent arg0) {
     
    	}
     
                public void beforePhase(PhaseEvent event) {
     
    		// manage cache controle
     
    		FacesContext context = event.getFacesContext();
    		HttpServletResponse response = (HttpServletResponse)  context.getExternalContext().getResponse();
     
      response.addHeader("Cache-Control", "no-chache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform, pre-check=0, post-check=0, private");
     
     }
     
    	public PhaseId getPhaseId() {
     
    		return PhaseId.ANY_PHASE;
    	}
     
    }
    il suffit ensuite de déclarer le listener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     <lifecycle>     <phase-listener>net.developpez.faq.CacheControlePhaseListener</phase-listener>
       </lifecycle>

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: comment récupérer la valeur d'un bean en session? [JSF1.2]

    Réponse

    la réponse présente dans la FAQ contient des méthodes devenues deprecated dans la version 1.2 de JSF :

    En 1.2, on doit utiliser ValueExpression au lieu de ValueBinding:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SessionBean sessionBean = (SessionBean ) context.getApplication().getExpressionFactory().createValueExpression(context.getELContext(), "#{sessionBean}",SessionBean.class).getValue(context.getELContext());
    [edit=djo.mos]
    Intégré [avec modifications: ce n'est pa slimité aux beans sessions]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 79
    Points : 58
    Points
    58
    Par défaut
    Q: Comment charger des fichiers de ressources (Javascript, CSS, etc.) à partir d'un JAR ?

    R: 5 façons pour y remedier :


    1) avec une servlet qui va localiser les ressources
    2) avec un servlet filter, tout comme Myfaces tomahawk extension Filter
    3) en utilisant weblet ça nécessite un fichier de configuration weblet-config.xml
    4) en utilisant le composant <a4j:loadScript> :

    par exemple si le chemin dans le fichier jar est : /resources/js/myscript.js alors mettre dans la page jsf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <a4j:loadScript src="resource///resources/js/myscript.js"/>
    
    // tès important ne pas oublier le préfix resource//
    5) et enfin avec un Phase Listener dont voici le détail comment y remédier :


    Il faut définir le Phase Listener qui va charger/contrôler les url
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    package myPackage;
     
    /**
    * @author Mediii.
    */
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.HashMap;
    import java.util.Map;
    import javax.faces.FacesException;
    import javax.faces.application.ViewHandler;
    import javax.faces.context.ExternalContext;
    import javax.faces.context.FacesContext;
    import javax.faces.event.PhaseEvent;
    import javax.faces.event.PhaseId;
    import javax.faces.event.PhaseListener;
    import javax.servlet.http.HttpServletResponse;
     
    public class ResourcePhaseListener implements PhaseListener {
     
       public static final String RESOURCE_PREFIX = "/resource";
     
       public static final String RESOURCE_LOCATION_PARAM = "r";
     
       public static final String CONTENT_TYPE_PARAM = "ct";
     
       public static final String DEFAULT_CONTENT_TYPE = "application/octet-stream";
     
       private Map<String, String> extensionToContentType = null;
     
       public ResourcePhaseListener() {
          extensionToContentType = new HashMap<String, String>();
          extensionToContentType.put(".js", "text/javascript");
          extensionToContentType.put(".gif", "image/gif");
          extensionToContentType.put(".jpg", "image/jpeg");
          extensionToContentType.put(".jpeg", "image/jpeg");
          extensionToContentType.put(".png", "image/png");
          extensionToContentType.put(".css", "text/css");
       }
     
       public PhaseId getPhaseId() {
          return PhaseId.RESTORE_VIEW;
       }
     
       public void beforePhase(PhaseEvent phaseEvent) {
       }
     
       public void afterPhase(PhaseEvent event) {
          if (event.getFacesContext().getViewRoot().getViewId().startsWith(
                RESOURCE_PREFIX)) {
             FacesContext context = event.getFacesContext();
             ExternalContext external = context.getExternalContext();
     
             String resourcePath =
                   (String) external.getRequestParameterMap().get(
                         RESOURCE_LOCATION_PARAM);
             if (resourcePath == null)
                return;
     
             String contentType =
                   (String) external.getRequestParameterMap().get(
                         CONTENT_TYPE_PARAM);
             if (contentType == null) {
                int extensionIndex = resourcePath.lastIndexOf(".");
                if (extensionIndex != -1)
                   contentType =
                         extensionToContentType.get(resourcePath
                               .substring(extensionIndex));
                if (contentType == null)
                   contentType = DEFAULT_CONTENT_TYPE;
             }
     
             InputStream in = getClass().getResourceAsStream(resourcePath);
             HttpServletResponse servletResponse =
                   (HttpServletResponse) external.getResponse();
             try {
                OutputStream out = servletResponse.getOutputStream();
                servletResponse.setContentType(contentType);
                int ch;
                while ((ch = in.read()) != -1)
                   out.write(ch);
             } catch (IOException ex) {
                throw new FacesException(ex);
             }
             context.responseComplete();
          }
       }
     
       /**
        * Returns a URL for fetching a resource through this listener
        * 
        * @param context the faces context
        * @param String resourcePath the path to the resource
        * @param String contentType the content type to include in the URL, or null
        *           if no content type should be included
        * @return the URL of the form
        *         /appname/resource.faces?r=resourcePath,ct=contentType or
        *         /appname/faces/resource?r=resourcePath,ct=contentType
        */
       public static String getURL(FacesContext context, String resourcePath,
             String contentType) {
          ViewHandler handler = context.getApplication().getViewHandler();
     
          String url = handler.getActionURL(context, RESOURCE_PREFIX);
          StringBuilder r = new StringBuilder(url);
          r.append("?" + RESOURCE_LOCATION_PARAM + "=").append(resourcePath);
          if (contentType != null)
             r.append("," + CONTENT_TYPE_PARAM + "=").append(contentType);
          return r.toString();
       }
    }
    ensuite dans le renderer d'un composant on peut appeler un script contenu dans un jar par exemple si le chemin est resources/js/myscript.js alors on ecrira :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    writer.startElement("script", component);
    writer.writeAttribute("src", ResourcePhaseListener.getURL(context, "/resources/js/myscript.js", null), null);
    writer.writeAttribute("type", "text/javascript", null);
    writer.endElement("script");
    ...
    ne pas oublier de déclarer dans le faces-config.xml notre phaseListener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    <lifecycle>
            <phase-listener>myPackage.ResourcePhaseListener</phase-listener>
    </lifecycle>

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: comment invalider la session d'un user ?

    Réponse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:commandButton action="monBean.disconnect" />

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public String  disconnect() {
    FacesContext context = FacesContext.getCurrentInstance().getCurrentInstance();	
    HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
    session.invalidate();
    return "login";
    }
    [edit=djo.mos]
    Intégré

  7. #7
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: comment prévenir l'accès direct au pages jsf?

    Réponse:
    la spécification des servlets interdit l'accés au contenu des dossiers /WEB-INF/ et /META-INF/ d'une application web.
    la solution serait de mettre les pages JSP dans le dossier /WEB-INF/
    ainsi un exemple de navigation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <navigation-rule>
        <from-view-id>/login.jsp</from-view-id>
        <navigation-case>
          <from-outcome>accepted</from-outcome>
          <to-view-id>/WEB-INF/index.jsp</to-view-id>
        </navigation-case>
      </navigation-rule>
    NB: cette méthode a été testé avec myfaces 1.1.5 sans utiliser les facelets, il semble que cela ne fonctionne pas avec les facelets..
    à suivre..

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 9
    Points : 10
    Points
    10
    Par défaut Comment gérer l'expiration de session dans JSF
    Question: Comment échaper au pièges des sessions qui expirent en JSF ?

    Coté interface:

    Notamment avec JSF 1.2. RI Quand on clique sur une page d'une session expirée, des erreurs sont affichées dans la trace et on a une page blanche.

    La page est obtenue par l'envoi d'un formulaire dans lequel il y a une variable ViewState. Le serveur prend cela pour un POST BACK. Il essaie donc de récupérer les infos de la vue. Quand ces infos sont stockées sur le serveur et que la session a expiré, il n'y arrive pas et lance une erreur. Si on a choisi de sauver les informations sur le client, normalement ce problème n'arrive pas.

    Si on cherche uniquement à re-obtenir la page, le mieux est de revenir au mode compatibilité JSF 1.1 en mettant ceci dans le web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <context-param>
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
    <param-value>true</param-value>
    </context-param>
    Si on veut faire quelquechose de plus particulier, il faut détecter le cas par un PhaseListener qui s'éxécute avant la phase RESTORE_VIEW et que l'on déclare dans le face-config.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class SessionExpirationListener implements PhaseListener {
     
    public PhaseId getPhaseId() {
    	return PhaseId.RESTORE_VIEW;
    }
     
    public void beforePhase(PhaseEvent event) {
    // Faire quelquechose ...
    }
     
    public void afterPhase(PhaseEvent event) {
    // Rien a faire ici
    }
    }
    Il y a un exemple ici http://solutionsfit.com/blog/2007/11...seam-security/
    au aura toujours du mal à faire la différence entre un ViewState expiré et un neuf sans demander au composant qui gère les ViewStates.

    On peut enfin encore mieux gérer le problème comme ici (pas encore essayé) http://in.relation.to/Bloggers/Imple...amJSFAndJQuery
    En résumé, il demande au serveur confirmation de l'expiration par AJAX 3 secondes après la fin. Il désactive alors tous les liens et boutons et prévient l'utilisateur. Ce dernier peut recopier ses données (et lui dit merci dans le cas d'un long texte) mais doit re-initialiser la session.

    Coté données:

    Je fait implémenter l'interface javax.servlet.http.HttpSessionBindingListener à mes Beans en session et le code de valueUnbound(...) est lancé quand la session se termine.

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par orden Voir le message
    Question: Comment échaper au pièges des sessions qui expirent en JSF ?
    salut,

    peut tu preciser l'environnement technqiue.?
    je n'avais pas réussi à le faire fonctionner, avec myfaces 1.2.2, facelets 1.1.14 et richfaces 3.2.0.

    mercii

  10. #10
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question : gestion de l'expiration de session ? (myfaces 1.2.2-facelets 1.1.14-richfaces 3.2-tomcat 5.5)

    Réponse

    JSF 1.2 génére l'exception ViewExpiredException lorsque la session expire, cette exception n'est pas gerer par JSF et ne peut pas etre attraper par le serveur tomcat ..

    la solution décrite par orden permet de dire au framework rendre compatible le restoreview entre 1.1 et 1.2, ce qui évite d'avoir l'exception.

    cette solution ne fonctionne pas pour l'environnement ci dessus..

    pour contourner le problème, il suffit d'implementer le PhaseListener de JSF:public class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    BasePhaseListener implements PhaseListener {
     
    }
    redefinir la methode afterPhase

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void afterPhase(PhaseEvent e) {
     
    /** **/
    }
    - les phases qui nous interessent :RESTORE_VIEW et INVOKE_APPLICATION.

    - lorsque la session expire; le ViewHandler de JSF, ne fait pas le restoreView censé faire le buildView, ce qui donne pour les deux phases le viewRoot = null

    il suffit donc de faire:

    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
     
    PhaseId phaseid = e.getPhaseId();
    FacesContext context = e.getFacesContext();
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
    if (phaseid == PhaseId.RESTORE_VIEW || phaseid == PhaseId.INVOKE_APPLICATION) {
     
     
    if (context.getViewRoot() == null) {
     
     
    try {
    response.sendRedirect("login.jsf"); // la vue peut etre definit dans un parametre du context web
    } catch (IOException e1) {
     
     
    }
    }

  11. #11
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Reçu par MP:

    Citation Envoyé par davdou
    Bonjour,

    Juste un petit mail pour vous indiquer une autre astuce pour la page d'accueil de JSF.
    Si la page d'accueil est : index.jsf.
    Vous avez dans webcontent, un fichier index.jsp

    1) Modifier web.xml
    <welcome-file-list>
    <welcome-file>index.jsf</welcome-file>
    </welcome-file-list>

    2) Créer un fichier index.jsf avec un commentaire

    <%--
    Please DO NOT delete this file. This file is used
    to trick tomcat to detect index.jsf as the
    welcome file and will load index.jsp instead.
    --%>

    Astuce trouvé sur le forum sun.

    http://forum.java.sun.com/thread.jsp...sageID=4046082

    cordialement,
    [edit=djo.mos]
    Intégré [avec modifications: ce n'est pa slimité aux beans sessions]

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: Comment valider plusieurs champs d'un formulaire à la fois?

    Réponse:

    1-Ajouter un validator au dernier composant à valider:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:inputText id="last_input" value="#{bean.lastInput}" validator="#{bean.validate}" required="true"/>
    Ou ajouter au formulaire un champs input de type hidden, il doit etre placé après les autres champs à contrôler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <h:inputHidden value="validate" id="validate" required="true" validator="#{bean.validate}"/>
    </h:form>
    dans le backing bean la fonction de validation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void validate(FacesContext context, 
                              UIComponent toValidate,
                              Object value){
     
    //1. récupérer les valeurs à vérifier. voir ci-dessous
     
    boolean isValide; // true si les valeurs sont valides, false sinon
     
    if(!isValide){
    throw new ValidatorException(new FacesMessage("Veuillez vérifier les paramètres..."));
     
    }
    Pour récupérer la valeur des composants à l'intérieur de la fonction de validation.

    Pour le composant qui contient le validator:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String valueToValidate= (String) value;
    Pour les autres composants ou si le validator est dans un input hidden

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FacesContext context = FacesContext.getCurrentInstance();
    UIInput input =(UIInput)context.getViewRoot().findComponent("component_id");
    Ou en utilisant le binding du composant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String inputValue= (String) inputBinding.getValue();
    pour afficher le message coté JSP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h:message for="validate" />

  13. #13
    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
    J'avoue ne pas voir l'utilité du hidden...

    Avec ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <h:form id="form">
      <h:inputText value="#{bean.mail}"  />
      <h:inputText value="#{bean.login}"  />
      <h:inputText value="#{bean.password}"  />
      <h:commandButton action="#{bean.connect}"/>
    </h:form>
    et ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public String connect() {
      if ((login == null) && (password == null)) {
        FacesContext.getCurrentInstance().addMessage(new FacesMessage("Vous devez saisir votre login et mot de passe pour continuer"));
        return null;
      }
      // Code à exécuter si tout est ok...
      return "regleDeNavigationARetourner";
    }
    ça marche très bien aussi...

  14. #14
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    J'avoue ne pas voir l'utilité du hidden...
    l'utilité du hidden est de faire de la validation des champs avec JSF, ce que tu propose ne se réalise pas pendant la phase validation de JSF et je ne suis pas sur que tu puisses ajouter un message de validation..lors de la phase invoke application il n'est plus possible d'ajouter un message à la queue des mesasges JSF..
    c'est peu etre plus parlant d'ajouter un validator à l'input hidden, mon exemple est peu etre mal choisi..je l'ai modifié.

  15. #15
    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
    Ah oui, ça change un peu là !
    En effet, si tu mets un validator sur ton hidden, là il y a un vrai intérêt !

    Cependant, ma méthode fonctionne également, mais il est vrai que les tests exécutés dans la méthode connect sont lancés après la phase de validation...

  16. #16
    Membre actif Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Points : 245
    Points
    245
    Par défaut
    merci Sniper37 pour le validation mais est ce que tu peut compléter on spécifions comment afficher les messages d'erreur depuis message.proprties .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    message.setDetail("Veuillez saisir le login ou l'adresse mail");

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: Qu’est ce que c’est la view (vue )JSF ?

    Réponse:

    La vue représente l’arbre de composants JSF contenus dans la page JSP sa racine est <f :view/>
    La vue JSF est sauvegardé coté client ou serveur suivant la définition du paramètre javax.faces.STATE_SAVING_METHOD.

  18. #18
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: Comment définir la méthode de sauvegarde de la vue JSF ?

    Réponse:
    La méthode de sauvegarde de la vue JSF est déterminée par le paramètre du context javax.faces.STATE_SAVING_METHOD dont la valeur par défaut est server.
    on peut modifier cette valeur dans le fichier de configuration web.xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <context-param>
      <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
      <param-value>client/server</param-value>
     </context-param>
    La valeur de ce paramètre peut être client ou server

  19. #19
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Points : 5 059
    Points
    5 059
    Par défaut
    Question: quelle est la différence entre les méthodes de sauvegarde de la vue JSF?

    Réponse:

    La sauvegarde de la vue JSF se fait coté client dans le navigateur web par le biais d’un champ input-text de type hidden.
    La méthode server enregistre la vue JSF dans la session http.

    la méthode client peut être utile lorsque l’utilisateur désactive les cookies, toutefois, cette méthode augmente le temps de réponse surtout dans le cas d’une mauvaise connexion, de plus, la présence des données sensibles sauvegardés dans les POJO dans le navigateur, rend cette méthode plus vulnérable à une attaque.

    La méthode server est plus gourmande en mémoire mais, elle minimise l’utilisation de la bande passante.

  20. #20
    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
    Question :

    Comment récupérer un élément HTML généré par du JSF en utilisant du Javascript ?
    Pourquoi ne retrouvé-je pas mon élémént HTML par son ID dans ma page HTML ?
    (j'hésite à savoir laquelle de ces questions est la plus pertinente)

    Réponse :

    Les IDs des champs d'un formulaire sont préfixés par l'ID du formulaire.
    Plus généralement, tous les composants JSF dont un parent (direct ou non) implémente l'interface NamingContainer sont concernés (c'est essentiellement le cas pour le composant HtmlForm).

    Ainsi, si on prend le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:form id="monFormulaire" ...>
        <h:inputText id="monChamp" .../>
        ...
    le code HTML généré par JSF pour l'input text sera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input ... id="monFormulaire:monChamp">
    Pour récupérer ce champ en Javascript, il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var obj = document.getElementById("monFormulaire:monChamp");
    Du côté Java, la méthode monInputText.getId() retournera "monChamp" - c'est-à-dire l'ID du composant - tandis que monInputText.getClientId(facesContext) retournera "monFormulaire:monChamp" - c'est-à-dire l'ID complet du composant, celui utilisé dans la page HTML.

    Edit pour être tout à fait complet


    Le composant formulaire dispose toutefois de l'attribut prependId qui permet de ne pas préfixer les composants enfants de ce formulaire avec l'ID de ce dernier, pour peu que la valeur soit à false. Ainsi, le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <h:form id="monFormulaire" prependId="false">
        <h:inputText id="monChamp" .../>
        ...
    générera un composant HTML input dont l'ID sera "monChamp".

Discussions similaires

  1. Participez à la FAQ JDBC
    Par Mickael Baron dans le forum JDBC
    Réponses: 7
    Dernier message: 23/09/2013, 18h26
  2. Participez à la FAQ Struts
    Par Mickael Baron dans le forum Struts 1
    Réponses: 3
    Dernier message: 05/04/2007, 23h00
  3. [Participez à la FAQ !] La question de la semaine
    Par Giovanny Temgoua dans le forum Langage
    Réponses: 18
    Dernier message: 13/12/2005, 10h58
  4. Participez à la FAQ Java EE
    Par Mickael Baron dans le forum Java EE
    Réponses: 1
    Dernier message: 28/08/2003, 12h49

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