web-dev-qa-db-fra.com

Comment fonctionne l'opérateur vide EL dans JSF?

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?

80
Aksel Willgert

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 est null, retournez true
  • Sinon, si A est la chaîne vide, alors retournez true
  • Sinon, si A est un tableau vide, alors retournez true
  • Sinon, si A est un Map vide, retourne true
  • Sinon, si A est un Collection vide, retourne true
  • 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.

140
BalusC

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