이전글


*.tag 태그파일에서 동적 속성 사용하는 방법
*.tag파일을 이용한 커스텀 태그 개발 방식에서 <%@ attribute @> 디렉티브를 이용해 속성을 정의합니다. 그런데 만약 태그에서 사용할 속성의 갯수나 변수명을 정해둘 수 없는 경우는 어떻게 해야 할까요? 이경우에는 태그 정의파일에서 <%@ tag %> 디렉티브에 dynamic-attributes 속성을 이용할 수 있습니다.


만약 다음과 같이 dynamicSelect라는 커스텀 태그를 사용했을때 속성을 지정하는것에 따라 속성명과 속성 개수에 상관없이 SELECT BOX를 화면에 출력하고자 한다면 어떻게 해야할까요?
<dololak:dynamicSelect banana="바나나" apple="사과" grape="포도"   />
cs

위와 같이 태그를 사용한 경우 세 개의 속성을 입력했으므로 select의 option도 세개여야 합니다.




추가적으로 HTML 요소검사를 하는 경우 option의 value 속성값이 커스텀태그에서 지정한 속성명입니다.
<select>
    <option value="banana">바나나</option>
    <option value="apple">사과</option>
    <option value="grape">포도</option>
</select>
cs




예제 프로젝트
커스텀태그에서 동적 속성을 어떻게 이용하고 어떤식으로 동작하는지 예제를 통해 알아보도록 하겠습니다.
예제 풀소스는 다음 예제 GIT 소스 링크의 dynamicSelect.tag태그파일과 dynamicSelectTest.jsp테스트파일 두가지를 참고하시기 바랍니다.


동적 속성을 이용한 태그 작성
select의 option을 동적으로 출력하기위한 dynamicSelect.tag태그 파일입니다.
<%@tag import="java.util.Iterator"%>
<%@tag import="java.util.Set"%>
<%@tag import="java.util.Map"%>
<%@ tag dynamic-attributes="optionMap" body-content="empty"   pageEncoding="UTF-8"%>
 
<%
    Map optionMap = (Map)jspContext.getAttribute("optionMap");
    Set keySet = optionMap.keySet();
    Iterator<String> keys = keySet.iterator();
%>
    <select>
    
<%
    while (keys.hasNext()) {
        String key = keys.next();
%>
        <option value="<%= key %>"><%= optionMap.get(key)  %></option>
<%        
    }
%>
    </select>
cs









dynamic-attributes속성 
태그 정의파일에서 <%@ tag %> 디렉티브에 dynamic-attributes 속성을 선언하고 대표 속성명을 지정합니다. 여기에서는 optionMap으로 지정하였습니다.
<%@ tag dynamic-attributes="optionMap" body-content="empty"   pageEncoding="UTF-8"%>
cs


jspContext는 커스텀태그 내부에서 사용가능한 기본객체입니다. jspContext에는 내부적으로 Map 타입의 Attribute를 가지고 있는데, 동적 속성을 사용하는 경우 dynamic-attributes 속성의 값을 key로 하여 태그 호출시 사용한 속성들을 꺼내올 수 있습니다.
Map optionMap = (Map)jspContext.getAttribute("optionMap");
cs

태그 호출시 사용한 속성들또한 Map 객체로 저장되므로 jspContext.getAttribute(attrName)으로 얻어온 후 형변환 해주어야 합니다.

나머지 코드는 크게 중요한 코드는 아닙니다. 속성들이 담긴 Map 객체인 optionMap은 태그 호출시 사용한 속성명이 key이고 속성값이 value로 저장되므로 Map 객체의 KeySetIterator를 이용하면 모든 속성명과 속성값을 추출할 수 있습니다.
    Set keySet = optionMap.keySet();
    Iterator<String> keys = keySet.iterator();
%>
    <select>
    
<%
    while (keys.hasNext()) {
        String key = keys.next();
%>
        <option value="<%= key %>"><%= optionMap.get(key)  %></option>
<%        
    }
%>
    </select>
cs



만약 JSTL을 이용한다면 다음과 같이 더욱 심플하게 태그를 구현할수도 있습니다.
<%@ tag dynamic-attributes="optionMap" body-content="empty"   pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<select>
    <c:forEach var="item" items="${optionMap}">
        <option value="${item.key}">${item.value}</option>
    </c:forEach>
</select>
cs


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!