Come funziona l'operatore vuoto EL in JSF?


88

In JSF un componente può essere reso o meno utilizzando l'operatore vuoto EL

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

Come ho capito, l'operatore funziona sia come null-check, ma controlla anche se l'elenco è vuoto.

Voglio fare controlli vuoti su alcuni oggetti della mia classe personalizzata, quali interfacce o parti di interfacce devo implementare? Con quale interfaccia è compatibile l'operatore vuoto?

Risposte:


151

Dalla specifica EL 2.2 (scarica quella sotto "Fai clic qui per scaricare la specifica per la valutazione"):

1.10 Operatore vuoto - empty A

L' emptyoperatore è un operatore prefisso che può essere utilizzato per determinare se un valore è nullo o vuoto.

Valutare empty A

  • Se lo Aè null, tornatrue
  • Altrimenti, se Aè la stringa vuota, restituiscitrue
  • Altrimenti, se Aè un array vuoto, ritornatrue
  • Altrimenti, se Aè vuoto Map, ritornatrue
  • Altrimenti, se Aè vuoto Collection, ritornatrue
  • Altrimenti torna false

Quindi, considerando le interfacce, funziona su Collectione Mapsolo. Nel tuo caso, penso che Collectionsia l'opzione migliore. Oppure, se è un oggetto simile a Giava, allora Map. In ogni caso, sotto le coperte, il isEmpty()metodo viene utilizzato per il controllo effettivo. Sui metodi di interfaccia che non puoi o non vuoi implementare, puoi lanciare UnsupportedOperationException.


Strano, provo a usarlo su un Long e eclipse (4.4.0) suggerisce che "Questa espressione vuota restituisce sempre false. Solo stringa, mappe, array e raccolta hanno valori significativi per l'operatore vuoto"
Pieter De Bie

Ancora più strano, nel mio caso risulta sempre vero.
Pieter De Bie

E se lo myBeanè null? Verrà restituito true/ verrà falsecomunque restituito o può generare un'eccezione?
theyuv

9

Utilizzando il suggerimento di BalusC di implementare Collection, ora posso nascondere le mie prime facce p:dataTableusando l'operatore non vuoto sul mio dataModelche si estendejavax.faces.model.ListDataModel

Esempio di codice:

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...
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.