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 :

JSF validator, null problem, second round


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut JSF validator, null problem, second round
    Bonjour,

    suite à mon dernier post JSF validator, null problem (http://www.developpez.net/forums/d95...-null-problem/) j'ai fait plusieurs test avec mon code.
    Je suis arrivée à la conclusion que dans 4 cas, la valeur précédente à l'erreur donnée par mon validator n'est plus retournée:

    1. disabled="true"
    La valeur d'origine n'est pas retournée.


    2. quand le value est conditionné, exemple pour 2 inputText:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value="#{testForm.status == 0 ? 'Ready' : testForm.status == 1 ? 'Act' : testForm.status == 2 ? 'Deact' : testForm.status == 3 ? 'Test' : 'Unknown'}"
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value="#{testForm.type==10 ? 'S' : testForm.type==2 ? 'H' : ''}"
    Dans ce cas, la page affiche l'erreur Error during model Data Update à côté du champ.

    3. le champ est un outputText

    4. le rendered a certains conditions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendered = "#{auth.history}"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendered="#{empty auth.partner}"
    c'est OK, mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendered="#{not empty testForm.test && (testForm.status==1 || testForm.status==3)}" />
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendered="#{not empty testForm.testFields['OS_VERSION']}"
    ne fonctionnent pas! À noter que si j'affiche les valeur des conditions dans un inputText, cela ne sont pas vides!

    Pourquoi celà?? Comment faire pour récupérer ces valeurs??

  2. #2
    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
    Par défaut
    Si le composant est disable ou que le rendered est à false au début, il n'est pas présent dans le DOM, donc la valeur n'est pas transmise.
    Pour éviter ces problèmes, il vaut mieux mettre la condition sur un composant parent un panelGroup par exemple.

    le Et logique avec la version de EL avec JSF 1.2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rendered="#{bean.condition1 and bean.condition2}"

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Bobble Voir le message
    .
    Je suis arrivée à la conclusion que dans 4 cas, la valeur précédente à l'erreur donnée par mon validator n'est plus retournée:

    1. disabled="true"
    La valeur d'origine n'est pas retournée.
    Les champs disabled ne sont pas soumis par le forumlaire -> exclu du apply_request value/validation/stockage dans les bean

    2. quand le value est conditionné, exemple pour 2 inputText:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value="#{testForm.status == 0 ? 'Ready' : testForm.status == 1 ? 'Act' : testForm.status == 2 ? 'Deact' : testForm.status == 3 ? 'Test' : 'Unknown'}"
    Cette valeur n'est pas légale dans un champ input, sur quel bean tu voudrais stocker??
    3. le champ est un outputText
    Les champs d'output n'ont aucune raison de passer dans un validator

    4. le rendered a certains conditions:
    Le composant evaluent à chaque étape de leur cycle de vie le rendered. Si celui-ci est false, il s'excluent de cette étape. C'est ainsi qu'on peux avoir un composant qui ignore le submit (rendered =false) mais s'affiche quand même (passage à true quand les données sont stockées dans le bean)
    Pourquoi celà?? Comment faire pour récupérer ces valeurs??
    Le validator n'a pas pour role de récupérer des valeur, juste de le valider avant que celle-ci ne soient copiée dans les backing beans.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut
    Si le composant est disable ou que le rendered est à false au début, il n'est pas présent dans le DOM, donc la valeur n'est pas transmise.
    ça maintenant c'est clair. J'ai donc enlevé tous les disabled et remplacé par readonly.

    Pour le point 2. j'ai aussi modifié le code et j'ai mis la condition dans un bean, maintenant c'est mieux.

    Les champs d'output n'ont aucune raison de passer dans un validator
    J'ai du mal à comprendre cette expression. Je n'ai mis aucun validator sur l'outputText. Le validator est uniquement sur un inputText, mais c'est les autres valeurs du formulaire qui ne sont pas bien réaffichés au moment de l'affichage de l'erreur sur l'inputText. (je ne sais pas si j'explique correctement...)

    J'ai aussi compris que le validator ne récupère pas les valeurs. Mais c'est qui que réaffiche les valeurs quand la page est rechargée après l'erreur du validator?

    Pourquoi certaines valeurs "restent" correctement et d'autres ne sont pas retenues?

    Un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <h:outputText value="OS Version" 
    	rendered="#{terminalForm.osVersionRendered}" />
    <h:inputText
    	value="#{tForm.ingFields['OS_VERSION']}"
    	readonly="true"
    	rendered="#{tForm.osVersionRendered}" />
    ceci est correctement affiché au premier chargement de la page, quand je clique sur mon bouton save et que le validator donne une erreur, la page est rechargée mais ces 2 champs ne sont plus réaffichés!

    Voici les beans:
    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
     
    private boolean OsVersionRendered;
    public boolean getOsVersionRendered() {
    	if (ingFields != null)
    		OsVersionRendered = (ingFields.get("OS_VERSION") == null ? false : true);
    	return OsVersionRendered;
    }
    public void setOsVersionRendered(boolean osVersionRendered) {
    	OsVersionRendered = osVersionRendered;
    }
     
    private HashMap<String, String> ingFields;
    public HashMap<String, String> getIngFields() {
    	return ingFields;
    }
    elle est où l'erreur??

  5. #5
    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
    Par défaut
    Citation Envoyé par Bobble Voir le message

    J'ai aussi compris que le validator ne récupère pas les valeurs. Mais c'est qui que réaffiche les valeurs quand la page est rechargée après l'erreur du validator?

    Pourquoi certaines valeurs "restent" correctement et d'autres ne sont pas retenues?

    Un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <h:outputText value="OS Version" 
    	rendered="#{terminalForm.osVersionRendered}" />
    <h:inputText
    	value="#{tForm.ingFields['OS_VERSION']}"
    	readonly="true"
    	rendered="#{tForm.osVersionRendered}" />
    Il n'y aucune validation pour ton composant input, ceci dit, si il y'a erreur de validation, la phase apply request value n'est pas executée, comme l'a mentionné tchize_, donc, la valeur saisie est automatiquement perdue.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    Il n'y aucune validation pour ton composant input, ceci dit, si il y'a erreur de validation, la phase apply request value n'est pas executée, comme l'a mentionné tchize_, donc, la valeur saisie est automatiquement perdue.
    pas tout a fait, elle n'est pas transmise dans le bean. Cependant, elle n'est pas perdue, la valeur soumise étant conservée via le submittedData dans le composant et réaffichée. Cependant.

    Pour l'output et le champs en elcture seule, ce mécanisme n'existe pas, puisque les valeur soumises sont par définition ignorées. Donc, dans ce cas là, le composant va bien relire dans le bean (alors que tous les autres composants sont réaffichés depuis les valeurs interne du composant). Conclusion qui me sembele évidente: si ton output ne s'affiche plus après erreur de validation, c'est que le bean sur lequel tu va chercher l'info ne l'a plus. Probablement parce qu'il a été réinitialisé entre les deux requêtes (bean request scope?).

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Par défaut
    Edit: je viens de voir la réponse de tchize_ , qui répond à ma question. je vérifie déjà ça.


    ok, merci pour la réponse.
    Mais alors est-ce qu'il y a une autre solution pour garder les valeurs? Car ces valeur la ce n'est pas l'utilisateur qui les saisis, mais ils sont données par mon programme java. (readonly)

    De plus je ne comprend toujours pas pourquoi alors certains valeurs sont gardés. Exemple:

    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
     
    <h:outputLabel
    	for="code"
    	value="Code" />
    <h:panelGroup>
    	<h:inputText
    		id="code"
    		value="#{tForm.code}"
    		maxlength="8"
    		readonly="true"
    		style="background-color:#ECECEC" />
    	<x:message
    		for="code"
    		styleClass="error"
    		showDetail="true"
    		showSummary="false" />
    </h:panelGroup>
    avec le bean:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private String Code;
    public String getCode()
    {
    	return Code;
    }
    public void setCode(String code)
    {
    	Code = code;
    }

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    faut regarder les détail dans tes beans, en général, ce qui disparait entre les deux requetes, c'est ce qui est en request scope

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

Discussions similaires

  1. [JSF] Validator - Comparaison
    Par gufra dans le forum JSF
    Réponses: 12
    Dernier message: 22/12/2010, 17h17
  2. JSF validator, null problem
    Par Bobble dans le forum JSF
    Réponses: 7
    Dernier message: 15/07/2010, 11h36
  3. JSF managed property probleme
    Par Loizo dans le forum JSF
    Réponses: 9
    Dernier message: 06/03/2009, 10h22
  4. [XP Pro] Licence valide pour un second PC ?
    Par loveflower dans le forum Windows XP
    Réponses: 2
    Dernier message: 29/03/2007, 12h47
  5. [validation HTML probleme avec li
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 18/02/2006, 13h27

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