JSFでは、EL empty演算子を使用してコンポーネントをレンダリングすることも、使用しないこともできます
rendered="#{not empty myBean.myList}"
私が理解したように、演算子はヌルチェックとして機能しますが、リストが空かどうかもチェックします。
自分のカスタムクラスの一部のオブジェクトで空のチェックを行いたいのですが、どのインターフェイスまたはインターフェイスの一部を実装する必要がありますか?空の演算子はどのインターフェースと互換性がありますか?
EL 2.2仕様 から(「評価用の仕様をダウンロードするにはここをクリックしてください」の下にあるものを入手してください):
1.10空の演算子-
empty A
empty
演算子は、値がnullまたは空かどうかを判断するために使用できるプレフィックス演算子です。
empty A
を評価するには
A
がnull
の場合、true
を返します- それ以外の場合、
A
が空の文字列である場合、true
を返します- それ以外の場合、
A
が空の配列の場合は、true
を返します- それ以外の場合、
A
が空のMap
の場合、true
を返します- それ以外の場合、
A
が空のCollection
の場合、true
を返します- それ以外の場合は
false
を返します
したがって、インターフェースを考慮すると、 Collection
および Map
でのみ機能します。あなたの場合、Collection
が最良のオプションだと思います。または、Javabeanのようなオブジェクトの場合は、Map
です。いずれにせよ、実際のチェックには isEmpty()
メソッドが使用されます。実装できない、または実装したくないインターフェイスメソッドでは、UnsupportedOperationException
をスローできます。
コレクションを実装するというBalusCの提案を使用して、p:dataTable
を拡張するdataModel
でnot empty演算子を使用して、プライムフェイスjavax.faces.model.ListDataModel
を非表示にできるようになりました。
コードサンプル:
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...
}