webentwicklung-frage-antwort-db.com.de

Wie arbeitet der Operator EL empty in JSF?

In JSF kann eine Komponente mit dem Operator EL empty gerendert werden oder nicht

rendered="#{not empty myBean.myList}"

Wie ich verstanden habe, arbeitet der Operator sowohl als Null-Check, als auch als Check, um zu prüfen, ob die Liste leer ist.

Ich möchte leere Prüfungen für einige Objekte meiner eigenen benutzerdefinierten Klasse durchführen. Welche Schnittstelle (n) oder Teile von Schnittstellen muss ich implementieren? Mit welcher Schnittstelle ist der leere Operator kompatibel?

80
Aksel Willgert

Aus EL 2.2-Spezifikation (siehe unten "Klicken Sie hier, um die Spezifikation zur Bewertung herunterzuladen"):

1.10 Leerer Operator - empty A

Der Operator empty ist ein Präfixoperator, mit dem bestimmt werden kann, ob ein Wert null oder leer ist.

So bewerten Sie empty A

  • Wenn Anull ist, true zurückgeben
  • Wenn andernfalls A die leere Zeichenfolge ist, wird true zurückgegeben.
  • Wenn andernfalls A ein leeres Array ist, wird true zurückgegeben.
  • Wenn andernfalls A ein leerer Map ist, wird true zurückgegeben.
  • Wenn andernfalls A ein leerer Collection ist, wird true zurückgegeben.
  • Ansonsten gib false zurück

In Anbetracht der Schnittstellen funktioniert es also nur mit Collection und Map . In Ihrem Fall halte ich Collection für die beste Option. Oder, wenn es sich um ein Javabean-ähnliches Objekt handelt, dann Map. In beiden Fällen wird unter dem Deckmantel die Methode isEmpty() für die eigentliche Prüfung verwendet. Auf Interface-Methoden, die Sie nicht implementieren können oder wollen, könnten Sie UnsupportedOperationException werfen.

140
BalusC

Mit dem Vorschlag von BalusC, Collection zu implementieren, kann ich jetzt meine Primefaces p:dataTable Mit dem Operator not empty auf meinem dataModel verbergen, der javax.faces.model.ListDataModel Erweitert.

Codebeispiel:

import Java.io.Serializable;
import Java.util.Collection;
import Java.util.List;
import javax.faces.model.ListDataModel;
import org.primefaces.model.SelectableDataModel;

public class EntityDataModel extends ListDataModel<Entity> implements
        Collection<Entity>, SelectableDataModel<Entity>, Serializable {

    public EntityDataModel(List<Entity> data) { super(data); }

    @Override
    public Entity getRowData(String rowKey) {
        // In a real app, a more efficient way like a query by rowKey should be
        // implemented to deal with huge data
        List<Entity> entitys = (List<Entity>) getWrappedData();
        for (Entity entity : entitys) {
            if (Integer.toString(entity.getId()).equals(rowKey)) return entity;
        }
        return null;
    }

    @Override
    public Object getRowKey(Entity entity) {
        return entity.getId();
    }

    @Override
    public boolean isEmpty() {
        List<Entity> entity = (List<Entity>) getWrappedData();
        return (entity == null) || entity.isEmpty();
    }
    // ... other not implemented methods of Collection...
}
9
Aksel Willgert