Come funziona l’operatore EL vuoto in JSF?

In JSF un componente può essere reso o non usando l’operatore vuoto EL

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

Come ho capito l’operatore lavora sia come controllo nullo, ma controlla anche se l’elenco è vuoto.

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

Dalla specifica EL 2.2 (ottenere quella di seguito “Fare clic qui per scaricare le specifiche per la valutazione”):

1.10 Operatore empty Aempty A

L’operatore empty è un operatore di prefisso che può essere utilizzato per determinare se un valore è nullo o vuoto.

Per valutare empty A

  • Se A è null , restituisce true
  • Altrimenti, se A è la stringa vuota, restituisce true
  • Altrimenti, se A è un array vuoto, restituisce true
  • Altrimenti, se A è una Map vuota, restituisce true
  • Altrimenti, se A è una Collection vuota, restituisce true
  • Altrimenti restituisci false

Quindi, considerando le interfacce, funziona solo su Collection e Map . Nel tuo caso, penso che la Collection sia l’opzione migliore. Oppure, se si tratta di un object simile a Javabean, quindi Map . In entrambi i casi, sotto le copertine, viene utilizzato il metodo isEmpty() per il controllo effettivo. Sui metodi di interfaccia che non puoi o non vuoi implementare, puoi lanciare UnsupportedOperationException .

Utilizzando il suggerimento di BalusC di implementare Collection, ora posso hide le mie primefaces p:dataTable usando l’operatore non vuoto sul mio dataModel che estende javax.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 implements Collection, SelectableDataModel, Serializable { public EntityDataModel(List 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 entitys = (List) 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 = (List) getWrappedData(); return (entity == null) || entity.isEmpty(); } // ... other not implemented methods of Collection... }