이전글
*.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 |