JSP/Servlet – 동적 애트리뷰트를 지원하는 태그 클래스 만들기
동적 애트리뷰트를 지원하는 태그 클래스를 만들기 위해서는 각각의 애트리뷰트에 대한 set 메소드를 선언할 필요는 없고
setDynamicAttribute메소드 하나만 선언하면 됩니다.
@Override
public void setDynamicAttribute(String uri, String localName, Object value)
throws JspException {
}
uri는 네임스페이스를 말하며 보통 무시하셔도 좋습니다. localName은 애트리뷰트 이름, value는 애트리뷰트의 값을 의미합니다.
동적 애트리뷰트를 지원하는 태그 클래스의 경우 TLD 파일에 <attribute> 엘리먼트가 필요가 없으며 <dynamic-attributes>라는 엘리먼트를 쓰고
그 엘리먼트의 시작 태그와 끝 태그 사이에 true라는 값을 쓰면 됩니다.
/WEB-INF/classes 폴더에 tool폴더를 만든 후 태그클래스를 구현하는 NewerLineTag.java를 만듭니다. 그다음 tlds 폴더에 tools.tld 파일을 만들어서 태그클래스를 등록합니다.
web.xml에서는 tld파일을 등록하고 마지막으로 TagTest.jsp파일에서 테스트를 합니다.
NewerLineTag.java
package tool;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.DynamicAttributes;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class NewerLineTag extends SimpleTagSupport implements DynamicAttributes{
private Map<String, Object> attrs = new HashMap<String, Object>();
@Override
public void setDynamicAttribute(String uri, String localName, Object value)
throws JspException {
attrs.put(localName, value);//해쉬맵에 저장함
}
@Override
public void doTag() throws JspException, IOException {
// TODO Auto-generated method stub
//해쉬에 저장한 값중 원하는 애트리뷰트만 가져옴
String color = (String)attrs.get("color");
int size = Integer.parseInt((String)attrs.get("size"));
JspContext context = getJspContext();
JspWriter out = context.getOut();
out.println("<FONT color=" + color + ">");
for(int cnt = 0; cnt < size; cnt++){
out.print("*");
}
out.println("</FONT><BR>");
return;
}
}
tools.tld
<taglib xmlns="http://java.sun.com/xml/ns/javaee" version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>tool</short-name>
<tag>
<name>newerLine</name>
<tag-class>tool.NewerLineTag</tag-class>
<body-content>empty</body-content>
<dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ch10_jsp_tag_dynamic</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>/taglibs/tools.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/tools.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
TagTest.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@taglib prefix="tool" uri="/taglibs/tools.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<tool:newerLine color="red" size="35" background="black"/>
테스트입니다.<BR>
<tool:newerLine color="blue" size="30" name="gakari"/>
</body>
</html>
실행 화면
여기서 주목할 점은 커스텀액션을 사용할 때 미리 정의되지 않은 값 background 애트리뷰트나 name 애트리뷰트를 사용해도
실행 중에 에러가 발생하지 않는다는 점이 동적 애트리뷰트의 핵심입니다.
'프로그래밍 > JSP Servlet' 카테고리의 다른 글
JSP/Servlet – 커스텀 액션안에 또 다른 커스텀 액션 포함하기 (0) | 2016.03.06 |
---|---|
JSP/Servlet – 태그 클래스를 이용해서 변수 지원 커스텀 액션 만들기 (0) | 2016.03.01 |
JSP/Servlet – 태그 클래스를 이용해서 커스텀 액션의 본체 내용을 바꿔보자 (0) | 2016.03.01 |
JSP/Servlet - 태그 클래스를 이용한 본체가 있는 커스텀 액션 만들기 (0) | 2016.02.29 |
JSP/Servlet – 태그클래스를 이용해서 애트리뷰트가 있는 커스텀 액션 만들기 (1) | 2016.02.23 |
JSP/Servlet – SimpleTagSupport 클래스를 이용해서 태그 클래스 작성하기 (0) | 2016.02.22 |
JSP/Servlet – 커스텀 액션에 변수를 사용해보자 (0) | 2016.02.22 |
JSP/Servlet – 커스텀 액션에 body를 추가해보자 (0) | 2016.02.21 |