হ্যাশম্যাপ কীগুলির মাধ্যমে নিখরচায় ফ্রিমার্কার


87

ফ্রিমার্কারের দুটি সংগ্রহের ডেটাটাইপ, তালিকা এবং হ্যাশম্যাপ রয়েছে হ্যাশম্যাপ কীগুলি পুনরুক্ত করার উপায় কি আমরা তালিকার সাথে করি?

সুতরাং যদি আমার কাছে ডেটা সহ একটি ভ্যার থাকে তবে বলতে পারি:

user : {
  name : "user"
  email : "looser@everything.com"
  homepage : "http://nosuchpage.org"
}

আমি ব্যবহারকারীর সমস্ত সম্পত্তি তাদের মান সহ মুদ্রণ করতে চাই। এটি অবৈধ, তবে লক্ষ্যটি পরিষ্কার:

<#list user.props() as prop>
  ${prop} = ${user.get(prop)}
</#list>

উত্তর:


106

সম্পাদনা করুন: FreeMarker 2.3.25 এবং এর বেশি দিয়ে এই সমাধানটি ব্যবহার করবেন না, বিশেষত নয় .get(prop)। অন্যান্য উত্তর দেখুন।

আপনি অন্তর্নির্মিত কীগুলি ফাংশনটি ব্যবহার করেন , উদাহরণস্বরূপ এটির কাজ করা উচিত:

<#list user?keys as prop>
    ${prop} = ${user.get(prop)}
</#list>  

4
আমার উত্তরটিতে পোস্ট করা লিঙ্কটিতে চিত্রিত হিসাবে সিন্টেক্সটি সর্বশেষতম সংস্করণে আলাদা। আমি বুঝতে পেরেছি এটি একটি পুরানো প্রশ্ন, তবে এটি গুগলে উচ্চ স্থান পেয়েছে।
নিক স্পেস্ক

26
কেবল একটি নোট - আপনি ${user[prop]}শর্টহ্যান্ড হিসাবে ব্যবহার করতে পারেন
বোঝো

এটি একটি পারফরম্যান্স ফাঁস: প্রতিটি কীটির জন্য এর মানটি পুনরুদ্ধার করা দরকার। এন্ট্রিসেটের মাধ্যমে আইট্রেট করার ক্ষেত্রে () সমস্যা নেই।
জেফ্রি ডি স্মেট

4
$ {ব্যবহারকারী [ঠেকনা]} হওয়া উচিত
dns

কনফিগারেশনের ডিফল্টগুলি user[prop]যতটা propএকটা String(অন্যথায় আপনার user?api.get(prop)বর্তমানে প্রয়োজন ) হিসাবে কাজ করে, তবে সাবধান থাকুন, কিছু ফ্রেমওয়ার্ক (যেমন স্ট্রুটস, আমি বিশ্বাস করি) একটি এখন অবচয়যুক্ত সেটআপ ব্যবহার করে যেখানে পদ্ধতির নামগুলি Mapকীগুলির সাথে মেশানো হয় , এবং তাই যদি মানটির সাথে propsঘটে তবে userজাভা অবজেক্টে কোনও পদ্ধতির নাম হোন, আপনি কী বোঝাতে চেয়েছেন তার পরিবর্তে আপনি পদ্ধতিটি পান। এই কারণেই এই লিগ্যাসি সেটআপগুলিতে তারা সর্বদা ব্যবহার করে user.get(prop)
ddekany

52

এফওয়াইআই, দেখে মনে হচ্ছে মানগুলি পুনরুদ্ধারের সিনট্যাক্স অনুসারে পরিবর্তিত হয়েছে:

http://freemarker.sourceforge.net/docs/ref_builtins_hash.html

<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

4
এই সিনট্যাক্সটি কীভাবে আলাদা?
পার্কার

4
ভাল উত্তর ;-) নোট করুন যে আপনার মানটি প্রিন্ট করার সময় আপনাকে শূন্যতার জন্য পরীক্ষা করতে হবে, <# আইফ [কী] ??> $ {কী} = $ {এইচ [কী]}; </ # if>
ব্র্যাড পার্কগুলি

4
সিনট্যাক্সটি পরিবর্তন করা হয়নি। উভয়ই [key]এবং .get(key)প্রাচীন কাল থেকেই বিদ্যমান। .get(key)এফটিএল-এর জন্য কোনও বিশেষ নয়, এটি কেবল সেই সর্বজনীন জাভা পদ্ধতিটিকে কল করে। তবে আপনি কেবল তখনই এটি ব্যবহার করতে পারবেন যদি ফ্রিমার্কার Mapপদ্ধতিগুলি প্রকাশের জন্য কনফিগার করা হয়েছিল ।
ddekany

পুনরাবৃত্তি করার সময়, আমি পদ্ধতিগুলি (getClass, হ্যাশকোড, সমান, পেতে, টো স্ট্রিং, ক্লাস) পাই ... তবে আমি 'আইডি' এর মতো কোনও বৈশিষ্ট্য দেখছি না, যা আমি একটি তালিকা পেতে চাই। সেই হ্যাশ থেকে নন-মেথড প্রোপার্টিগুলির তালিকা পেতে কীভাবে কোনও পরামর্শ? এই সম্পত্তিগুলির নামগুলি আমার জানা উচিত। : |
ম্যাক্সরকেট

49

২.৩.২৫ সাল থেকে এটি এটি করুন:

<#list user as propName, propValue>
  ${propName} = ${propValue}
</#list>

নোট করুন যে এটি নন-স্ট্রিং কীগুলির সাথেও কাজ করে (বিপরীতে map[key], যা map?api.get(key)তখন লিখতে হয়েছিল )।

২.৩.২৫ এর আগে মান সমাধান ছিল:

<#list user?keys as prop>
  ${prop} = ${user[prop]}
</#list>

তবে কিছু সত্যই পুরানো ফ্রিমার্কার সংহতকরণগুলি একটি অদ্ভুত কনফিগারেশন ব্যবহার করে, যেখানে সর্বজনীন Mapপদ্ধতিগুলি (যেমন getClass) কী হিসাবে উপস্থিত হয়। যা ঘটেছিল এমন কোনও খাঁটি BeansWrapper(পরিবর্তে DefaultObjectWrapper) যার simpleMapWrapperসম্পত্তি রেখে গিয়েছিল তারা ব্যবহার করবে false। আপনার যেমন সেটআপ এড়ানো উচিত, কারণ এটি পদ্ধতিগুলিকে প্রকৃত Mapএন্ট্রিগুলির সাথে মিশ্রিত করে । কিন্তু যদি আপনি এই ধরনের দুর্ভাগ্যজনক সেটআপ মধ্যে চালানো পথে অবস্থা অব্যাহতি যেমন উদ্ভাসিত জাভা পদ্ধতি ব্যবহার করছে, user.entrySet(), user.get(key), ইত্যাদি, এবং মত টেমপ্লেট ভাষা নির্মান ব্যবহার ?keysবা user[key]


এটি পুরোপুরি কাজ করে। তবে, আমি স্প্রিংসোর্স আইডিইতে ত্রুটিগুলি দেখছি। এটি ঠিক করার জন্য কোন ধারণা? ধন্যবাদ
হার্শবম্ব

@ হার্শবম্ব কি ত্রুটি? এটি কি পুরানো ফ্রিমার্কার প্লাগইনটি সম্ভবত ব্যবহার করে, যা পুরানো ফ্রিমার্কার সংস্করণ সহ আসে?
ddekany

এমন ভাববেন না। Jboss সরঞ্জাম থেকে সর্বশেষতম ডাউনলোড করেছেন। আমি অন্য মেশিনে চেষ্টা করব এবং আপনাকে জানাবো।
হার্শবম্ব

@ হার্সাব্বম্ব যদি আপনি এর মতো কিছু প্রবেশ করেন ${x?nosuchthing}এবং আপনি এটির উপরে ঘোরাফেরা করেন তবে দেখানো ত্রুটি বার্তাটি কোন ফ্রিমার্কার সংস্করণটি ব্যবহার করবে তা জানিয়ে দেবে। এটা হওয়া উচিত 2.3.25-incubating
ddekany

আজব, আমি কেবল ম্যাকের চেষ্টা করেছি এবং সমস্যাটির প্রতিলিপি করতে পারি না। ইস্যুটি কেবল আমার ভিএম এর সাথে রয়েছে বলে মনে হচ্ছে। আমি জার সংস্করণে একবার দেখে নেব। তবে এটি সম্পাদকের মধ্যে কেবল একটি ত্রুটি, তবে কোডটি কার্যকরভাবে কার্যকর করা হয়েছিল।
হার্শবম্ব

12

যদি এক্সপোজ.এসএফই বা এক্সপোজ.এল এর এক্সপোজার স্তরের সাথে বিনস্র্যাপার ব্যবহার করে থাকেন তবে প্রবেশের সেটটি পুনরাবৃত্তি করার স্ট্যান্ডার্ড জাভা পদ্ধতির নিয়োগ করা যেতে পারে:

উদাহরণস্বরূপ, নিম্নলিখিতগুলি ফ্রিমার্কারে কাজ করবে (কমপক্ষে সংস্করণ ২.৩.১৯):

<#list map.entrySet() as entry>  
  <input type="hidden" name="${entry.key}" value="${entry.value}" />
</#list>

স্ট্রুটস 2-তে, উদাহরণস্বরূপ, বিয়ানওয়্যার্পারের একটি এক্সটেনশানটি এক্সপোজার লেভেলের সাথে ডিফল্ট হিসাবে পুনরাবৃত্তির এই পদ্ধতিটিকে অনুমোদিত করতে ব্যবহৃত হয়।


4
আপনি কি আসলে এটি চেষ্টা করেছেন? কারণ আমি InvalidReferenceExceptionযখন চেষ্টা করেছিলাম তখন map?keysকাজ করেছি an
কেডগ্রিগরি

4
এটি কেবলমাত্র freemarker.ext.beans.BeansWrapperবস্তু মোড়ক হিসাবে ব্যবহার করার সময় কাজ করে । অন্যথায় Mapগুলি স্বয়ংক্রিয়ভাবে SimpleHashএমন কোনও সামগ্রীতে আবৃত হবে যা সমর্থন করে না #entrySet()। ( freemarker.sourceforge.net/docs/api/freemarker/template/… দেখুন )
কোরাাকটর

আপনি সঠিক, এবং আমি আপনার মন্তব্য প্রতিফলিত করতে আমার উত্তর আপডেট করেছি। ভাল খুঁজছেন!
রিস

4
উপরেরগুলি এফটিএল-র ভিতরে তৈরি হ্যাশটির পক্ষে ভাল কাজ করবে না বিশেষত যদি আপনি বিনআরপারের সাথে স্প্রিং ফ্রিমার্কার রিসলভার ব্যবহার করছেন। Ftl ফাইলের ভিতরে ঘোষিত হ্যাশটি মোড়ানো হয়নি এবং এখনও কী ব্যবহার করে কেবল একটি হ্যাশ পুনরাবৃত্ত হবে।
উপেক্ষা করুন

4
খাঁটি ব্যবহার করবেন না BeansWrapper, কমপক্ষে তার ডিফল্টগুলির সাথে নয়, কোথায় simpleMapWrapperরয়েছে false। এটি পদ্ধতির নামের সাথে কীগুলি মিশ্রিত করায় এটি খুব বিভ্রান্তিকর হয়। যদি আপনাকে কল করতে হয় entrySet(), কেবলমাত্র "ক্লিন" অবজেক্ট র‌্যাপারটি ডিফল্টর মতো ব্যবহার করুন map?api.entrySet()এবং কীগুলির পরিবর্তে আপনার জাভা এপিআইয়ের অ্যাক্সেসের প্রয়োজন হলে লিখুন ।
ddekany

2

অবজেক্টস অবলম্বন

যদি আপনার মানচিত্র কীগুলি কোনও স্ট্রিং নয় এবং অবজেক্ট হয় তবে আপনি ফ্রিমার্কার ব্যবহার করে এটি পুনরাবৃত্তি করতে পারেন।

1) মানচিত্রটিকে নিয়ামকের তালিকায় রূপান্তর করুন:

List<Map.Entry<myObjectKey, myObjectValue>> convertedMap  = new ArrayList(originalMap.entrySet());

2) ফ্রিমার্কার টেম্পলেটে মানচিত্রটি বিশ্লেষণ করুন, কীতে বস্তুর অ্যাক্সেস করুন এবং মানটিতে অবজেক্ট করুন:

<#list convertedMap as item>
    <#assign myObjectKey = item.getKey()/>
    <#assign myObjectValue = item.getValue()/>
    [...]
</#list>

1

সম্পূর্ণতার জন্য, এটি ফ্রিমার্কারে খালি সংগ্রহের একটি সুনির্দিষ্ট সাম্প্রতিক সাম্প্রতিক সময়ে উল্লেখ করার মতো।

সুতরাং কোনও মানচিত্র পুনরাবৃত্তি করার সবচেয়ে সুবিধাজনক উপায় হ'ল:

<#list tags>
<ul class="posts">
    <#items as tagName, tagCount>
        <li>{$tagName} (${tagCount})</li>
    </#items>
</ul>
<#else>
    <p>No tags found.</p>
</#list>

আর <#if ...>মোড়ক নেই।


সেরা উত্তর. ধন্যবাদ.
Egemen

0

আপনি আপনার জাভা প্রোগ্রামটিতে যে কীটি সেট করেছেন তা অ্যাক্সেস করতে আপনি একটি একক উদ্ধৃতি ব্যবহার করতে পারেন।

আপনি যদি জাভাতে এটির মতো মানচিত্র সেট করেন

Map<String,Object> hash = new HashMap<String,Object>();
hash.put("firstname", "a");
hash.put("lastname", "b");

Map<String,Object> map = new HashMap<String,Object>();
map.put("hash", hash);

তারপরে আপনি ফ্রিমার্কারে 'হ্যাশ'-এর সদস্যদের এভাবে অ্যাক্সেস করতে পারবেন -

${hash['firstname']}
${hash['lastname']}

আউটপুট:

a
b

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