Jak działa pusty operator EL w JSF?

88

W JSF komponent może być renderowany lub nie przy użyciu pustego operatora EL

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

Jak zrozumiałem, operator działa zarówno jako sprawdzanie zerowe, ale także sprawdza, czy lista jest pusta.

Chcę wykonać puste sprawdzenia niektórych obiektów mojej własnej klasy niestandardowej, które interfejsy lub części interfejsów muszę zaimplementować? Z którym interfejsem jest kompatybilny pusty operator?

Aksel Willgert
źródło

Odpowiedzi:

151

Ze specyfikacji EL 2.2 (pobierz poniższą „Kliknij tutaj, aby pobrać specyfikację do oceny”):

1.10 Pusty operator - empty A

emptyOperator operator przedrostek, które mogą być wykorzystane do określenia, czy wartość ta jest zerowa lub pusty.

Oceniać empty A

  • Jeśli Atak null, wróćtrue
  • W przeciwnym razie, jeśli Ajest pustym ciągiem, a następnie zwracatrue
  • W przeciwnym razie, jeśli Ajest pustą tablicą, a następnie zwracatrue
  • W przeciwnym razie, jeśli Ajest pusta Map, zwracatrue
  • W przeciwnym razie, jeśli Ajest pusta Collection, zwracatrue
  • W przeciwnym razie wróć false

Tak więc, biorąc pod uwagę interfejsy, działa tylko Collectioni Mapwyłącznie. W twoim przypadku myślę, że Collectionto najlepsza opcja. Lub, jeśli jest to obiekt podobny do języka Javabean, to Map. Tak czy inaczej, pod osłonami isEmpty()metoda jest używana do faktycznej kontroli. W przypadku metod interfejsu, których nie możesz lub nie chcesz zaimplementować, możesz rzucić UnsupportedOperationException.

BalusC
źródło
Dziwne, próbuję użyć tego na podpowiedziach Long and eclipse (4.4.0), że „To puste wyrażenie zawsze daje wartość false. Tylko łańcuch, mapy, tablice i kolekcja mają znaczące wartości dla pustego operatora”
Pieter De Bie
Co dziwniejsze, w moim przypadku zawsze ocenia się jako prawda.
Pieter De Bie
A jeśli tak myBeanjest null? Czy true/ falsenadal zostanie zwrócony, czy może zgłosić wyjątek?
oneuv
9

Korzystając z sugestii BalusC, aby zaimplementować Collection, mogę teraz ukryć moje primefaces p:dataTableza pomocą operatora niepustego na moim, dataModelktóry extendsjavax.faces.model.ListDataModel

Przykład kodu:

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
źródło