2011-12-20 21 views
5

है, मैं सोच रहा था कि संग्रह/सर ईएल 2.2 में कोई तरीका है या मुझे कस्टम बनाना होगा?संग्रह/ऐरे में विधि

आवश्यकता: मेरे पास एक स्ट्रिंग सरणी है, और मैं यह जानना चाहता हूं कि इसमें कोई विशिष्ट स्ट्रिंग है या नहीं।

मामला: मैं उन्हें प्रस्तुत करना इनपुट चेक बॉक्स की सूची पर पाशन कर रहा हूँ, और मैं वर्तमान चेकबॉक्स जाँच करना चाहते हैं, अगर यह मूल्य चेक बॉक्स की सरणी में मौजूद है।

अद्यतन:

  • है इस तरह के विधि ईएल में उपलब्ध है?

  • अगर इस तरह के विधि उपलब्ध नहीं है, तो अपने सुझाव प्रदान करें सबसे अच्छा प्रदर्शन एक स्ट्रिंग सरणी के लिए विधि के लिए एक तत्व होता है।

उत्तर

6

एक Collection यह आसान है के लिए, बस ईएल में Colleciton#contains() विधि का उपयोग करें।

<h:panelGroup id="p1" rendered="#{bean.panels.contains('p1')}">...</h:panelGroup> 
<h:panelGroup id="p2" rendered="#{bean.panels.contains('p2')}">...</h:panelGroup> 
<h:panelGroup id="p3" rendered="#{bean.panels.contains('p3')}">...</h:panelGroup> 

एक Object[] (सरणी) के लिए, आप ईएल 3.0 की एक न्यूनतम जरूरत है और अपनी नई लैम्ब्डा समर्थन का उपयोग होगा।

<h:panelGroup id="p1" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p1').get()}">...</h:panelGroup> 
<h:panelGroup id="p2" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p2').get()}">...</h:panelGroup> 
<h:panelGroup id="p3" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p3').get()}">...</h:panelGroup> 

आप अभी तक ईएल 3.0 पर नहीं हैं, तो आप एक कस्टम ईएल समारोह बनाने की आवश्यकता होगी। एक ठोस उदाहरण के लिए, How to create a custom EL function to invoke a static method? E.g देखें।

public static boolean contains(Object[] array, Object item) { 
    return Arrays.asList(array).contains(item); 
} 

जो

<function> 
    <function-name>contains</function-name> 
    <function-class>com.example.Functions</function-class> 
    <function-signature>boolean contains(java.lang.Object[], java.lang.Object)</function-signature> 
</function> 

रूप में पंजीकृत है और

<h:panelGroup ... rendered="#{func:contains(bean.panels, 'u1')}"> 

के रूप में प्रयोग की जाने वाली इस JSTL में उपलब्ध नहीं है। fn:contains() है, लेकिन यह केवल String मानों पर काम करता है।

+0

यदि आप केवल डेटा धारण करने से थोड़ा अधिक करना चाहते हैं तो सरणी का उपयोग न करें। तब संग्रह का प्रयोग करें। – BalusC

+0

अच्छी तरह से, मैं इसे इनपुट विशेषता पर उपयोग कर रहा हूं, लेकिन विधि को कॉल नहीं किया जा रहा है: 'चेक = "# {utils.contains (myBean.array,' myBean.someIndicator ')?' चेक ':' '}" ' –

+0

क्या कोई ईएल त्रुटियां हैं? वैसे, जिस तरह से आप 'चेक' का उपयोग करते हैं, वह बिल्कुल सही नहीं है। जब इसकी विशेषता के बावजूद संपूर्ण विशेषता मौजूद होती है तो एक चेकबॉक्स/रेडियोबुटटन चेक किया जाता है। आप मूल रूप से विशेषता मान के बजाय विशेषता नाम मुद्रित करना चाहते हैं। – BalusC

2

आप एक String[] उपयोग कर रहे हैं, तो आपको पहले एक स्ट्रिंग में एक सरणी के सभी तत्वों को fn:join() का उपयोग कर जोड़ सकते हैं:

<c:set var="concat" value="${fn:join(myArray, '-')}"/> 

और फिर अगर एक मूल्य में मौजूद है की जाँच करने के क्रम में fn:contains() `फ़ंक्शन का उपयोग करें वह स्ट्रिंग:

<c:if test="${fn:contains(concat, 'myString')}">Found!</c:if> 
+0

इस सरल समाधान ने मेरी मदद की क्योंकि मैं चेकबॉक्स मानों के '$ {param.stringArray} 'को देखना चाहता था। – ruhong

संबंधित मुद्दे