मुझे ArrayList
JSF EL अभिव्यक्ति का उपयोग करने की लंबाई कैसे मिलेगी ?
#{MyBean.somelist.length}
काम नहीं करता।
मुझे ArrayList
JSF EL अभिव्यक्ति का उपयोग करने की लंबाई कैसे मिलेगी ?
#{MyBean.somelist.length}
काम नहीं करता।
जवाबों:
हां, चूंकि जावा एपीआई निर्माण समिति में कुछ प्रतिभाओं ने फैसला किया है कि कुछ वर्गों के size()
सदस्यों या length
विशेषताओं के बावजूद , वे लागू नहीं करेंगे getSize()
या getLength()
जिन्हें जेएसएफ और अधिकांश अन्य मानकों की आवश्यकता होती है, आप वह नहीं कर सकते जो आप चाहते हैं।
ऐसा करने के लिए कुछ तरीके हैं।
एक: अपने बीन में एक फ़ंक्शन जोड़ें जो लंबाई लौटाता है:
कक्षा में MyBean: सार्वजनिक int getSomelistLength () {इसे वापस करें। somelist.length; } अपने JSF पेज में: # {} MyBean.somelistLength
दो: यदि आप फेसलेट्स का उपयोग कर रहे हैं (ओह, गॉड, आप फेसलेट्स का उपयोग क्यों नहीं कर रहे हैं!), आप fn नामस्थान जोड़ सकते हैं और लंबाई फ़ंक्शन का उपयोग कर सकते हैं
JSF पेज में: {{fn: लंबाई (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 सीम का उपयोग करके जिसमें Jboss EL एक्सटेंशन हैं)
#{MyBean.somelist.size}
(अंत में कोष्ठक के बिना) काम करता है।
नोट: यह समाधान JSTL के पुराने संस्करणों के लिए बेहतर है। संस्करण 1.1 से अधिक के लिए, मैं बिल जेम्सfn:length(MyBean.somelist)
द्वारा सुझाए गए अनुसार उपयोग करने की सलाह देता हूं ।
इस लेख में कुछ और विस्तृत जानकारी है, जिसमें एक और संभावित समाधान शामिल है;
समस्या यह है कि हम सूची के आकार विधि (जो एक मान्य लिंक्डलिस्ट विधि है) को लागू करने की कोशिश कर रहे हैं, लेकिन यह एक जावा-कंपाइलेंट गेट्टर विधि नहीं है, इसलिए अभिव्यक्ति की सूची। आकार-1 का मूल्यांकन नहीं किया जा सकता है।
इस दुविधा को संबोधित करने के दो तरीके हैं। सबसे पहले, आप आरटी कोर लाइब्रेरी का उपयोग कर सकते हैं, जैसे:
<c_rt:out value='<%= list[list.size()-1] %>'/>
दूसरा, यदि आप अपने जेएसपी पृष्ठों में जावा कोड से बचना चाहते हैं, तो आप एक साधारण आवरण वर्ग को लागू कर सकते हैं जिसमें एक सूची होती है और एक जावाबिन-कंपाइलर गेट्टर विधि के साथ सूची के आकार की संपत्ति तक पहुंच प्रदान करता है। वह बीन लिस्टिंग 2.25 में सूचीबद्ध है।
C_rt विधि के साथ समस्या यह है कि आपको मैन्युअल रूप से अनुरोध से चर प्राप्त करने की आवश्यकता है, क्योंकि यह इसे अन्यथा नहीं पहचानता है। इस बिंदु पर आप कार्यक्षमता में क्या बनाया जाना चाहिए इसके लिए बहुत सारे कोड डाल रहे हैं। यह ईएल में एक जीआईएटी दोष है।
मैंने "रैपर" विधि का उपयोग करके समाप्त किया, यहां इसके लिए वर्ग है;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
एक तीसरा विकल्प जिसका किसी ने अभी तक उल्लेख नहीं किया है, वह है कि आप अपनी सूची का आकार मॉडल में रखें (मान लें कि आप एमवीसी का उपयोग कर रहे हैं) एक अलग विशेषता के रूप में। तो आपके मॉडल में आपको "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
आप अंततः ईएल फ़नीक्टर का उपयोग करके ईएल भाषा का विस्तार कर सकते हैं , जो आपको किसी भी जावा बीन्स विधियों को कॉल करने की अनुमति देगा, यहां तक कि मापदंडों के साथ ...
7 वर्षों के बाद ... फेसलेट्स समाधान अभी भी मेरे लिए एक jsf उपयोगकर्ता के रूप में ठीक काम करता है
नाम के रूप में शामिल करें
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
और #{fn:length(myBean.someList)}
उदाहरण के लिए EL का उपयोग करें
यदि jsf ui में उपयोग किया जाता है: उदाहरण के नीचे का टुकड़ा ठीक काम करता है
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
आप निम्नलिखित ईएल का उपयोग करके लंबाई प्राप्त कर सकते हैं:
# {Bean.list.size ()}