EL empty operator ทำงานอย่างไรใน JSF


88

ใน JSF ส่วนประกอบสามารถแสดงผลหรือไม่ใช้ตัวดำเนินการว่างเปล่า EL

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

ตามที่ฉันเข้าใจว่าตัวดำเนินการทำงานได้ทั้งแบบ null-check แต่ตรวจสอบด้วยว่ารายการว่างหรือไม่

ฉันต้องการตรวจสอบว่างในบางออบเจ็กต์ของคลาสแบบกำหนดเองของฉันเองฉันต้องใช้อินเทอร์เฟซใดหรือบางส่วนของอินเทอร์เฟซใด อินเทอร์เฟซใดที่ตัวดำเนินการว่างเข้ากันได้?

คำตอบ:


152

จากข้อกำหนด 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เป็นตัวเลือกที่ดีที่สุด Mapหรือถ้ามันเป็นวัตถุจาวาบีนเหมือนแล้ว ไม่ว่าจะด้วยวิธีใดก็ตามisEmpty()วิธีนี้จะใช้สำหรับการตรวจสอบจริงภายใต้ฝาครอบ สำหรับวิธีการอินเทอร์เฟซที่คุณไม่สามารถหรือไม่ต้องการใช้คุณสามารถโยนUnsupportedOperationExceptionได้


แปลกฉันพยายามใช้สิ่งนี้กับ Long และ eclipse (4.4.0) บอกเป็นนัยว่า "นิพจน์ว่างนี้จะประเมินค่าเป็นเท็จเสมอมีเพียงสตริงแผนที่อาร์เรย์และคอลเล็กชันเท่านั้นที่มีค่าที่มีความหมายสำหรับตัวดำเนินการว่าง"
Pieter De Bie

ยิ่งไปกว่านั้นมันมักจะประเมินว่าเป็นจริงในกรณีของฉัน
Pieter De Bie

แล้วถ้าmyBeanเป็นnull? จะtrue/ falseยังคงถูกส่งกลับหรือสามารถยกเว้นได้หรือไม่?
theyuv

9

การใช้คำแนะนำของ BalusC ในการใช้ Collection ตอนนี้ฉันสามารถซ่อน Primefaces ของฉัน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.