EL পূর্ণসংখ্যা কী দ্বারা মানচিত্রের মান অ্যাক্সেস করে


85

আমার পূর্ণসংখ্যার দ্বারা চিহ্নিত একটি মানচিত্র রয়েছে। EL ব্যবহার করে, কীভাবে আমি এর কী দ্বারা কোনও মান অ্যাক্সেস করতে পারি?

Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

আমি ভেবেছিলাম এটি কার্যকর হবে তবে এটি কার্যকর হয় না (যেখানে মানচিত্রটি ইতিমধ্যে অনুরোধের বৈশিষ্ট্যে রয়েছে):

<c:out value="${map[1]}"/>

অনুসরণ করুন: আমি সমস্যাটি সন্ধান করেছি। স্পষ্টতই ${name[1]}একটি হিসাবে একটি নম্বর সহ একটি মানচিত্র লক করা হয় Long। আমি এই মূর্ত আউট যখন আমি পরিবর্তিত HashMapকরতে TreeMapএবং ত্রুটি গৃহীত:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

আমি যদি আমার মানচিত্রটিকে পরিবর্তন করে থাকি তবে:

Map<Long, String> map = new HashMap<Long, String>();
map.put(1L, "One");

তারপরে ${name[1]}"ওয়ান" প্রদান করে। এর সাথে কি? <c:out>দীর্ঘ হিসাবে সংখ্যার সাথে কেন আচরণ করে । আমার কাছে বিপরীতমুখী মনে হয় (যেহেতু দীর্ঘের চেয়ে বেশি ব্যবহৃত হয়)।

সুতরাং আমার নতুন প্রশ্নটি হ'ল, কোনও Integerমান দ্বারা কোনও মানচিত্র অ্যাক্সেস করার জন্য কি কোনও এলএল স্বরলিপি রয়েছে ?

উত্তর:


117

প্রাথমিক উত্তর (EL 2.1, মে 2009)

এই জাভা ফোরাম থ্রেডে উল্লিখিত হিসাবে :

মূলত অটোবক্সিং মানচিত্রে একটি পূর্ণসংখ্যার বস্তু রাখে। অর্থাত:

map.put(new Integer(0), "myValue")

EL (এক্সপ্রেশন ভাষা) 0 টি লং হিসাবে মূল্যায়ন করে এবং মানচিত্রে কী হিসাবে দীর্ঘ হিসাবে সন্ধান করে। অর্থাৎ এটি মূল্যায়ন করে:

map.get(new Long(0))

যেহেতু Longকখনই কোনও Integerবস্তুর সমান হয় না , এটি মানচিত্রে প্রবেশের সন্ধান পায় না।
সংক্ষেপে এটি।


২০০৯ সালের মে থেকে আপডেট (EL 2.2)

ডিসেম্বর 2009 JSP 2.2 / জাভা EE 6 এল 2.2 প্রবর্তনের দেখেছি একটি সঙ্গে, এল 2.1 তুলনায় কয়েক পার্থক্য
মনে হয় (" EL এক্সপ্রেশনটি দীর্ঘকাল পূর্ণসংখ্যাকে পার্সিং করে ") যে:

আপনি পদ্ধতি কল করতে পারেন intValueউপর Longবস্তু স্ব এল 2.2 ভিতরে :

<c:out value="${map[(1).intValue()]}"/>

(এছাড়াও মধ্যে নিম্নে উল্লেখিত এটা একটা ভাল কার্যসংক্রান্ত এখানে হতে পারে Tobias Liefke এর উত্তর )


আসল উত্তর:

EL নিম্নলিখিত র‍্যাপারগুলি ব্যবহার করে:

Terms                  Description               Type
null                   null value.               -
123                    int value.                java.lang.Long
123.00                 real value.               java.lang.Double
"string" ou 'string'   string.                   java.lang.String
true or false          boolean.                  java.lang.Boolean

জেএসপি পৃষ্ঠাটি এটি প্রদর্শন করে:

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

 <%@ page import="java.util.*" %>

 <h2> Server Info</h2>
Server info = <%= application.getServerInfo() %> <br>
Servlet engine version = <%=  application.getMajorVersion() %>.<%= application.getMinorVersion() %><br>
Java version = <%= System.getProperty("java.vm.version") %><br>
<%
  Map map = new LinkedHashMap();
  map.put("2", "String(2)");
  map.put(new Integer(2), "Integer(2)");
  map.put(new Long(2), "Long(2)");
  map.put(42, "AutoBoxedNumber");

  pageContext.setAttribute("myMap", map);  
  Integer lifeInteger = new Integer(42);
  Long lifeLong = new Long(42);  
%>
  <h3>Looking up map in JSTL - integer vs long </h3>

  This page demonstrates how JSTL maps interact with different types used for keys in a map.
  Specifically the issue relates to autoboxing by java using map.put(1, "MyValue") and attempting to display it as ${myMap[1]}
  The map "myMap" consists of four entries with different keys: A String, an Integer, a Long and an entry put there by AutoBoxing Java 5 feature.       

  <table border="1">
    <tr><th>Key</th><th>value</th><th>Key Class</th></tr>
    <c:forEach var="entry" items="${myMap}" varStatus="status">
    <tr>      
      <td>${entry.key}</td>
      <td>${entry.value}</td>
      <td>${entry.key.class}</td>
    </tr>
    </c:forEach>
</table>

    <h4> Accessing the map</h4>    
    Evaluating: ${"${myMap['2']}"} = <c:out value="${myMap['2']}"/><br>
    Evaluating: ${"${myMap[2]}"}   = <c:out value="${myMap[2]}"/><br>    
    Evaluating: ${"${myMap[42]}"}   = <c:out value="${myMap[42]}"/><br>    

    <p>
    As you can see, the EL Expression for the literal number retrieves the value against the java.lang.Long entry in the map.
    Attempting to access the entry created by autoboxing fails because a Long is never equal to an Integer
    <p>

    lifeInteger = <%= lifeInteger %><br/>
    lifeLong = <%= lifeLong %><br/>
    lifeInteger.equals(lifeLong) : <%= lifeInteger.equals(lifeLong) %> <br>

সুতরাং পূর্ণসংখ্যা হিসাবে কোনও সংখ্যা বাড়ানোর জন্য EL পাওয়ার কোনও উপায় নেই?
স্টিভ কুও

4
@ স্টিভ: প্রকৃতপক্ষে, ইএল এটি সমর্থন করে বলে মনে হচ্ছে না।
ভোনসি

আমি গুগল অনুসন্ধান থেকে এই প্রশ্ন এবং উত্তর পেয়েছি। নিশ্চিতভাবেই, আমি মানচিত্র <ইন্টিজার, স্ট্রিং> ম্যাপ <লং, স্ট্রিং> এ সরে যাওয়ার সাথে সাথে আমি আমার জেএসপি পৃষ্ঠাতে থাকা ইএলটি ব্যবহার করে এটি থেকে টানতে সক্ষম হয়েছি। ধন্যবাদ !!
জন মুন্ছ

@ স্টিভ: এটি সম্ভব - আমার উত্তরটি দেখুন
টোবিয়াস লিফকে

@ স্টেভকুও এটি সত্যই সম্ভব হওয়া উচিত। আমি এখন বুঝতে পারি যে 6 বছরের পুরানো উত্তরটি তখন লেখা হয়েছিল যখন EL 2.2 এখনও প্রকাশিত হয়নি। আমি উত্তর সম্পাদনা করেছি এবং আপডেট করেছি।
ভনসি

11

উপরোক্ত মন্তব্য ছাড়াও আরও একটি সহায়ক ইঙ্গিতটি তখন যখন আপনি কিছু ভেরিয়েবলের মধ্যে যেমন একটি অনুরোধ প্যারামিটারের একটি স্ট্রিং মান ধারণ করে। এই ক্ষেত্রে, এটি পাস করার ফলে জেএসটিএল স্টিং হিসাবে "1" বলার মান সন্ধান করবে এবং মানচিত্রের হ্যাশম্যাপে এর মতো কোনও মিল পাওয়া যায়নি।

এর কাছাকাছি যাওয়ার একটি উপায় হ'ল এটির মতো কিছু করা।

<c:set var="longKey" value="${param.selectedIndex + 0}"/>

এটি এখন লম্বা অবজেক্ট হিসাবে বিবেচিত হবে এবং মানচিত্রের মানচিত্র বা যে কোনও কিছু যুক্ত থাকা অবস্থায় এটি কোনও বস্তুর সাথে মিলের সুযোগ পাবে।

তারপরে, যথারীতি এর মতো কিছু দিয়ে চালিয়ে যান

${map[longKey]}

10

আপনি লং থেকে সমস্ত ফাংশন ব্যবহার করতে পারেন, যদি আপনি "(" ")" তে নম্বরটি রাখেন। এইভাবে আপনি দীর্ঘকে একটি আন্তঃকে নিক্ষেপ করতে পারেন:

<c:out value="${map[(1).intValue()]}"/>

আমি আপনার উত্তর অবিলম্বে দেখিনি। +1 আমি আরও দৃশ্যের জন্য আমার উত্তরটিতে সেই সম্ভাবনাটি অন্তর্ভুক্ত করেছি এবং নথিভুক্ত করেছি।
ভনসি

3

উপরের পোস্টের উপর ভিত্তি করে আমি এটি চেষ্টা করেছি এবং এটি ঠিকঠাকভাবে কাজ করেছে আমি ম্যাপ এ এর ​​কী হিসাবে মানচিত্র বি এর মানটি ব্যবহার করতে চেয়েছিলাম:

<c:if test="${not empty activityCodeMap and not empty activityDescMap}">
<c:forEach var="valueMap" items="${auditMap}">
<tr>
<td class="activity_white"><c:out value="${activityCodeMap[valueMap.value.activityCode]}"/></td>
<td class="activity_white"><c:out value="${activityDescMap[valueMap.value.activityDescCode]}"/></td>
<td class="activity_white">${valueMap.value.dateTime}</td>
</tr>
</c:forEach>
</c:if>

3

যদি আপনি কীগুলির Mapসাথে কেবল এমনটি ঘটে যা Integerআপনি পরিবর্তন করতে পারবেন না, আপনি একটিতে রূপান্তর করতে একটি কাস্টম ইএল ফাংশন লিখতে Longপারেন Integer। এটি আপনাকে এমন কিছু করার অনুমতি দেবে:

<c:out value="${map[myLib:longToInteger(1)]}"/>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.