2009-07-19 17 views
4

Ich arbeite an einer Anforderung, Felder hervorzuheben, die nach JSF-serverseitigen Validierung in rot fehlgeschlagen sind. Zur Validierung kann kein Javascript verwendet werden. Gibt es eine Methode, um serverseitige Validierung mit CSS-Stiländerungen zu verknüpfen?Css-Stil mit JSF-Validierung ändern

Antwort

6

Sie können dies tun, mit einem verwalteten Bohne:

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; 
    } 
} 

Anfrage Umfang variabel:

<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> 

Beispielansicht:

<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> 

Die Komponente an die Backing Bean gebunden ist. Wenn Fehlermeldungen für die Komponente in die Warteschlange gestellt wurden, überschreibt sie ihre CSS-Klasseneinstellungen mit ihrem style-Attribut.

+0

Hi diese Methode sieht gut aus und funktioniert auch, aber css Stile aus Bohnen in jsp injiziert eine Standard-Praxis ist JSF. Ich meine aus Wartungsperspektive wird es ganz offensichtlich, dass die Änderung in Java-Klassen vorgenommen werden muss. Und wenn ich ein anderes Stilelement hinzufügen möchte, wird es nicht möglich sein. Es ist im Moment kein Faktor für mich, aber ich war nur besorgt über zukünftige Probleme. – Barun

+0

Eine etwas bessere Alternative wäre wahrscheinlich, das styleClass-Attribut dynamisch zu bestimmen. Auf diese Weise müssten Sie nur die CSS-Datei anstelle der Java-Klasse ändern. – Drew

+0

@Barun - Sie sind richtig; Es ist keine ideale Lösung. Die Kernkomponenten sind in der Regel ein wenig grundlegend. Folk schaut in die Kontrollbibliotheken für eine reichere Erfahrung. Eine Alternative wäre, errorStyle zu einem booleschen Wert zu machen und den Stilwert über eine Funktion aufzulösen: # {myfn: resolve (validBean.errorStyle, 'szErrStyle', 'szOkStyle')}. Auf diese Weise erhalten Sie weniger Details der Präsentationsschicht, die in das Backend gelangen. – McDowell

1
+0

Hallo, diese Methode sieht gut aus, aber wir verwenden keine Naht im aktuellen Projekt ... eine Schande, denn wie Seam Konstrukte wirklich in vielen Fällen helfen .. – Barun

+0

Tut mir leid, das zu hören. Seam ist wirklich eine Killer-App für JSF. Ich kann jedoch mitfühlen, da ich gerade an einer JSF-App arbeite, die Seam nicht verwendet und ich finde, dass das Aufrechterhalten des Status durch Seitenflüsse ärgerlich ist. – Drew

+0

Gleicher Zustand hier ... Probleme mit der Aufrechterhaltung des Zustands ... Wir gehen mit Spring Webflow ... aber das ist für ein anderes Thema .. – Barun