सूची का मूल्यांकन करें। JSTL में स्ट्रिंग बनाए रखता है


89

मुझे एक तत्व को छिपाने की जरूरत है अगर कुछ मान JSP में मौजूद हैं

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

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

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

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


17
ध्यान दें कि दिया गया सिंटैक्स EL 2.2 के रूप में काम करता है (जो कि सर्वलेट 3.0 / JSP 2.2 के हिस्से के रूप में लाया गया है जो 2009 में जारी किया गया था)।
बालुसक

जवाबों:


70

अफसोस की बात है, मुझे लगता है कि 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 सम्‍मिलित है।


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

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

97

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

//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);
   }
}

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

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

टैग का उपयोग साइट के किसी भी JSP से किया जा सकता है।

संपादित करें: अधिक जानकारी tld फ़ाइल के बारे में - अधिक जानकारी यहाँ


4
मैं का उपयोग करने की सलाह देते हैं Collectionबजाय Listजैसे कि यह एक ही काम करते हैं लेकिन समर्थन और अधिक संग्रह प्रकार - taglib में Setरों
राल्फ

28

ऐसा करने का एक अन्य तरीका 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
यह मेरा पसंदीदा तरीका भी है, व्यूह्मॉडल में उन सभी चीजों के लिए हैशपैप सेट करें, जिनकी मुझे एक दृश्य में आवश्यकता होगी। वे अच्छी तरह से ईएल सिंटैक्स के साथ एकीकृत करते हैं और खोजते समय बिजली-तेज होते हैं।
बोरिस बी।

बस एक और बात, अगर कुंजी मौजूद है लेकिन मूल्य शून्य या खाली है तो यह गलत होगा।
ज़ी

1
या अगर नक्शा, बूलियन्स रखती है test="${isPresentByValue[myValue]}"
नौमेनन

15

आपको 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>

नोट: यह काम करेगाmylist.toString().contains("apple")और यदि यह वह नहीं है जो आप दूसरे दृष्टिकोण के बेहतर उपयोग के लिए देख रहे हैं।


2
यह सही दृष्टिकोण नहीं है। यह मूल रूप से वैसा ही व्यवहार करेगा जैसा mylist.toString().contains("apple")कि आप शुरू में उम्मीद करते हैं कि बिल्कुल नहीं है।
बालुसक

ओह .. हाँ यह वह नहीं है जिसकी मुझे उम्मीद है। वैसे भी मैं इस जवाब के साथ अपने जवाब को अपडेट करूंगा।
tk_

2

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


मुझे लगता है कि वाक्यविन्यास होना चाहिए <c: if test = "$ {mymap [myValue] ne null}"> शैली = 'प्रदर्शन: कोई नहीं?' </ C: if> अन्यथा चर "myValue" का मूल्यांकन नहीं किया गया है।
एंड्रियास

2
${fn:contains({1,2,4,8}, 2)}

या

  <c:if test = "${fn:contains(theString, 'test')}">
     <p>Found test string<p>
  </c:if>

  <c:if test = "${fn:contains(theString, 'TEST')}">
     <p>Found TEST string<p>
  </c:if>

0

यदि आप EL 3.0+ का उपयोग कर रहे हैं , तो इस मामले में सबसे अच्छा तरीका यह है कि यह किसी अन्य विषय में समझाया गया उत्तर है :

एक के लिए 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[]सरणी (सरणी) के लिए, आपको कम से कम EL 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>

यदि आप अभी तक EL 3.0 पर नहीं हैं, तो आपको एक कस्टम EL फ़ंक्शन बनाना होगा। [...]


-1

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

<%@ 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

मुझे यह समाधान आश्चर्यजनक लगा।

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%
   ArrayList list = new ArrayList();
   list.add("one");
   list.add("two");
   list.add("three");
%>
<c:set var="list" value="<%=list%>" />
<html>
<body>
        My list is ${list}<br/>
<c:if test='${fn:contains(list, "two")}'>
        My list contains two <br/>
</c:if>
<c:if test='${fn:contains(list, ",")}'>
        My list contains , 
</c:if>
</body>
</html>

ऊपर दिए गए कोड के लिए आउटपुट है

मेरी सूची [एक, दो, तीन]

मेरी सूची में दो हैं

मेरी सूची में शामिल हैं,

मुझे उम्मीद है कि यह किसी की मदद करता है।


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

यह मेरे लिए ठीक काम करता है।


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

2
रैमरिमॉन की चेतावनी से अवगत होने के कारण, यह उत्तर मेरे सटीक उपयोग के मामले से मेल खाता था।
कोडरूट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.