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


88

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

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

私が理解したように、演算子はnullチェックとして機能するだけでなく、リストが空かどうかのチェックも行います。

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

回答:


151

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

1.10空のオペレーター- empty A

emptyオペレータは、値がヌルまたは空であるかどうかを決定するために使用することができる前置演算子です。

評価します empty A

  • IFがAありnull、リターンtrue
  • それ以外の場合、Aが空の文字列の場合は、true
  • それ以外の場合、Aが空の配列の場合は、true
  • そうでなければ、あればA空でMap、リターンtrue
  • そうでなければ、あればA空でCollection、リターンtrue
  • それ以外の場合は戻ります false

だから、インタフェースを考慮し、それが上で動作Collectionし、Mapのみ。あなたの場合、私Collectionは最良の選択肢だと思います。または、Javabeanのようなオブジェクトの場合は、Map。いずれにせよisEmpty()、実際のチェックにはこの方法が使用されます。実装できない、または実装したくないインターフェイスメソッドでは、をスローできますUnsupportedOperationException


奇妙なことに、これをLong and eclipse(4.4.0)のヒントで使用しようとすると、「この空の式は常にfalseと評価されます。文字列、マップ、配列、およびコレクションのみが空の演算子に意味のある値を持ちます」
Pieter De Bie

さらに奇妙なことに、私の場合は常にtrueと評価されます。
Pieter De Bie 2015

場合についてはどうmyBeanですかnull?ウィルtrue/falseまだ返されるか、それが例外をスローすることができますか?
theyuv 2018年

9

コレクションを実装するというBalusCの提案をp:dataTable使用してdataModel、拡張する自分の空でない演算子を使用してプライムフェイスを非表示にできるようになりました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...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.