คุณจะได้รับความยาวของรายการในภาษานิพจน์ JSF ได้อย่างไร


118

ฉันจะรับความยาวของArrayListนิพจน์โดยใช้ JSF EL ได้อย่างไร

#{MyBean.somelist.length}

ไม่ทำงาน, ไม่เป็นผล.



@GBa คุณสามารถใช้ # {MyBean.somelist.size ()} เพื่อแสดงขนาดของรายการ
Umair

คุณยังสามารถใช้ c: forEach เพื่อวนซ้ำในรายการและในเนื้อหาของลูปกำหนดค่าการนับให้กับตัวแปรเช่น <c: set var = "nr_of_items" value = "$ {varStatus.count}" /> มีประโยชน์โดยเฉพาะอย่างยิ่งเมื่อคุณวนซ้ำรายการอยู่แล้ว
David Balažic

คำตอบ:


166

ใช่เนื่องจากอัจฉริยะบางคนในคณะกรรมการสร้าง Java API ตัดสินใจว่าแม้ว่าบางคลาสจะมีsize()สมาชิกหรือlengthแอตทริบิวต์ แต่ก็จะไม่นำไปใช้getSize()หรือgetLength()ที่ JSF และมาตรฐานอื่น ๆ ส่วนใหญ่ต้องการคุณไม่สามารถทำสิ่งที่คุณต้องการได้

มีสองวิธีในการทำเช่นนี้

หนึ่ง: เพิ่มฟังก์ชันให้กับ Bean ของคุณที่ส่งกลับความยาว:

ในคลาส MyBean:
int สาธารณะ getSomelistLength () {ส่งคืน this.somelist.length; }

ในหน้า JSF ของคุณ:
# {} MyBean.somelistLength

สอง: ถ้าคุณใช้ Facelets (โอ้พระเจ้าทำไมคุณไม่ใช้ Facelets!) คุณสามารถเพิ่ม fn namespace และใช้ฟังก์ชัน length

ในหน้า JSF:
# {fn: length (MyBean.somelist)}

2
fn น่าจะเป็นหนทางไป แต่น่าเสียดายที่มีให้บริการเฉพาะใน JSTL เวอร์ชันที่มากกว่า 1.1
James McMahon

27
การใช้ fn: length ใช้ได้ผลสำหรับฉันกับ JSP เปล่า (ไม่มี JSF, Facelets; โปรเจ็กต์ดั้งเดิมพิเศษที่ได้รับการอัปเดตเพียงเล็กน้อยก่อนที่จะยุติลง) แท็กลิบที่เหมาะสมที่จะใช้:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
สำหรับคนที่มาที่นี่เช่นฉันยังคงอีก 2 ปีหลังจากนั้นคุณอาจเพิ่มเนมสเปซต่อไปนี้ในเฟซเล็ตของคุณ: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

60

คุณหมายถึงขนาด () ใช่ไหม

#{MyBean.somelist.size()}

เหมาะสำหรับฉัน (ใช้ JBoss Seam ซึ่งมีส่วนขยาย Jboss EL)


บางทีข้อกำหนดที่ใหม่กว่าของ EL จะรองรับวิธีการขนาดหรือไม่ มีใครยืนยันหรือปฏิเสธเรื่องนี้ได้บ้าง?
James McMahon

2
@nemo - สิ่งนี้ถูกกล่าวถึงในรุ่นการบำรุงรักษา JSR245: blogs.sun.com/kchung/entry/jsr_245_mr_part_i (ในแง่ของข้อกำหนด JEE นั่นจะเป็น JEE6)
McDowell

@McDowell ขอบคุณสำหรับข้อมูลฉันประหลาดใจมากที่พวกเขาใช้เวลานานในการแก้ไขปัญหานี้
James McMahon

ขอบคุณ. มันได้ผลสำหรับฉันด้วย +1 แต่จนกว่า JEE 6 จะได้รับการสนับสนุนอย่างกว้างขวางฉันอาจใช้ฟังก์ชัน JSTL "มาตรฐานมากกว่า"
Hosam Aly

BTW อาจใช้งานได้ใน JBoss เพื่อพูด#{MyBean.somelist.size}(โดยไม่มีวงเล็บต่อท้าย)
Hosam Aly

14

หมายเหตุ:วิธีนี้ดีกว่าสำหรับ JSTL เวอร์ชันเก่า สำหรับรุ่นที่มากขึ้นแล้ว 1.1 ผมขอแนะนำให้ใช้fn:length(MyBean.somelist)ตามที่แนะนำโดยบิลเจมส์


บทความนี้มีข้อมูลรายละเอียดเพิ่มเติมรวมถึงวิธีแก้ไขปัญหาอื่น ๆ ที่เป็นไปได้

ปัญหาคือเราพยายามเรียกใช้เมธอดขนาดของรายการ (ซึ่งเป็นเมธอด LinkedList ที่ถูกต้อง) แต่ไม่ใช่เมธอด getter ที่สอดคล้องกับ JavaBeans ดังนั้นจึงไม่สามารถประเมินนิพจน์ list.size-1 ได้

มีสองวิธีในการจัดการกับภาวะที่กลืนไม่เข้าคายไม่ออกนี้ ขั้นแรกคุณสามารถใช้ไลบรารี RT Core ได้ดังนี้:

<c_rt:out value='<%= list[list.size()-1] %>'/>

ประการที่สองหากคุณต้องการหลีกเลี่ยงโค้ด Java ในเพจ JSP ของคุณคุณสามารถใช้คลาส wrapper แบบง่ายที่มีรายการและให้การเข้าถึงคุณสมบัติขนาดของรายการด้วยเมธอด getter ที่สอดคล้องกับ JavaBeans ถั่วนั้นอยู่ในรายการ 2.25

ปัญหาเกี่ยวกับวิธี c_rt คือคุณต้องรับตัวแปรจากการร้องขอด้วยตนเองเพราะมันไม่รู้จักมันเป็นอย่างอื่น ณ จุดนี้คุณกำลังใส่โค้ดจำนวนมากสำหรับสิ่งที่ควรสร้างขึ้นในฟังก์ชันการทำงาน นี่คือข้อบกพร่องของGIANTใน EL

ฉันลงเอยด้วยวิธี "wrapper" นี่คือคลาสสำหรับมัน

public class CollectionWrapper {

    Collection collection;

    public CollectionWrapper(Collection collection) {
        this.collection = collection;
    }

    public Collection getCollection() {
        return collection;
    }

    public int getSize() {
        return collection.size();
    }
}

ตัวเลือกที่สามที่ยังไม่มีใครพูดถึงคือการใส่ขนาดรายการของคุณลงในแบบจำลอง (สมมติว่าคุณใช้ MVC) เป็นแอตทริบิวต์แยกต่างหาก ดังนั้นในโมเดลของคุณคุณจะมี "someList" และ "someListSize" นั่นอาจเป็นวิธีที่ง่ายที่สุดในการแก้ปัญหานี้



6
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

บนหน้าจอจะแสดงขนาดตาราง

ตัวอย่าง: Table Size = 5


ใช่นี่เป็นวิธีที่ง่ายที่สุดในการทำ ฉันใช้ websphere6 กับ JSP (ระบบเดิม) ใช้แท็บลิบเดียวกันจากนั้นใช้ 'เครื่องหมายดอลลาร์' แทน 'แฮช' เนื่องจากแฮชไม่ทำงาน เช่น: {fn: length (SystemBean.list)}
JackDev

0

ในที่สุดคุณสามารถขยายภาษา EL ได้โดยใช้EL Functorซึ่งจะช่วยให้คุณสามารถเรียกใช้เมธอด Java bean ได้แม้จะมีพารามิเตอร์ ...


-1

หลังจาก 7 ปี ... โซลูชัน facelets ยังคงใช้งานได้ดีสำหรับฉันในฐานะผู้ใช้ jsf

รวมเนมสเปซเป็น xmlns:fn="http://java.sun.com/jsp/jstl/functions"

และใช้ EL เป็น #{fn:length(myBean.someList)}ตัวอย่างหากใช้ใน jsf ui: fragment ด้านล่างตัวอย่างใช้งานได้ดี

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>

-5

คุณสามารถรับความยาวโดยใช้ EL ต่อไปนี้:

# {Bean.list.size ()}


1
นี้เป็นหลักคำตอบเดียวกับDamo ของ
Artjom B.

6
ในฐานะ @ArtjomB. sugggests โดยทั่วไปไม่ดีที่จะโพสต์จำนวนที่เป็นคำตอบเดียวกับที่คนอื่นโพสต์ไว้แล้ว ในกรณีนี้เกือบหกปีที่ผ่านมา
Andrew Barber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.