कैसे JSP में एक HashMap के माध्यम से पाश करने के लिए?


146

मैं HashMapJSP में एक के माध्यम से कैसे लूप कर सकता हूं ?

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

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

17
वैसे, HashMapस्वभाव से अयोग्य है। क्या आप निश्चित हैं कि आपको ज़रूरत नहीं है TreeMap(कुंजी द्वारा स्वचालित प्रकार) या LinkedHashMap(प्रविष्टि क्रम बनाए रखता है)?
बालुस 21

जवाबों:


308

ठीक उसी तरह जैसे आप सामान्य जावा कोड में करते हैं।

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

हालांकि , स्क्रिप्टलेट्स (जेएसपी फाइलों में कच्चा जावा कोड, उन <% %>चीजों) को एक खराब अभ्यास माना जाता है । मैं JSTL स्थापित करने की सलाह देता हूं (बस JAR फ़ाइल को ड्रॉप करें /WEB-INF/libऔर JSP के ऊपर आवश्यक टैगलिब घोषित करें )। यह एक <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या एक की आवश्यकता है। यदि इस सूची को अनुरोध-आधारित माना जाता है, तो 's : का उपयोग करें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
@ शु: हाँ, आप सत्र में विशेषताएँ भी डाल सकते हैं। मैं केवल यह नहीं देखता कि आप कई सत्रों में एप्लिकेशन वाइड डेटा को डुप्लिकेट क्यों करना चाहते हैं।
बालुस्क

मुझे लगता है कि सत्र-आधारित जानकारी के मामले में। बहुत अच्छी व्याख्या के लिए धन्यवाद।
खू वु।

मुझे यकीन है कि उत्तर स्पष्ट है लेकिन - स्क्रिप्ट को खराब व्यवहार क्यों माना जाता है? विरासत आवेदन को बनाए रखने के कारण जेएसटीएल की अनुपस्थिति में, यह मेरा एकमात्र विकल्प है।
ज़िब्बोज़

@Zibbobz: पाठ "खराब अभ्यास" एक कड़ी है। इस पर क्लिक करें।
बालुस

1

आप लूप के भीतर क्या हासिल करना चाहते हैं, इसके आधार पर, इनमें से किसी एक पर पुनरावृति करें:

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

हाँ, इसके साथ मुझे लगभग मुख्य सेट मिलते हैं, लेकिन मैं इसे html के लिए एक चुनिंदा क्षेत्र में कैसे एकीकृत कर सकता हूं?
ब्लूब

6
यह उस प्रश्न का उत्तर नहीं दे रहा है जो JSP के बारे में विशिष्ट है
तौफीक मोहित

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>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.