93 votes

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

En JSF, un composant peut être rendu ou non à l'aide de l'opérateur EL empty.

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

D'après ce que j'ai compris, l'opérateur fonctionne à la fois comme un contrôle de nullité, mais aussi comme un contrôle pour vérifier si la liste est vide.

Je veux effectuer des vérifications vides sur certains objets de ma propre classe personnalisée. Quelle(s) interface(s) ou partie(s) d'interfaces dois-je implémenter ? Avec quelle interface l'opérateur empty est-il compatible ?

161voto

BalusC Points 498232

En Spécification EL 2.2 (obtenez celui qui se trouve en dessous de "Cliquez ici pour télécharger la spécification pour évaluation") :

1.10 Opérateur vide - empty A

En empty 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 A es null , retour true
  • Sinon, si A est la chaîne vide, alors le retour true
  • Sinon, si A est un tableau vide, alors on retourne true
  • Sinon, si A est un vide Map , retour true
  • Sinon, si A est un vide Collection , retour true
  • Sinon, retournez false

Donc, compte tenu des interfaces, il fonctionne sur Collection y Map seulement. Dans votre cas, je pense Collection est la meilleure option. Ou, s'il s'agit d'un objet de type Javabean, alors Map . Quoi qu'il en soit, sous les couvertures, le isEmpty() est utilisée pour la vérification proprement dite. Pour les méthodes d'interface que vous ne pouvez pas ou ne voulez pas implémenter, vous pouvez lancer la commande UnsupportedOperationException .

9voto

Aksel Willgert Points 3791

En utilisant la suggestion de BalusC d'implémenter Collection, je peux maintenant cacher mes primefaces. p:dataTable en utilisant l'opérateur non vide sur mon dataModel qui s'é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...
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X