# 웹 개발/프레임워크

JSTL <c:foreach> map류 반복제어하기

dev-jjong 2013. 8. 23. 10:17


 

 JSTL core library  (test: Struts 1.2.9, Servlet 2.3 spec)



 Example(Map)


  <JstlExampleAction.java>

          Map<String, Double> map = new HashMap<String, Double>();

          map.put("d0",1.0);

          map.put("d1",2.0);

          map.put("d2",3.0);

          map.put("d3",4.0);

         

          request.setAttribute("varTbl", map);


  

  <jstl.jsp>
  <%@ taglib uri="/WEB-INF/tlds/struts-html-el.tld" prefix="html-el" %>
   <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>


  <c:foreach var="entry" items="${varTbl}">
         <c:out value="${entry.key}"/> = <c:out value="${entry.value}"/>
         <br/>
  </c:foreach>

 

  Servlet spec 2.4에서는 <c:out value="${entry.key}"/> 대신 ${entry.key}만으로도 출력 가능하다.

  이번에는 응용으로 Map에 여러 Key값이 존재할 경우 원하는 Key값만을 검색해서 hidden tag로 값을 넘기는
방법을 살펴보고자 한다. 얼핏 생각에는 ${entry['d'+i]} (여기서 i는 index번호이다) 와 같이하여 value로 넘기면
될 것같지만, 컴파일시 에러가 발생한다. String을 long으로 변환하려는 과정에서 error가 발생하다는 내용의
error메세지 일것이다.

 그럼 다른 방법을 강구해보자. 꼼수로 c:set tag를 사용해서 key값을 변수로 저장하여
그 값을 key로 넘겨줘보자. code는 대략 다음과 같다.

 

  <c:foreach var="i" begin="0" end="3">
         <c:set var="key" value="d${i}"/>
         <html-el:hidden property="${key}" styleId="${key}" value="${varTbl[key]}"/>
  </c:foreach>

 

  다행스럽게 이 코드는 작동한다.

  출력화면은


     <input type="hidden" name="d0" id="d0" value="1.0"/>
     <input type="hidden" name="d1" id="d1" value="2.0"/>
     <input type="hidden" name="d2" id="d2" value="3.0"/>
     <input type="hidden" name="d3" id="d3" value="4.0"/> 


 와 같다.  Scriptlet을 사용할 경우 loop제어문을 사용할 수밖에 없는데, 소스가 지저분해지는 것도 막고 후에
유지보수할 때도 도움이 될 것 같다. 개인적으로는 Struts logic:iterate tag를 사용하는 것보다 JSTL core tag
와 EL을 사용하는 것이 편하다. EL사용시 굳이 scope를 지정하지 않아도 충돌하지만 않는다면, 자동으로 해당

Scope를 검색해주고, scriptlet의 사용을 자제할 수 있는 등의 이점이 있다. 그리고 눈치를 챘겠지만,

EL식과 c:foreach 태그를 사용함으로 id속성에 식을 사용한 것 같은 효과를 거둘 수 있다는 점이다.