solo - ¿Cómo funciona EL operador vacío en JSF?
validar formulario primefaces (2)
De la especificación EL 2.2 (obtenga la siguiente "Haga clic aquí para descargar las especificaciones para la evaluación"):
1.10 Operador
empty A
-empty A
El operador
empty
es un operador de prefijo que se puede usar para determinar si un valor es nulo o está vacío.Para evaluar el
empty A
- Si
A
esnull
, devuelvetrue
- De lo contrario, si
A
es la cadena vacía, devuelvetrue
- De lo contrario, si
A
es una matriz vacía, entonces devuelvetrue
- De lo contrario, si
A
es unMap
vacío, devuelvetrue
- De lo contrario, si
A
es unaCollection
vacía, devuelvetrue
- De lo contrario devuelve
false
Entonces, considerando las interfaces, solo funciona en Collection
y Map
. En tu caso, creo que Collection
es la mejor opción. O, si es un objeto similar a Javabean, entonces Map
. De cualquier manera, debajo de las cubiertas, se usa el método isEmpty()
para la verificación real. En los métodos de interfaz que no puede o no quiere implementar, puede lanzar UnsupportedOperationException
.
En JSF, se puede representar o no un componente utilizando el operador EL vacío
rendered="#{not empty myBean.myList}"
Como he entendido, el operador funciona tanto como null-check, pero también comprueba si la lista está vacía.
Quiero hacer comprobaciones vacías en algunos objetos de mi propia clase personalizada, ¿qué interfaz (s) o partes de interfaces necesito implementar? ¿Con qué interfaz es compatible el operador vacío?
Usando la sugerencia de BalusC de implementar Collection ahora puedo ocultar mis primefaces p:dataTable
usando el operador no vacío en mi dataModel
que extiende javax.faces.model.ListDataModel
Muestra de código:
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...
}