2011-01-06 5 views
1

Ich verstehe, dass ich <c:choose> innerhalb einer Komponente in einer JSF-Seite nicht verwenden kann. Ich versuche zu sehen, ob es eine Alternative gibt. Ich schaute auf den Tomahawk und das ist nicht was ich wirklich brauche. Ich versuche negative und positive Zahlen in einer Spalte zu validieren. Ich möchte in der Lage sein, zwischen den 2 Validator-Tags zu wählen, die ich erstellt habe. Ich habe versucht, das gerenderte Attribut zu verwenden, aber es funktioniert immer noch nicht. Unten ist eine Art von was ich suche, aber es funktioniert nicht wie ich es will. Hat jemand irgendwelche Vorschläge ??Gibt es eine Alternative zu c: Wählen Sie in JSF bei Verwendung von f: Validator

Vielen Dank im Voraus.

<c:choose> 
     <c:when test="#{entry.dataEntry.posValue}"> 
      <f:validator validatorId="hits.positiveNumberValidator"/> 
     </c:when> 
     <c:otherwise test="#{entry.dataEntry.negValue}"> 
      <f:validator validatorId="hits.negativeNumberValidator"/> 
     </c:otherwise> 
    </c:choose> 

Antwort

1

In einen anderen Validator wickeln und als Attribute hinzufügen.

<f:validator validatorId="hits.numberValidator"/> 
<f:attribute name="posValue" value="#{entry.dataEntry.posValue}" /> 
<f:attribute name="negValue" value="#{entry.dataEntry.negValue}" /> 

Und dann in der NumberValidator:

Boolean negValue = component.getAttributes().get("negValue"); 

if (posValue != null && posValue) { 
    new PositiveNumberValidator().validate(context, component, value); 
} 

Boolean posValue = component.getAttributes().get("posValue"); 

if (negValue != null && negValue) { 
    new NegativeNumberValidator().validate(context, component, value); 
} 

Beachten Sie, dass dies nicht funktioniert, wenn #{entry} wie eigentlich ein iterierter Artikel ist wie in var Attribut h:dataTable oder ui:repeat erklärt, weil die f:attribute gebunden zu der JSF-Komponente, nicht zu seiner Ausgabe. Da der Variablenname #{entry} weniger oder mehr darauf hinweist, dass dies tatsächlich der Fall ist, hier ist, wie Sie es tun könnten.

Wickeln Sie die Sammlung in einem DataModel:

private DataModel entries; 

public Bean() { 
    entries = new ListDataModel(someDAO.list()); 
} 

// ... 

Verwenden Sie es in h:dataTable oder ui:repeat wie folgt:

<h:dataTable value="#{bean.entries}" var="entry"> 
    <h:column> 
     <h:inputText validator="#{bean.numberValidator}" /> 
    </h:column> 
</h:dataTable> 

Und den Validator in der Bean wie folgt implementieren:

public void numberValidator(FacesContext context, UIComponent component, Object value) throws ValidatorException) { 
    Entry entry = (Entry) entries.getRowData(); 

    if (entry.isPosValue()) { 
     new PositiveNumberValidator().validate(context, component, value); 
    } 

    if (entry.isNegValue()) { 
     new NegativeNumberValidator().validate(context, component, value); 
    } 
} 

(Vielleicht möchten Sie diese Validatoren stattdessen eine Instanzvariable der Bean machen (nur wenn sie threadsicher sind))

+0

danke BalusC !! Die erste Option hat funktioniert. – Perry

Verwandte Themen