Bagaimana cara kerja operator kosong EL di JSF?

88

Dalam JSF sebuah komponen dapat dirender atau tidak menggunakan operator kosong EL

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

Seperti yang saya pahami, operator berfungsi baik sebagai null-check, tetapi juga memeriksa apakah daftar tersebut kosong.

Saya ingin melakukan pemeriksaan kosong pada beberapa objek kelas kustom saya sendiri, antarmuka atau bagian mana dari antarmuka yang perlu saya implementasikan? Antarmuka manakah yang kompatibel dengan operator kosong?

Aksel Willgert
sumber

Jawaban:

151

Dari spesifikasi EL 2.2 (dapatkan yang di bawah ini "Klik di sini untuk mengunduh spesifikasi untuk evaluasi"):

1.10 Operator Kosong - empty A

The emptyoperator adalah operator awalan yang dapat digunakan untuk menentukan apakah sebuah nilai adalah null atau kosong.

Untuk mengevaluasi empty A

  • Jika Ayaitu null, kembalitrue
  • Jika tidak, jika Astring kosong, maka kembalikantrue
  • Jika tidak, jika Aadalah larik kosong, maka kembalikantrue
  • Jika tidak, jika Akosong Map, kembalikantrue
  • Jika tidak, jika Akosong Collection, kembalikantrue
  • Jika tidak kembali false

Jadi, mengingat antarmukanya, ia bekerja CollectiondanMap hanya. Dalam kasus Anda, saya pikir Collectionadalah pilihan terbaik. Atau, jika itu adalah benda mirip Jawa, maka Map. Bagaimanapun, di bawah selimut, isEmpty()metode ini digunakan untuk pemeriksaan yang sebenarnya. Pada metode antarmuka yang tidak bisa atau tidak ingin Anda terapkan, Anda bisa melempar UnsupportedOperationException.

BalusC
sumber
Aneh, saya mencoba menggunakan ini pada Long and eclipse (4.4.0) mengisyaratkan bahwa "Ekspresi kosong ini selalu bernilai false. Hanya string, peta, array, dan koleksi yang memiliki nilai yang berarti untuk operator kosong"
Pieter De Bie
Yang lebih aneh, selalu bernilai true dalam kasus saya.
Pieter De Bie
Bagaimana jika myBeanyang null? Apakah true/ falsemasih akan dikembalikan atau dapatkah itu menimbulkan pengecualian?
mereka
9

Menggunakan saran BalusC ini menerapkan Koleksi saya sekarang bisa menyembunyikan primefaces saya p:dataTablemenggunakan operator yang tidak kosong pada saya dataModelyang memanjangjavax.faces.model.ListDataModel

Contoh kode:

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...
}
Aksel Willgert
sumber