JSF에서 컴포넌트는 EL 빈 연산자를 사용하거나 사용하지 않을 수 있습니다.
rendered="#{not empty myBean.myList}"
내가 이해했듯이 연산자는 null 검사로 작동하지만 목록이 비어 있는지 확인합니다.
내 사용자 지정 클래스의 일부 개체에 대해 빈 검사를 수행하고 싶습니다. 구현해야하는 인터페이스 또는 인터페이스의 일부는 무엇입니까? 빈 연산자는 어떤 인터페이스와 호환됩니까?
답변
에서 EL 2.2 사양 ( “평가를위한 사양을 다운로드하려면 여기를 클릭하십시오”아래 하나를 얻을) :
1.10 빈 연산자-
empty A
empty
연산자 값이 널 (null) 또는 빈인지 결정하기 위해 사용될 수있는 접두어 연산자이다.평가하려면
empty A
- 만약
A
ISnull
, 반환true
- 그렇지 않으면
A
빈 문자열이면 다음을 반환합니다.true
- 그렇지 않으면,
A
빈 배열이면 다음을 반환합니다.true
- 그렇지 않은 경우
A
빈입니다Map
, 반환true
- 그렇지 않은 경우
A
빈입니다Collection
, 반환true
- 그렇지 않으면 반환
false
따라서, 인터페이스를 고려, 그것은 작동 Collection
하고 Map
만. 귀하의 경우 Collection
에는 최선의 선택 이라고 생각 합니다. 또는 Javabean과 유사한 객체 인 경우 Map
. 어느 쪽이든,이 isEmpty()
방법은 실제 점검에 사용됩니다. 구현할 수 없거나 구현하고 싶지 않은 인터페이스 메서드에서 UnsupportedOperationException
.
답변
난 지금 내 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...
}