জেএসপিতে হ্যাশম্যাপের মাধ্যমে কীভাবে লুপ করবেন?


146

আমি কীভাবে HashMapজেএসপিতে লুপ করব ?

<%
    HashMap<String, String> countries = MainUtils.getCountries(l);
%>

<select name="country">
    <% 
        // Here I need to loop through countries.
    %>
</select>

17
যাইহোক, একটি HashMapপ্রকৃতির নিয়মনীতিবিহীন। আপনি কি নিশ্চিত যে আপনার প্রয়োজন নেই TreeMap(কী দ্বারা স্বয়ংক্রিয় ধরণের সাজানো) বা LinkedHashMap(সন্নিবেশ ক্রম বজায় রাখা)?
বালুসসি

উত্তর:


308

আপনি সাধারণ জাভা কোডে যেমন করতেন ঠিক তেমনভাবে।

for (Map.Entry<String, String> entry : countries.entrySet()) {
    String key = entry.getKey();
    String value = entry.getValue();
    // ...
}

তবে , scriptlets (JSP ফাইল, যাদের কাঁচা জাভা কোড <% %>জিনিষ) একটি বলে মনে করা হয় দরিদ্র অনুশীলন । আমি জেএসটিএল ইনস্টল করার পরামর্শ দিচ্ছি ( জেআর ফাইলটি কেবল ভিতরে ফেলে দিন /WEB-INF/libএবং জেএসপির শীর্ষে প্রয়োজনীয় ট্যাগলিবগুলি ঘোষণা করুন )। <c:forEach>এটিতে একটি ট্যাগ রয়েছে যা অন্যদের মধ্যে পুনরাবৃত্তি করতে পারে Map। প্রতিটি পুনরাবৃত্তি আপনাকে একটি Map.Entryফিরে দেয় যা ঘুরে ফিরে getKey()এবং getValue()পদ্ধতিগুলি।

এখানে একটি প্রাথমিক উদাহরণ:

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

<c:forEach items="${map}" var="entry">
    Key = ${entry.key}, value = ${entry.value}<br>
</c:forEach>

সুতরাং আপনার নির্দিষ্ট সমস্যা নিম্নলিখিত হিসাবে সমাধান করা যেতে পারে:

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

<select name="country">
    <c:forEach items="${countries}" var="country">
        <option value="${country.key}">${country.value}</option>
    </c:forEach>
</select>

আপনার পছন্দসই সুযোগে স্থান দেওয়ার জন্য একটি Servletবা একটি দরকার । এই তালিকা অনুরোধ ভিত্তিক হতে অনুমিত হয়, তাহলে ব্যবহার এর :ServletContextListener${countries}ServletdoGet()

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    Map<String, String> countries = MainUtils.getCountries();
    request.setAttribute("countries", countries);
    request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
}

অথবা এই তালিকা, তারপর ব্যবহার একটি অ্যাপ্লিকেশন-চওড়া ধ্রুবক হতে অনুমিত হয় যদি ServletContextListener's contextInitialized()যাতে এটি শুধুমাত্র একবার লোড হবে এবং মেমরি রাখা:

public void contextInitialized(ServletContextEvent event) {
    Map<String, String> countries = MainUtils.getCountries();
    event.getServletContext().setAttribute("countries", countries);
}

উভয় ক্ষেত্রেই countriesউপলব্ধ হবে এল দ্বারা ${countries}

আশাকরি এটা সাহায্য করবে.

আরো দেখুন:


2
@ খুউ: হ্যাঁ, আপনি অধিবেশনগুলিতে বৈশিষ্ট্যগুলিও রাখতে পারেন। আপনি কেবল একাধিক সেশনে অ্যাপ্লিকেশন প্রশস্ত ডেটা কেন নকল করতে চান তা আমি কেবল দেখতে পাই না।
বালুসসি

আমি সেশন-ভিত্তিক তথ্য ক্ষেত্রে মনে করি। খুব সুন্দর ব্যাখ্যার জন্য ধন্যবাদ।
Khue Vu

আমি নিশ্চিত উত্তরটি সুস্পষ্ট তবে তবে - স্ক্রিপ্টলেটগুলি কেন খারাপ অনুশীলন হিসাবে বিবেচিত হয়? উত্তরাধিকারের আবেদন রক্ষণাবেক্ষণের কারণে জেএসটিএলের অনুপস্থিতিতে, এটি আমার একমাত্র বিকল্প।
Zibbobz

@ জিববোজ: "দুর্বল অনুশীলন" পাঠ্যটি একটি লিঙ্ক। এটিতে ক্লিক করুন।
বালুসসি 25'18

1

লুপের মধ্যে আপনি কী অর্জন করতে চান তার উপর নির্ভর করে এর পরিবর্তে এর একটিতে পুনরাবৃত্তি করুন:

  • countries.keySet()
  • countries.entrySet()
  • countries.values()

হ্যাঁ, এটির সাথে আমি এল কী সেট পেয়েছি তবে আমি কীভাবে এটি এইচটিএমএল এর জন্য একটি নির্বাচিত ক্ষেত্রে একীভূত করতে পারি?
blub

6
এটি জেএসপি
তাউফিক মোহিত

0

নীচের কোডটি আমার জন্য কাজ করে

প্রথমে আমি partnerTypesMapসার্ভার সাইডে নীচের মত সংজ্ঞা দিয়েছি ,

Map<String, String> partnerTypes = new HashMap<>();

এর সাথে মান যুক্ত করার পরে আমি বস্তুটি এতে যুক্ত করেছিলাম model,

model.addAttribute("partnerTypesMap", partnerTypes);

পৃষ্ঠাগুলি রেন্ডার করার সময় আমি foreachএকে একে মুদ্রণের জন্য নীচে ব্যবহার করি ।

<c:forEach items="${partnerTypesMap}" var="partnerTypesMap">
      <form:option value="${partnerTypesMap['value']}">${partnerTypesMap['key']}</form:option>
</c:forEach>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.