프로그래밍/JSP Servlet

JSP/Servlet – 동적 애트리뷰트를 지원하는 태그 클래스 만들기

가카리 2016. 2. 23. 22:45
반응형

 

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 애트리뷰트를 사용해도

실행 중에 에러가 발생하지 않는다는 점이 동적 애트리뷰트의 핵심입니다.

반응형