2009-07-19 13 views
4

Je travaille sur une exigence pour mettre en évidence les champs qui ont échoué en rouge après la validation côté serveur JSF. Aucun javascript ne peut être utilisé pour la validation. Existe-t-il une méthode pour lier la validation côté serveur avec les modifications de style css?Css Changement de style avec validation JSF

Répondre

6

Vous pouvez le faire avec un bean géré:

public class ValidBean { 

    private UIComponent myComponent; 

    public UIComponent getMyComponent() { 
    return myComponent; 
    } 

    public void setMyComponent(UIComponent myComponent) { 
    this.myComponent = myComponent; 
    } 

    public String getErrorStyle() { 
    FacesContext context = FacesContext 
     .getCurrentInstance(); 
    String clientId = myComponent.getClientId(context); 
    Iterator<FacesMessage> messages = context 
     .getMessages(clientId); 
    while (messages.hasNext()) { 
     if (messages.next().getSeverity().compareTo(
      FacesMessage.SEVERITY_ERROR) >= 0) { 
     return "background-color: red"; 
     } 
    } 
    return null; 
    } 
} 

Demande variable portée:

<managed-bean> 
    <managed-bean-name>validBean</managed-bean-name> 
    <managed-bean-class>stylevalid.ValidBean</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
    </managed-bean> 

vue de l'échantillon:

<f:view> 
    <h:form> 
     <h:inputText binding="#{validBean.myComponent}" styleClass="foo" 
     style="#{validBean.errorStyle}"> 
     <f:validateLength minimum="6" /> 
     </h:inputText> 
     <h:commandButton /> 
     <h:messages /> 
    </h:form> 
    </f:view> 

Le composant est lié à la fève de support. Si des messages d'erreur ont été mis en file d'attente pour le composant, ils remplacent ses paramètres de classe CSS par son attribut de style.

+0

Salut cette méthode semble bonne et fonctionne aussi, mais est l'injection de styles CSS de haricots dans JSP une pratique standard est JSF. Je veux dire du point de vue de la maintenance, il sera tout à fait évident que le changement doit être fait dans les classes Java. Et si je veux ajouter un autre élément de style, ce ne sera pas possible. Ce n'est pas un facteur pour moi en ce moment mais j'étais juste inquiet de tous les problèmes futurs. – Barun

+0

Probablement une alternative légèrement meilleure serait de déterminer dynamiquement l'attribut styleClass. De cette façon, vous aurez seulement besoin de changer le fichier CSS plutôt que la classe Java. – Drew

+0

@Barun - vous avez raison; Ce n'est pas une solution idéale. Les composants de base ont tendance à être un peu basique. Les gens regardent les bibliothèques de contrôle pour une expérience plus riche. Une alternative serait de faire de errorStyle un booléen et de résoudre la valeur du style via une fonction: # {myfn: resolve (validBean.errorStyle, 'szErrStyle', 'szOkStyle')}. De cette façon, vous obtenez moins de détails de couche de présentation qui fuient vers l'arrière. – McDowell

1
+0

Salut, cette méthode a l'air bien, mais nous n'utilisons pas de couture dans le projet en cours ... dommage, car en tant que constructions Seam vraiment aider dans de nombreux cas .. – Barun

+0

Désolé de l'entendre. Seam est vraiment une application de tueur pour JSF. Je peux sympathiser, cependant, car je travaille maintenant sur une application JSF qui n'utilise pas Seam et je trouve ennuyeux de maintenir l'état à travers les flux de pages. – Drew

+0

Même état ici ... problèmes liés au maintien de l'état ... nous allons avec Spring Webflow ... mais c'est pour un autre sujet .. – Barun