2010-11-16 6 views
2

Je suis actuellement en train d'apprendre à propos de jsf 2.0 de core jsf 2.0 book + glassfish + cdi.Validation dynamique requise pour différents boutons?

J'ai une question sur la fonctionnalité de validation de JSF.

Disons que j'ai une application de connexion très simple, qui a une disposition très simple comme:

userid: (champ de saisie pour userid - en utilisant required = "true")
mot de passe: (entrée secrète pour le mot de passe - à l'aide nécessaire = "true")
loginButton + registerButton (en utilisant immédiate = "true") + checkUserIdAvailabilityButton

maintenant, disons que le loginButton est pressé, et l'ID utilisateur et mot de passe sont laissés vides, erreur de validation se produirait sur les deux champs, et cela fonctionne comme prévu. Lorsque le bouton registerButton est pressé, il ne se soucie pas de savoir si l'ID utilisateur ou le mot de passe est renseigné par l'utilisateur, car il utilise immediate = "true", contournant ainsi la validation et la commande est exécutée à la phase de demande de valeur. ça fonctionne toujours comme je l'avais prévu. Et voici mon problème .. Lorsque le bouton checkUserIdAvailabilityButton est pressé, je m'attends seulement à ce que l'ID utilisateur soit rempli, et je n'ai pas besoin de me soucier de savoir si le champ de mot de passe est rempli ou non, que c'est un champ obligatoire.

Y a-t-il un moyen de résoudre ce genre de problème? Je sais que cela pourrait être une application très simple, mais dans mon lieu de travail, je pense qu'ils conçoivent beaucoup d'écrans comme celui-ci, comme le bouton de sauvegarde et le bouton d'actualisation avec différents champs obligatoires mais les boutons sont dans la même page.

Merci!

Répondre

4

définir à la fois sur le bouton de la disponibilité et le champ Nom d'utilisateur avec immediate="true"et mettre le bouton dans un registre séparé <h:form>.

E.g.

<h:form> 
    <h:inputText value="#{bean.username}" required="true" immediate="true" /> 
    <h:inputSecret value="#{bean.password}" required="true" /> 
    <h:commandButton value="Login" action="#{bean.login}" /> 
    <h:commandButton value="Check name availability" action="#{bean.checkNameAvailability}" immediate="true" /> 
</h:form> 
<h:form> 
    <h:commandButton value="Register" action="#{bean.register}" /> 
</h:form> 

Une alternative consiste à déterminer dans l'attribut obligatoire qui touche est pressée été (il est alors présent sous forme de paramètre de demande).

<h:form id="form"> 
    <h:inputText value="#{bean.username}" required="#{not empty param['form:login'] or not empty param['form:check']}" /> 
    <h:inputSecret value="#{bean.password}" required="#{not empty param['form:login']}" /> 
    <h:commandButton id="login" value="Login" action="#{bean.login}" /> 
    <h:commandButton id="check" value="Check name availability" action="#{bean.checkNameAvailability}" /> 
    <h:commandButton value="Register" action="#{bean.register}" /> 
</h:form> 
+0

Bonjour, merci pour la réponse. Je comprends la deuxième solution. Mais pourriez-vous expliquer la première solution? à propos de l'immédiat = "vrai" sur le champ bean.username, car je ne comprends que l'effet de immediate = "true" sur les boutons de commande, qui est de contourner la validation et la commande est exécutée à la phase de demande de la demande – bertie

+1

Un soumettre par un bouton avec 'immediate =" true "' ne traitera que les champs qui ont aussi 'immediate =" true "'. L'attribut 'immediate' est expliqué plus en détail par des exemples pratiques dans [cet article] (http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html). Note: le code de l'article est ciblé sur JSF 1.2, mais fonctionnera également sur 2.0 et la théorie s'applique aussi bien sur JSF 2.0. – BalusC

+0

Niceee .. merci! – bertie

Questions connexes