Wie funktioniert der leere EL-Operator in JSF?

86

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

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

Wie ich verstanden habe, funktioniert der Operator sowohl als Nullprüfung als auch als Prüfung, ob die Liste leer ist.

Ich möchte einige Objekte meiner eigenen benutzerdefinierten Klasse leer prüfen. Welche Schnittstelle (n) oder Teile von Schnittstellen muss ich implementieren? Mit welcher Schnittstelle ist der leere Operator kompatibel?

Aksel Willgert
quelle

Antworten:

147

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

1.10 Leerer Operator - empty A

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

Zu bewerten empty A

  • Wenn Aja null, kehren Sie zurücktrue
  • Wenn andernfalls Adie leere Zeichenfolge ist, kehren Sie zurücktrue
  • Andernfalls, wenn Aes sich um ein leeres Array handelt, kehren Sie zurücktrue
  • Andernfalls, wenn Aes leer ist Map, kehren Sie zurücktrue
  • Andernfalls, wenn Aes leer ist Collection, kehren Sie zurücktrue
  • Ansonsten kehre zurück false

Also, die Schnittstellen unter Berücksichtigung, funktioniert es auf Collectionund Mapnur. In Ihrem Fall denke ich, Collectionist die beste Option. Oder wenn es sich um ein javabäisches Objekt handelt, dann Map. In beiden Fällen wird die isEmpty()Methode unter der Decke für die eigentliche Prüfung verwendet. Auf Schnittstellenmethoden, die Sie nicht implementieren können oder wollen, können Sie werfen UnsupportedOperationException.

BalusC
quelle
Seltsam, ich versuche dies auf einem Long zu verwenden und Eclipse (4.4.0) weist darauf hin, dass "dieser leere Ausdruck immer als falsch ausgewertet wird. Nur Zeichenfolgen, Maps, Arrays und Sammlungen haben aussagekräftige Werte für den leeren Operator"
Pieter De Bie
Noch seltsamer ist, dass es in meinem Fall immer als wahr bewertet wird.
Pieter De Bie
Was ist, wenn myBeanist null? Wird true/ wird falsenoch zurückgegeben oder kann es eine Ausnahme auslösen?
Theyuv
9

Mit dem Vorschlag von BalusC, Collection zu implementieren, kann ich jetzt meine Primefaces p:dataTablemit dem nicht leeren Operator auf meinem dataModel, der erweitert wird, ausblendenjavax.faces.model.ListDataModel

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...
}
Aksel Willgert
quelle