¿Cómo funciona el operador vacío EL en JSF?


88

En JSF, un componente se puede representar o no utilizando el operador vacío EL

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

Según tengo entendido, el operador funciona como verificación nula, pero también verifica 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?

Respuestas:


151

De la especificación EL 2.2 (obtenga la siguiente "Haga clic aquí para descargar la especificación para la evaluación"):

1.10 Operador vacío - empty A

El emptyoperador es un operador de prefijo que se puede utilizar para determinar si un valor es nulo o está vacío.

Para evaluar empty A

  • Si Aes null, regresatrue
  • De lo contrario, si Aes la cadena vacía, regresatrue
  • De lo contrario, si Aes una matriz vacía, regresatrue
  • De lo contrario, si Aestá vacío Map, regresetrue
  • De lo contrario, si Aestá vacío Collection, regresetrue
  • De lo contrario regresa false

Por lo tanto, teniendo en cuenta las interfaces, que funciona en Collectiony Mapsolamente. En tu caso, creo que Collectiones la mejor opción. O, si es un objeto similar a Javabean, entonces Map. De cualquier manera, bajo las sábanas, el isEmpty()método se utiliza para la verificación real. En los métodos de interfaz que no puede o no desea implementar, puede lanzar UnsupportedOperationException.


Extraño, trato de usar esto en un Long y eclipse (4.4.0) insinúa que "Esta expresión vacía siempre se evalúa como falsa. Solo la cadena, los mapas, las matrices y la colección tienen valores significativos para el operador vacío"
Pieter De Bie

Aún más extraño, siempre se evalúa como verdadero en mi caso.
Pieter De Bie

¿Y si myBeanes null? ¿ Se devolverá true/ falsetodavía o puede lanzar una excepción?
theyuv

9

Usando la sugerencia de BalusC de implementar Collection, ahora puedo ocultar mis primefaces p:dataTableusando un operador no vacío en mi dataModelque se extiendejavax.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...
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.