web-dev-qa-db-ja.com

EL empty演算子はJSFでどのように機能しますか?

JSFでは、EL empty演算子を使用してコンポーネントをレンダリングすることも、使用しないこともできます

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

私が理解したように、演算子はヌルチェックとして機能しますが、リストが空かどうかもチェックします。

自分のカスタムクラスの一部のオブジェクトで空のチェックを行いたいのですが、どのインターフェイスまたはインターフェイスの一部を実装する必要がありますか?空の演算子はどのインターフェースと互換性がありますか?

80
Aksel Willgert

EL 2.2仕様 から(「評価用の仕様をダウンロードするにはここをクリックしてください」の下にあるものを入手してください):

1.10空の演算子-empty A

empty演算子は、値がnullまたは空かどうかを判断するために使用できるプレフィックス演算子です。

empty Aを評価するには

  • Anullの場合、trueを返します
  • それ以外の場合、Aが空の文字列である場合、trueを返します
  • それ以外の場合、Aが空の配列の場合は、trueを返します
  • それ以外の場合、Aが空のMapの場合、trueを返します
  • それ以外の場合、Aが空のCollectionの場合、trueを返します
  • それ以外の場合はfalseを返します

したがって、インターフェースを考慮すると、 Collection および Map でのみ機能します。あなたの場合、Collectionが最良のオプションだと思います。または、Javabeanのようなオブジェクトの場合は、Mapです。いずれにせよ、実際のチェックには isEmpty() メソッドが使用されます。実装できない、または実装したくないインターフェイスメソッドでは、UnsupportedOperationExceptionをスローできます。

140
BalusC

コレクションを実装するという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...
}
9
Aksel Willgert