জেএসটিএল-এ তালিকার তালিকাটি অন্তর্ভুক্ত করুন string


89

জেএসপিতে নির্দিষ্ট মান উপস্থিত থাকলে আমার একটি উপাদান লুকানো দরকার

মানগুলি একটি তালিকায় সংরক্ষিত থাকে তাই আমি চেষ্টা করেছি:

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

কিন্তু, এটি কাজ করে না।

যদি কোনও তালিকায় জেএসটিএলে একটি মান থাকে, তালিকা এবং মানগুলি স্ট্রিং থাকে তবে আমি কীভাবে মূল্যায়ন করব।


17
নোট করুন যে প্রদত্ত বাক্য গঠনটি ইএল ২.২ (যেটি সার্লেট ৩.০ / জেএসপি ২.২ এর অংশ হিসাবে আনা হয়েছিল যা ডিসেম্বর ২০০৯ এ প্রকাশিত হয়েছিল) থেকে উদ্দিষ্ট হিসাবে কাজ করে।
বালাসসি

উত্তর:


70

দুঃখের বিষয়, আমি মনে করি যে জেএসটিএল এটি নির্ধারণের জন্য সমস্ত উপাদানগুলির মাধ্যমে একটি পুনরাবৃত্তি ছাড়া কিছুই সমর্থন করে না। অতীতে, আমি মূল ট্যাগ লাইব্রেরিতে 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>

এই রান করার পরে, মাইলিস্টে মাইভ্যালু থাকলে $ {ধারণকৃত "" সত্য "এর সমান হবে।


10
তালিকাটি যদি ছোট হয় তবে দুর্দান্তভাবে কাজ করে। এইভাবে এটি করার জন্য একটি পারফরম্যান্স ব্যয় রয়েছে তা কেবল উপলব্ধি করুন।
চিআই

হ্যাঁ, আপনি যদি যথেষ্ট উচ্চ হন তবে সেখানেই থাকতেন। আমি এটি 10-20 জিনিস সংগ্রহের জন্য ব্যবহার করেছি এবং কোনও পারফরম্যান্স সমস্যা নেই। আমার কাছে যে জিনিসটি সবচেয়ে খারাপ মনে হচ্ছে তা হ'ল জেএসটিএল-এর লাইনের সংখ্যা। তবুও, আমি মনে করি আপনার নিজের টিএলডি স্থাপন না করেই এটিই একমাত্র উপায় (যা খুব বেশি কঠিন নয় এবং এটি খুব ভালভাবেই মূল্যবান হতে পারে)।
কালেব ব্রাসি

98

এটি যাচাই করার জন্য কোনও অন্তর্নির্মিত বৈশিষ্ট্য নেই - আপনি যা করবেন তা হ'ল আপনার নিজস্ব টিএলডি ফাংশন যা একটি তালিকা এবং একটি আইটেম গ্রহণ করে এবং তালিকার অন্তর্ভুক্ত রয়েছে () পদ্ধতিটিকে কল করে। যেমন

//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>

তারপরে আপনার ক্লাস নামে একটি শ্রেণি তৈরি করুন এবং উপরের স্বাক্ষর সহ একটি স্ট্যাটিক পদ্ধতি যুক্ত করুন। আমি নিশ্চিত যে এই পদ্ধতির বাস্তবায়নটি বেশ স্ব-বর্ণনামূলক:

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>

ট্যাগটি সাইটের যে কোনও জেএসপি থেকে ব্যবহার করা যেতে পারে।

সম্পাদনা করুন: tld ফাইল সম্পর্কিত আরও তথ্য - আরও তথ্য এখানে


4
আমি ব্যবহার সুপারিশ Collectionপরিবর্তে Listমত এটি একই কাজ কিন্তু সমর্থন আরো সংগ্রহে ধরনের - taglib মধ্যে Setগুলি
রালফ

28

এটি করার আর একটি উপায় হ'ল Map (HashMap)কী, মান যুক্তগুলি আপনার বস্তুর প্রতিনিধিত্ব করে using

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

জেএসটিএলে

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

জোড় মানচিত্রে উপস্থিত থাকলে এটি সত্য হওয়া উচিত


4
এটিও আমার পছন্দসই উপায়, ভিউ মডেলটিতে হ্যাশম্যাপস সেটআপ করুন যা আমার একটি দর্শনে প্রয়োজন। তারা EL সিনট্যাক্সের সাথে দুর্দান্তভাবে সংহত করে এবং অনুসন্ধানের সময় বিদ্যুৎস্পৃষ্ট হয়।
বরিস বি।

আরও একটি জিনিস, যদি কী উপস্থিত থাকে তবে মানটি শূন্য বা খালি হয় তবে তা মিথ্যা ফিরে আসবে।
জাই

4
অথবা যদি মানচিত্রে বুলেটিয়ান রয়েছে 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")এবং যদি এটি না হয় তবে আপনি অন্য পদ্ধতির আরও ভাল ব্যবহার করতে চাইছেন।


4
এটি সঠিক পদ্ধতির নয়। এটি মূলত এমন আচরণ করবে 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> অন্যথায় চলকটি "মাইভ্যালু" মূল্যায়ন করা হয় না।
Andreas

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 এ না থেকে থাকেন তবে আপনাকে একটি কাস্টম ইএল ফাংশন তৈরি করতে হবে। [...]


-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
উভয় উপাদানকে স্ট্রিংয়ে রূপান্তর করার পরে এটি চেক করছে। তালিকাটি স্ট্রিংয়ে রূপান্তরিত হয় এবং প্রতিটি উপাদান ভিত্তিতে পরীক্ষিত হয় না। যদি টাস্ক। সাবস্ক্রাইবারগুলি একটি তালিকা হয় ["এক", "দুই", "বিশ" "] এটি হবে: গ্রাহকের পক্ষে সত্য =" এক "(দ্বিগুণ মিলছে) গ্রাহকের জন্য মিথ্যা =" তিন "(কোনও মিল নেই) গ্রাহক = এর জন্য সত্য নয় "বিশ" (যা আপনি যা খুঁজছেন তা নয়)
রিকার্ডো মেরিমন

4
রিমারনের সতর্কতা সম্পর্কে সচেতন হওয়ার কারণে, এই উত্তরটি আমার সঠিক ব্যবহারের সাথে মেলে।
কোডেরিটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.