Як працює порожній оператор EL у JSF?


88

У JSF компонент може бути відтворений або не використаний порожній оператор EL

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

Як я зрозумів, оператор працює як нульова перевірка, але також перевіряє перевірку, чи список порожній.

Я хочу робити порожні перевірки деяких об'єктів мого власного класу, який інтерфейс (и) або частини інтерфейсів мені потрібно реалізувати? З яким інтерфейсом сумісний порожній оператор?

Відповіді:


151

З специфікації EL 2.2 (отримайте наведену нижче "Клацніть тут, щоб завантажити специфікацію для оцінки"):

1.10 Порожній оператор - empty A

emptyОператор є оператором префікс , який може бути використаний для визначення , якщо значення дорівнює нулю або порожньо.

Оцінювати empty A

  • Якщо 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. Тільки рядок, карти, масиви та колекція мають значення для порожнього оператора"
Пітер Де Бі

Ще дивніше, це завжди оцінює як істину в моєму випадку.
Пітер Де Бі

А як бути, якщо myBeanє null? Буде true/ falseбуде повернуто або може спричинити виняток?
sheuv

9

Використовуючи пропозицію BalusC щодо реалізації Collection, я тепер можу приховувати свої первинні поверхні, p:dataTableвикористовуючи не пустий оператор на my, 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...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.