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

88

Dans JSF un composant peut être rendu ou non en utilisant l'opérateur vide EL

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

Comme je l'ai compris, l'opérateur fonctionne à la fois comme un contrôle nul, mais également pour vérifier si la liste est vide.

Je veux faire des vérifications 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?

Aksel Willgert
la source

Réponses:

151

À partir de la spécification EL 2.2 (obtenez celle ci-dessous "Cliquez ici pour télécharger la spécification pour évaluation"):

1.10 Opérateur vide - empty A

L' emptyopérateur est un opérateur de préfixe qui peut être utilisé pour déterminer si une valeur est nulle ou vide.

Évaluer empty A

  • Si Ac'est le cas null, retourneztrue
  • Sinon, si Aest la chaîne vide, alors retournetrue
  • Sinon, si Aest un tableau vide, alors retournetrue
  • Sinon, si Aest vide Map, retournetrue
  • Sinon, si Aest vide Collection, retournetrue
  • Sinon retour false

Donc, compte tenu des interfaces, cela fonctionne sur Collectionet Mapuniquement. Dans votre cas, je pense que Collectionc'est la meilleure option. Ou, si c'est un objet de type javanais, alors Map. Dans tous les cas, sous les couvertures, la isEmpty()méthode est utilisée pour le contrôle proprement dit. Sur les méthodes d'interface que vous ne pouvez pas ou ne voulez pas implémenter, vous pouvez lancer UnsupportedOperationException.

BalusC
la source
Bizarre, j'essaie de l'utiliser sur un Long et eclipse (4.4.0) laisse entendre que "Cette expression vide est toujours évaluée à false. Seules les chaînes, les cartes, les tableaux et la collection ont des valeurs significatives pour l'opérateur vide"
Pieter De Bie
Encore plus étrange, cela se vérifie toujours comme vrai dans mon cas.
Pieter De Bie
Et si myBeanoui null? Sera true/ falsesera toujours retourné ou peut-il lever une exception?
theyuv
9

En utilisant la suggestion de BalusC d'implémenter Collection, je peux maintenant masquer mes primefaces en p:dataTableutilisant l'opérateur not empty sur my dataModelqui s'étendjavax.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...
}
Aksel Willgert
la source