Comment fonctionne EL empty operator dans JSF?

dans JSF un composant peut être rendu ou non en utilisant L'opérateur el vide

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

comme je l'ai compris l'opérateur travaille à la fois comme null-check, mais vérifie aussi si la liste est vide.

je veux faire des contrôles vides sur certains objets de ma propre classe personnalisée, quelle(S) interface (s) ou partie d'interface dois-je implémenter? Avec quelle interface l'opérateur vide est-il compatible?

78
demandé sur BalusC 2013-01-06 22:00:39

2 réponses

à Partir de EL 2.2 spécification (voir ci-dessous on "Cliquez ici pour télécharger les spécifications 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 null ou vide.

pour évaluer empty A

  • si A est null , retour true
  • Sinon, si A est la chaîne vide, alors retourner true
  • Sinon, si A est un tableau vide, alors retourner true
  • Sinon, si A est vide Map , retourner true
  • Sinon, si A est vide Collection , retourner true
  • sinon retour false

donc, compte tenu des interfaces, il fonctionne sur Collection et Map seulement. Dans votre cas, je pense que Collection est la meilleure option. Ou, si c'est un objet Javabean-like, puis Map . Dans tous les cas, sous les couvercles, la méthode isEmpty() est utilisée pour le contrôle proprement dit. Sur les méthodes d'interface que vous ne pouvez pas ou ne pouvez pas si vous voulez mettre en œuvre, vous pouvez lancer UnsupportedOperationException .

130
répondu BalusC 2013-01-06 18:17:08

en utilisant la suggestion de BalusC de mettre en œuvre 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...
}
10
répondu Aksel Willgert 2015-01-20 09:36:04