Dans JSF, un composant peut être rendu ou non à l'aide de l'opérateur vide EL
rendered="#{not empty myBean.myList}"
Si j'ai bien compris, l'opérateur fonctionne à la fois en tant que contrôle nul, mais vérifie également si la liste est vide.
Je souhaite effectuer des contrôles vides sur certains objets de ma propre classe personnalisée. Quelle (s) interface (s) ou parties d'interface dois-je implémenter? Avec quelle interface l'opérateur vide est-il compatible?
De spécification EL 2.2 (procurez-vous celui ci-dessous "Cliquez ici pour télécharger la spécification pour l'évaluation"):
1.10 Opérateur vide -
empty A
L'opérateur
empty
est un opérateur de préfixe qui peut être utilisé pour déterminer si une valeur est nulle ou vide.Pour évaluer
empty A
- Si
A
estnull
, retourneztrue
- Sinon, si
A
est la chaîne vide, alors retourneztrue
- Sinon, si
A
est un tableau vide, alors retourneztrue
- Sinon, si
A
est unMap
vide, retournetrue
- Sinon, si
A
est unCollection
vide, retournetrue
- Sinon, retourne
false
Donc, en considérant les interfaces, cela fonctionne sur Collection
et Map
seulement. Dans votre cas, je pense que Collection
est la meilleure option. Ou, s'il s'agit d'un objet de type Javabean, alors Map
. De toute façon, sous les couvertures, la méthode isEmpty()
est utilisée pour le contrôle réel. Sur les méthodes d'interface que vous ne pouvez ou ne voulez pas implémenter, vous pouvez lancer UnsupportedOperationException
.
En utilisant la suggestion de BalusC d'implémenter Collection, je peux maintenant cacher mes primefaces p:dataTable
en utilisant un opérateur non vide sur mon dataModel
qui étend javax.faces.model.ListDataModel
Exemple de code:
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...
}