जेएसएफ अभिव्यक्ति भाषा में आपको सूची की लंबाई कैसे मिलती है?


118

मुझे ArrayListJSF EL अभिव्यक्ति का उपयोग करने की लंबाई कैसे मिलेगी ?

#{MyBean.somelist.length}

काम नहीं करता।



@GBa आप सूची का आकार प्रदर्शित करने के लिए # {MyBean.somelist.size ()} का उपयोग कर सकते हैं।
उमैर

आप सी का भी उपयोग कर सकते हैं: सूची में लूप के लिए फॉरएच और लूप बॉडी में एक वैरिएबल का काउंट वैल्यू असाइन किया जाता है, जैसे: <c: set var = "nr_of_items" value = "$ {varStatus.count} />>। विशेष रूप से तब उपयोगी होता है जब आप किसी भी तरह सूची में लूपिंग कर रहे हों।
डेविड बालैसिक

जवाबों:


166

हां, चूंकि जावा एपीआई निर्माण समिति में कुछ प्रतिभाओं ने फैसला किया है कि कुछ वर्गों के size()सदस्यों या lengthविशेषताओं के बावजूद , वे लागू नहीं करेंगे getSize()या getLength()जिन्हें जेएसएफ और अधिकांश अन्य मानकों की आवश्यकता होती है, आप वह नहीं कर सकते जो आप चाहते हैं।

ऐसा करने के लिए कुछ तरीके हैं।

एक: अपने बीन में एक फ़ंक्शन जोड़ें जो लंबाई लौटाता है:

कक्षा में MyBean:
सार्वजनिक int getSomelistLength () {इसे वापस करें। somelist.length; }

अपने JSF पेज में:
# {} MyBean.somelistLength

दो: यदि आप फेसलेट्स का उपयोग कर रहे हैं (ओह, गॉड, आप फेसलेट्स का उपयोग क्यों नहीं कर रहे हैं!), आप fn नामस्थान जोड़ सकते हैं और लंबाई फ़ंक्शन का उपयोग कर सकते हैं

JSF पेज में:
{{fn: लंबाई (MyBean.somelist)}

2
fn शायद जाने का रास्ता है, दुर्भाग्य से यह केवल JSTL संस्करणों में उपलब्ध है तो 1.1।
जेम्स मैकमोहन

27
Fn का उपयोग करना: लंबाई ने मेरे लिए नंगे JSP (कोई JSF, फेसलेट्स; अल्ट्रा लीगेसी प्रोजेक्ट को हल्के ढंग से अपडेट किए जाने से पहले चरणबद्ध किए जाने के साथ) के लिए काम किया। उपयोग करने के लिए उचित टैगलिब:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
क्रिस्टोफर पार्कर

57
मेरे जैसे यहाँ उतरने वाले लोगों के लिए, अभी भी 2 साल बाद, विचार करें कि आप अपने नामपत्र में निम्नलिखित नाम स्थान जोड़ सकते हैं: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
डेमियन मिरास

60

आप का मतलब आकार () है ना?

#{MyBean.somelist.size()}

मेरे लिए काम करता है (JBoss सीम का उपयोग करके जिसमें Jboss EL एक्सटेंशन हैं)


हो सकता है कि EL के नए विनिर्देश आकार विधि का समर्थन करें? कोई भी इस बात की पुष्टि या इस बात से इंकार कर सकता हैं?
जेम्स मैकमोहन

2
@nemo - इसे JSR245 रखरखाव रिलीज़ में संबोधित किया जा रहा है: blogs.sun.com/kchung/entry/jsr_245_mr_part_i (JEE चश्मा के संदर्भ में, यह EEE6 होगा)
McDowell

@McDowell, इस जानकारी के लिए धन्यवाद, मैं वास्तव में आश्चर्यचकित हूं कि उन्हें इस मुद्दे को हल करने के लिए बहुत समय लग गया।
जेम्स मैकमोहन

धन्यवाद। इसने मेरे लिए भी काम किया। +1। लेकिन जब तक जेईई 6 व्यापक रूप से समर्थित है, मैं शायद "अधिक मानक" जेएसटीएल फ़ंक्शन के साथ रहूंगा।
होसम एलि

BTW, यह शायद JBoss में सिर्फ कहने के लिए #{MyBean.somelist.size}(अंत में कोष्ठक के बिना) काम करता है।
होसम ऐली

14

नोट: यह समाधान 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" होगा। यह इस समस्या को हल करने का सबसे सरल तरीका हो सकता है।



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

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

स्क्रीन पर यह टेबल का आकार प्रदर्शित करता है

उदाहरण: Table Size = 5


हाँ, मुझे लगता है यह करने का सबसे सरल तरीका है। मैं JSP (विरासत प्रणाली) के साथ websphere6 का उपयोग कर रहा हूं। उसी टैबलिब का इस्तेमाल किया और फिर 'हैश' के विपरीत 'डॉलर साइन' का उपयोग किया क्योंकि हैश काम नहीं करता था। यानी: {fn: लंबाई (SystemBean.list)}
जैकडेव

0

आप अंततः ईएल फ़नीक्टर का उपयोग करके ईएल भाषा का विस्तार कर सकते हैं , जो आपको किसी भी जावा बीन्स विधियों को कॉल करने की अनुमति देगा, यहां तक ​​कि मापदंडों के साथ ...


-1

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>

-5

आप निम्नलिखित ईएल का उपयोग करके लंबाई प्राप्त कर सकते हैं:

# {Bean.list.size ()}


1
यह अनिवार्य रूप से दामो के समान ही उत्तर है ।
आर्टजोम बी।

6
जैसा @ArtjomB। शक्कर, यह आम तौर पर अच्छा नहीं है कि क्या राशि उसी उत्तर में पोस्ट की जाए जैसे कोई और पहले से ही पोस्ट करता है। इस मामले में, लगभग छह साल पहले
एंड्रयू बार्बर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.