3 votes

La meilleure approche pour la validation des formulaires jsf

Si j'ai plusieurs contrôles de saisie dans un formulaire (il y a des validateurs séparés pour chacun de ces contrôles de saisie - comme requis, longueur et ainsi de suite), il y a un bouton de commande qui soumet le formulaire et appelle une méthode d'action. Le besoin est le suivant : bien que les valeurs des contrôles de saisie soient, disons, correctes individuellement, la combinaison de ces valeurs doit être correcte pour les traiter ensemble après la soumission du formulaire.

1) Puis-je ajouter un validateur personnalisé pour le bouton de commande et valider la combinaison ensemble ? comme validate(FacesContext arg0, UIComponent arg1, Object value) Mais même dans ce cas, je n'aurai pas les valeurs des autres contrôles d'entrée à l'exception de la valeur du bouton de commande/composant, n'est-ce pas ?

2) Puis-je effectuer la validation de la combinaison dans la méthode d'action et ajouter des messages de validation à l'aide de FacesMessage ?

ou suggérez-vous une autre approche ?

Merci pour votre temps.

5voto

BalusC Points 498232

Le point 2 a déjà reçu une réponse de Bozho. Il suffit d'utiliser FacesContext#addMessage() . A null l'identifiant du client lui permettra d'atterrir dans <h:messages globalOnly="true"> . Un identifiant de client fixe comme formId:inputId le laissera atterrir dans <h:message for="inputId"> .

Le point 1 est faisable, vous pouvez saisir les autres composants à l'intérieur de la méthode du validateur en utilisant UIViewRoot#findComponent() :

UIInput otherInput = (UIInput) context.getViewRoot().findComponent("formId:otherInputId");
String value = (String) otherInput.getValue();

Vous devez cependant placer f:validator dans le dernier UIInput de la composante. En le plaçant dans un UICommand (comme le bouton) ne fonctionnera pas.

Il est vrai que coder en dur les identifiants des clients est désagréable, mais c'est le résultat d'un mécanisme de validation peu flexible dans JSF.

5voto

7SpecialGems Points 1950

Je viens de tomber sur votre post après m'être posé la même question.

Les articles que j'ai lus jusqu'à présent indiquent qu'il existe quatre types de validation pour les objectifs suivants :

  1. Intégré dans les composants (abonnement à des champs individuels ; required=true, LengthValidator, etc)
  2. Validation de l'application" ajoutée à l'action dans le Backing Bean (logique d'entreprise)
  3. Validateurs personnalisés (s'abonner à des champs individuels)
  4. Méthode dans le Backing Bean utilisée comme validateur personnalisé (s'abonner à des champs individuels).

En ce qui concerne les validateurs : Le mécanisme de validation de JSF a été conçu pour valider un seul composant. (Voir la question S/O ici)

Dans le cas où vous souhaitez valider un forme complète en tant que regroupement logique de champs, il semble qu'avec JSF/Apache MyFaces standard, il soit plus approprié de le faire en tant que validation d'application, étant donné que l'ensemble des champs individuels prend une signification commerciale collective à ce stade.

BalusC a trouvé un moyen d'intégrer la validation des formulaires dans un validateur unique attaché au dernier élément du formulaire (voir également la question S/O). aquí et un autre exemple de travail sur son site web aquí ), mais elle n'est pas nécessairement extensible/réutilisable, car les références aux ID du formulaire doivent être codées en dur, car il est impossible d'ajouter un appendice à la signature de la méthode validate(). Vous vous en tirerez si vous n'utilisez le formulaire qu'une seule fois, mais s'il apparaît plusieurs fois ou si vous générez vos identifiants par programme, vous êtes coincé.

La partie de Seam consacrée à la mise en œuvre de JSF dispose d'une fonction <s:validateForm /> qui peut prendre en paramètre les identifiants des champs situés ailleurs dans le formulaire. Malheureusement, il ne semble pas que les implémentations JSF MyFaces/Mojara/Sun aient un équivalent, car cela ne fait pas partie de la norme.

3voto

Bozho Points 273663

J'ai utilisé avec succès la deuxième approche :

FacesMessage facesMessage = 
      new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
FacesContext.getCurrentInstance().addMessage(null, facesMessage);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X