EL 빈 연산자는 JSF에서 어떻게 작동합니까?


88

JSF에서 컴포넌트는 EL 빈 연산자를 사용하거나 사용하지 않을 수 있습니다.

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

내가 이해했듯이 연산자는 null 검사로 작동하지만 목록이 비어 있는지 확인합니다.

내 사용자 지정 클래스의 일부 개체에 대해 빈 검사를 수행하고 싶습니다. 구현해야하는 인터페이스 또는 인터페이스의 일부는 무엇입니까? 빈 연산자는 어떤 인터페이스와 호환됩니까?

답변:


151

에서 EL 2.2 사양 ( "평가를위한 사양을 다운로드하려면 여기를 클릭하십시오"아래 하나를 얻을) :

1.10 빈 연산자- empty A

empty연산자 값이 널 (null) 또는 빈인지 결정하기 위해 사용될 수있는 접두어 연산자이다.

평가하려면 empty A

  • 만약 AIS null, 반환true
  • 그렇지 않으면 A빈 문자열이면 다음을 반환합니다.true
  • 그렇지 않으면, A빈 배열이면 다음을 반환합니다.true
  • 그렇지 않은 경우 A빈입니다 Map, 반환true
  • 그렇지 않은 경우 A빈입니다 Collection, 반환true
  • 그렇지 않으면 반환 false

따라서, 인터페이스를 고려, 그것은 작동 Collection하고 Map만. 귀하의 경우 Collection에는 최선의 선택 이라고 생각 합니다. 또는 Javabean과 유사한 객체 인 경우 Map. 어느 쪽이든,이 isEmpty()방법은 실제 점검에 사용됩니다. 구현할 수 없거나 구현하고 싶지 않은 인터페이스 메서드에서 UnsupportedOperationException.


이상하게도 저는 이것을 Long에 사용하려고합니다. eclipse (4.4.0)는 "이 빈 표현식은 항상 거짓으로 평가됩니다. 문자열, 맵, 배열 및 컬렉션 만 빈 연산자에 대해 의미있는 값
을가집니다.

더 이상하게도 제 경우에는 항상 사실로 평가됩니다.
Pieter De Bie

어떤 경우 약 myBean이다 null? 것입니다 true/ false아직 반환하거나 예외를 던질 수 있습니까?
theyuv

9

난 지금 내 primefaces 숨길 수 있습니다 컬렉션을 구현 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.