ฉันจะรับความยาวของArrayList
นิพจน์โดยใช้ JSF EL ได้อย่างไร
#{MyBean.somelist.length}
ไม่ทำงาน, ไม่เป็นผล.
ฉันจะรับความยาวของArrayList
นิพจน์โดยใช้ JSF EL ได้อย่างไร
#{MyBean.somelist.length}
ไม่ทำงาน, ไม่เป็นผล.
คำตอบ:
ใช่เนื่องจากอัจฉริยะบางคนในคณะกรรมการสร้าง 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)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
คุณหมายถึงขนาด () ใช่ไหม
#{MyBean.somelist.size()}
เหมาะสำหรับฉัน (ใช้ JBoss Seam ซึ่งมีส่วนขยาย Jboss EL)
#{MyBean.somelist.size}
(โดยไม่มีวงเล็บต่อท้าย)
หมายเหตุ:วิธีนี้ดีกว่าสำหรับ 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" นั่นอาจเป็นวิธีที่ง่ายที่สุดในการแก้ปัญหานี้
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
บนหน้าจอจะแสดงขนาดตาราง
ตัวอย่าง: Table Size = 5
ในที่สุดคุณสามารถขยายภาษา EL ได้โดยใช้EL Functorซึ่งจะช่วยให้คุณสามารถเรียกใช้เมธอด Java bean ได้แม้จะมีพารามิเตอร์ ...
หลังจาก 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>
คุณสามารถรับความยาวโดยใช้ EL ต่อไปนี้:
# {Bean.list.size ()}