JSTL

2009-09-29 11 views
73

में list.contains स्ट्रिंग मूल्यांकन मैं एक तत्व को छिपाने के लिए की जरूरत है निश्चित मूल्यों JSPJSTL

मूल्यों एक सूची में जमा हो जाती तो मैं करने की कोशिश की में मौजूद हैं:

<c:if test="${ mylist.contains(myValue) }">style='display:none;'</c:if> 

लेकिन, यह नहीं करता है 'काम नहीं करती।

मैं कैसे मूल्यांकन कर सकते हैं अगर एक सूची JSTL, सूची में कोई मान और मूल्यों तार कर रहे हैं।

+13

ध्यान दें कि दिए गए वाक्य रचना काम करता है के रूप में ईएल 2.2 के बाद से intented (जो सर्वलेट 3.0 के हिस्से के रूप में लाया जाता है/JSP 2.2 जो दिसंबर 2009 को जारी किया गया था)। – BalusC

+0

[जेएसटीएल सेट्स और सूचियों के संभावित डुप्लिकेट - यदि सेट में आइटम मौजूद है तो जांचें] (http://stackoverflow.com/questions/1076679/jstl-sets-and-lists-checking-if-item-exists-in-a -सेट) –

उत्तर

58

दुख की बात है, मुझे लगता है कि JSTL सभी तत्वों के माध्यम से कुछ भी लेकिन एक यात्रा का समर्थन नहीं करता इस यह पता लगाने की। अतीत में, मैं कोर टैग पुस्तकालय में foreach पद्धति का उपयोग किया:

<c:set var="contains" value="false" /> 
<c:forEach var="item" items="${myList}"> 
    <c:if test="${item eq myValue}"> 
    <c:set var="contains" value="true" /> 
    </c:if> 
</c:forEach> 

इस चलने के बाद, $ {} शामिल बराबर हो जाएगा करने के लिए "सही" अगर MyList myValue निहित।

+8

सूची छोटी है तो अच्छी तरह से काम करता है। बस इस तरह से करने के लिए एक प्रदर्शन लागत का एहसास है। – Chii

+0

हाँ, अगर आप पर्याप्त उच्च हो जाएंगे। मैंने इसे 10-20 चीजों के संग्रह के लिए उपयोग किया है और किसी भी प्रदर्शन के मुद्दों का अनुभव नहीं किया है। जो चीज मुझे लगता है वह बदतर है जेएसटीएल की लाइनों की संख्या। फिर भी, मुझे लगता है कि यह अपना खुद का टीएलडी स्थापित किए बिना एकमात्र तरीका है (जो बहुत मुश्किल नहीं है और शायद इसके लायक हो सकता है)। –

92

कोई अंतर्निहित है विशेषता यह है कि जांच करने के लिए - क्या आप क्या करेंगे अपने स्वयं के टीएलडी समारोह जो एक सूची और एक आइटम लेता है, और कॉल सूची के शामिल() विधि लिखना है। जैसे

//in your own WEB-INF/custom-functions.tld file add this 
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE taglib 
     PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" 
     "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> 
<taglib 
     xmlns="http://java.sun.com/xml/ns/j2ee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" 
     version="2.0" 
     > 
    <tlib-version>1.0</tlib-version> 
    <function> 
     <name>contains</name> 
     <function-class>com.Yourclass</function-class> 
     <function-signature>boolean contains(java.util.List,java.lang.Object) 
     </function-signature> 
    </function> 
</taglib> 

फिर एक वर्ग Yourclass कहा जाता है एक स्थिर विधि से ऊपर हस्ताक्षर के साथ होता है कहा जाता है बनाते हैं, और जोड़ें। मुझे यकीन है कि विधि के क्रियान्वयन सुंदर आत्म व्याख्यात्मक है हूँ:

package com; // just to illustrate how to represent the package in the tld 
public class Yourclass { 
    public static boolean contains(List list, Object o) { 
     return list.contains(o); 
    } 
} 

तो आप इसे अपने jsp में उपयोग कर सकते हैं:

<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %> 
<c:if test="${ fn:contains(mylist, myValue) }">style='display:none;'</c:if> 

टैग साइट में किसी भी JSP से इस्तेमाल किया जा सकता।

संपादित करें: TLD फ़ाइल के बारे में और अधिक जानकारी - more info here

+0

: - एस उस कोड को कहां रखा गया है? लगता है कि – OscarRyz

+1

ive ने थोड़ी अधिक जानकारी के साथ उत्तर संपादित किया। – Chii

+4

मैं टैगलिब में 'सूची' के बजाय' संग्रह' का उपयोग करने की अनुशंसा करता हूं - यह वही काम करता है लेकिन 'सेट की – Ralph

2

निम्नलिखित आपके प्रश्न का उत्तर की तुलना में एक वैकल्पिक हल के और अधिक है, लेकिन यह हो सकता है आप के लिए क्या देख रहे हैं। आप एक सूची के बजाय एक नक्शे में अपने मूल्यों डाल कर सकते हैं, कि आपकी समस्या का समाधान होगा। बस एक गैर शून्य मान करने के लिए अपने मान मैप और इस <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if> करते हैं या आप भी style='display:none; मैप कर सकते हैं और बस उत्पादन ${mymap.myValue}

+0

जैसे अधिक संग्रह प्रकारों का समर्थन करता है मुझे लगता है कि वाक्यविन्यास शैली = 'प्रदर्शन: कोई नहीं;' अन्यथा परिवर्तनीय "myValue" का मूल्यांकन नहीं किया जाता है। – Andreas

25

ऐसा करने का एक और तरीका है अपने वस्तु का प्रतिनिधित्व कुंजी, मूल्य जोड़े के साथ एक Map (HashMap) उपयोग कर रहा है।

Map<Long, Object> map = new HashMap<Long, Object>(); 
map.put(new Long(1), "one"); 
map.put(new Long(2), "two"); 

JSTL

<c:if test="${not empty map[1]}"> 

में यह सच लौटना चाहिए अगर जोड़ी नक्शा

+2

यह मेरा पसंदीदा तरीका भी है, एक दृश्य में मुझे जो भी चाहिए, उसके लिए व्यूमोडेल में हैशमैप्स सेट अप करें। वे ईएल सिंटैक्स के साथ अच्छी तरह से एकीकृत होते हैं और खोज करते समय बिजली-तेज होते हैं। –

+0

बस एक और बात, यदि कुंजी मौजूद है लेकिन मान शून्य या खाली है तो यह झूठी वापसी करेगा। – Zai

+1

या यदि नक्शा बूलियन रखता है, 'test = "$ {isPresentByValue [myValue]}" '। – Noumenon

-3
<c:if test="${fn:contains(task.subscribers, customer)}"> 

यह मेरे लिए ठीक काम करता है में मौजूद हैं।

+15

यह दोनों तत्वों को स्ट्रिंग में परिवर्तित करने के बाद चेक कर रहा है। सूची को एक स्ट्रिंग में परिवर्तित किया जाता है और प्रति तत्व आधार पर चेक नहीं किया जाता है। यदि task.subscribers एक सूची है ["एक", "दो", "बीसोन"] यह होगा: ग्राहक के लिए सच = "एक" (दो बार मिलान) ग्राहक के लिए गलत = "तीन" (कोई मिलान नहीं) ग्राहक = "बीस" के लिए सच (जो आप नहीं देख रहे हैं) – rmarimon

+1

रैमरिमॉन की चेतावनी के बारे में जागरूक होने के कारण, इस उत्तर ने मेरे सटीक उपयोग मामले से मेल खाया। – CodeReaper

-1

आप स्प्रिंग फ्रेमवर्क का उपयोग कर रहे हैं, तो आप स्प्रिंग taglib और स्पेल का उपयोग कर सकते हैं:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
--- 
<spring:eval var="containsValue" expression="mylist.contains(myValue)" /> 
<c:if test="${containsValue}">style='display:none;'</c:if> 
-1

आप fn:contains() या fn:containsIgnoreCase() फ़ंक्शन का उपयोग करना।

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

...

<c:if test="${not fn:containsIgnoreCase(mylist, 'apple')}"> 
     <p>Doesn't contain 'apple'</p> 
    </c:if> 

या

<c:if test="${not fn:contains(mylist, 'Apple')}"> 
      <p>Contains 'Apple'</p> 
     </c:if> 
+0

@ बालससी 1) उत्तर दिए गए प्रश्न का उत्तर देने का कोई प्रतिबंध नहीं है। 2) कृपया वोट देने से पहले सोचें, यह उत्तर सही है और मैंने जवाब देने से पहले इसका परीक्षण किया। मैंने इसे और भी स्पष्ट करने के लिए उत्तर अपडेट किया है। – tkr

+0

@ बालससी मैं दोहराना नहीं कर रहा हूं और मैं सिर्फ एक विस्तृत उत्तर प्रदान कर रहा हूं। मैं भी पाठक को चम्मच खिलाना नहीं चाहता। मुझे लगता है कि एसओ का पूरा बिंदु है। इसलिए हम अभी भी एक प्रश्न का उत्तर दे सकते हैं कि कोई स्वीकार्य उत्तर है या नहीं। क्या यह आपके लिए कोई सवारी नहीं करता है। और मैं भी आपके नीचे वोट का सम्मान करता हूं क्योंकि मैं हर व्यक्ति को समझता हूं जिसकी 100 से अधिक प्रतिनिधि हैं या ऐसा कर सकते हैं। तो अगर आप उत्तर को बंद करना चाहते हैं तो कृपया एक वोट खोलें। – tkr

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