Toán tử rỗng EL hoạt động như thế nào trong JSF?


88

Trong JSF, một thành phần có thể được hiển thị hoặc không sử dụng toán tử rỗng EL

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

Như tôi đã hiểu, toán tử hoạt động vừa là kiểm tra null, nhưng cũng kiểm tra kiểm tra xem danh sách có trống không.

Tôi muốn thực hiện kiểm tra trống trên một số đối tượng thuộc lớp tùy chỉnh của riêng mình, tôi cần triển khai (các) giao diện hoặc các phần của giao diện nào? Toán tử trống tương thích với giao diện nào?

Câu trả lời:


151

Từ đặc điểm kỹ thuật EL 2.2 (lấy thông số bên dưới "Nhấp vào đây để tải xuống thông số kỹ thuật để đánh giá"):

1.10 Toán tử trống - empty A

Các emptynhà điều hành là một nhà điều hành tiền tố mà có thể được sử dụng để xác định xem một giá trị là null hoặc rỗng.

Để đánh giá empty A

  • Nếu Anull, hãy trở lạitrue
  • Ngược lại, nếu Alà chuỗi trống, thì trả vềtrue
  • Ngược lại, nếu Alà một mảng trống, thì trả vềtrue
  • Ngược lại, nếu Alà sản phẩm trống Map, hãy trả vềtrue
  • Ngược lại, nếu Alà sản phẩm trống Collection, hãy trả vềtrue
  • Nếu không thì trả lại false

Vì vậy, xem xét các giao diện, nó hoạt động trên CollectionMapduy nhất. Trong trường hợp của bạn, tôi nghĩ Collectionlà lựa chọn tốt nhất. Hoặc, nếu đó là một vật thể giống Javabean, thì Map. Dù bằng cách nào, dưới các trang bìa, isEmpty()phương pháp được sử dụng để kiểm tra thực tế. Trên các phương thức giao diện mà bạn không thể hoặc không muốn triển khai, bạn có thể ném UnsupportedOperationException.


Thật kỳ lạ, tôi cố gắng sử dụng điều này trên Long và eclipse (4.4.0) gợi ý rằng "Biểu thức trống này luôn đánh giá là false. Chỉ chuỗi, bản đồ, mảng và tập hợp có giá trị có ý nghĩa cho toán tử trống"
Pieter De Bie

Kỳ lạ hơn nữa, nó luôn đánh giá là đúng trong trường hợp của tôi.
Pieter De Bie,

Còn nếu myBeannull? Sẽ true/ falsevẫn được trả lại hay nó có thể ném ra một ngoại lệ?
theyuv

9

Sử dụng gợi ý của BalusC về việc triển khai Bộ sưu tập, giờ đây tôi có thể ẩn các mặt chính của mình p:dataTablebằng cách sử dụng toán tử not rỗng trên my dataModelmà mở rộngjavax.faces.model.ListDataModel

Mẫu mã:

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...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.