EL boş operatörü JSF'de nasıl çalışır?


88

JSF'de bir bileşen, EL boş operatörü kullanılarak oluşturulabilir veya kullanılmayabilir

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

Anladığım kadarıyla operatör hem null-check olarak çalışıyor, hem de listenin boş olup olmadığını kontrol ediyor.

Kendi özel sınıfımın bazı nesneleri üzerinde boş kontroller yapmak istiyorum, hangi arayüzleri veya arayüz parçalarını uygulamam gerekiyor? Boş operatör hangi arayüzle uyumludur?

Yanıtlar:


151

Gönderen EL 2.2 spesifikasyonu ( "değerlendirme için spec indirmek için tıklayınız" altında bir tane):

1.10 Boş Operatör - empty A

emptyOperatör bir değer boş olup olmadığını belirlemek için kullanılabilecek bir önek operatördür.

Değerlendirmek empty A

  • Eğer ADİR null, dönüştrue
  • Aksi takdirde, Aboş dizge ise geri dönüntrue
  • Aksi takdirde, Aboş bir diziyse, geri dönüntrue
  • Aksi takdirde Aboş Mapise dönüştrue
  • Aksi takdirde Aboş Collectionise dönüştrue
  • Aksi takdirde iade false

Yani, arayüzleri göz önüne alındığında, üzerinde çalışır Collectionve Mapsadece. Senin durumunda, Collectionen iyi seçenek olduğunu düşünüyorum . Ya da Javabean benzeri bir nesneyse, o zaman Map. Her iki durumda da, kapakların altında, isEmpty()yöntem gerçek kontrol için kullanılır. Uygulayamayacağınız veya uygulamak istemediğiniz arayüz yöntemlerinde, atabilirsiniz UnsupportedOperationException.


Garip, bunu Uzun ve tutulma (4.4.0) ipuçlarında kullanmaya çalışıyorum "Bu boş ifade her zaman yanlış olarak değerlendirilir. Yalnızca dizeler, haritalar, diziler ve koleksiyon boş işleç için anlamlı değerlere sahiptir"
Pieter De Bie

Daha da tuhafı, benim durumumda her zaman doğru olarak değerlendiriliyor.
Pieter De Bie

Ne olursa yaklaşık myBeanolduğunu null? Will true/ falsehala iade edilmesi ya da bir istisna atabilen?
theyuv

9

Şimdi benim primefaces gizleyebilirsiniz Collection uygulanması BalusC önerisini kullanma p:dataTablebenim değil boş operatörü kullanarak dataModeluzananjavax.faces.model.ListDataModel

Kod örneği:

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...
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.