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?
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
estnull
, retourtrue
- Sinon, si
A
est la chaîne vide, alors retournertrue
- Sinon, si
A
est un tableau vide, alors retournertrue
- Sinon, si
A
est videMap
, retournertrue
- Sinon, si
A
est videCollection
, retournertrue
- 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
.
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...
}