JSP에서 HashMap을 반복하는 방법은 무엇입니까?


146

HashMapJSP에서 루프를 어떻게 반복 할 수 있습니까?

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

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

17
그건 그렇고, a HashMap는 본질적으로 순서가 없습니다. 필요하지 않거나 TreeMap(자동 키 정렬) 또는 LinkedHashMap(삽입 순서 유지 ) 확실하지 않습니까?
BalusC 2009

답변:


308

일반적인 Java 코드에서와 같은 방식입니다.

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

그러나 , 스크립틀릿 (JSP 파일, 그 원시 자바 코드 <% %>일)는 고려 가난한 연습 . JSTL 을 설치하는 것이 좋습니다 (JAR 파일을 드롭하고 JSP 상단에 /WEB-INF/lib필요한 taglib 를 선언하십시오 ). 그것은 <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>

원하는 범위 에 배치 하려면 a Servlet또는 a ServletContextListener가 필요합니다 ${countries}. 이 목록은 요청 기반이 될 것으로 예상되는 경우, 사용 Servlet의를 doGet():

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);
}

또는이 목록은 다음 사용하는 응용 프로그램 전체 일정하다고 가정하는 경우 ServletContextListenercontextInitialized()이 한 번만로드되고 메모리에 보존 조치 할 수 있도록 :

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

두 경우 모두에 의해 ELcountries 에서 사용할 수 있습니다 .${countries}

도움이 되었기를 바랍니다.

또한보십시오:


2
@Khue : 예, 세션에 속성을 넣을 수도 있습니다. 여러 세션에서 응용 프로그램 전체 데이터를 복제하려는 이유는 모르겠습니다.
BalusC

세션 기반 정보의 경우에 생각합니다. 아주 좋은 설명 감사합니다.
Khue Vu

나는 대답이 명백하다고 확신하지만 스크립틀릿은 왜 나쁜 연습으로 간주됩니까? 레거시 응용 프로그램을 유지 관리하기 때문에 JSTL이 없으면 이것이 유일한 옵션입니다.
Zibbobz

@Zibbobz : 텍스트 "나쁜 연습"은 링크입니다. 그것을 클릭하십시오.
BalusC

1

루프 내에서 달성하고자하는 것에 따라 대신 다음 중 하나를 반복하십시오.

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

예, 이것으로 alle 키 세트를 얻지 만 어떻게 HTML의 선택 필드에 통합 할 수 있습니까?
blub

6
이것은 JSP에 관한 질문에 대답하지 않습니다
Taoufik Mohdit

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.