이전글
*.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 |
예제 프로젝트
커스텀태그에서 동적 속성을 어떻게 이용하고 어떤식으로 동작하는지 예제를 통해 알아보도록 하겠습니다.
동적 속성을 이용한 태그 작성
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 객체의 KeySet과 Iterator를 이용하면 모든 속성명과 속성값을 추출할 수 있습니다. 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 |
'Servlet&Jsp' 카테고리의 다른 글
| [서블릿/JSP] JSP 1.2 방식으로 태그 속성 및 커스텀 태그 몸체 처리하기 (0) | 2019.08.29 |
|---|---|
| [서블릿/JSP] *.tag 태그 파일내부에서 사용한 attribute name과 scope 객체의 attribute name 겹치는 경우 (0) | 2019.08.11 |
| [서블릿/JSP] *.tag 태그 파일 내부에서 사용한 변수를 호출한 JSP로 넘기기 (0) | 2019.08.10 |
| [서블릿/JSP] 태그파일 방식으로 커스텀 태그 만들기 (0) | 2019.08.10 |
| [서블릿/JSP] JSP 커스텀 태그란? JSP 2.0 SimpleTagSupport를 이용한 태그 작성 방법 (1) | 2019.08.10 |