커스텀 태그(Custom Tag)는 사용자가 직접 정의하는 JSP 언어 요소입니다. 커스텀 태그를 포함한 JSP 페이지가 서블릿으로 변환될 때, 해당 태그는 태그 핸들러(tag handler)라는 객체에 대한 연산으로 변환됩니다. 이후 웹 컨테이너(Web Container)가 JSP 페이지의 서블릿을 실행할 때 이 연산들을 호출하게 됩니다.
JSP 태그 확장 기능을 활용하면 JavaServer Page에 바로 삽입할 수 있는 새로운 태그를 만들 수 있습니다. 특히 JSP 2.0 스펙부터는 커스텀 태그를 더 쉽게 작성할 수 있도록 Simple Tag Handler가 도입되었습니다.
커스텀 태그를 작성하려면 SimpleTagSupport 클래스를 상속하고 doTag() 메서드를 오버라이드하기만 하면 됩니다. 이 메서드 안에 태그가 출력할 콘텐츠를 생성하는 코드를 작성합니다.
Hello 태그 만들기
<ex:Hello>라는 이름의 커스텀 태그를 정의하고, 본문(body) 없이 다음과 같이 사용하고 싶다고 가정해 보겠습니다.
<ex:Hello />
JSP 커스텀 태그를 만들려면 먼저 태그 핸들러 역할을 하는 자바 클래스를 생성해야 합니다. 아래와 같이 HelloTag 클래스를 만들어 보겠습니다.
package com.tutorialspoint;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
out.println("Hello Custom Tag!");
}
}위 코드는 매우 간단한 구조입니다. doTag() 메서드가 getJspContext() 메서드로 현재 JspContext 객체를 가져온 뒤, 이를 통해 현재 JspWriter 객체에 "Hello Custom Tag!" 문자열을 출력합니다.
태그 라이브러리(TLD) 파일 작성
이제 위 클래스를 컴파일하고, 환경 변수 CLASSPATH에 등록된 디렉터리에 복사합니다. 그다음 아래와 같은 태그 라이브러리 파일을 생성합니다. 파일 경로는 <Tomcat-설치-디렉터리>webapps\ROOT\WEB-INF\custom.tld입니다.
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>Example TLD</short-name>
<tag>
<name>Hello</name>
<tag-class>com.tutorialspoint.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>TLD(Tag Library Descriptor) 파일은 태그 이름, 실제 핸들러 클래스, 본문 콘텐츠 유형 등 태그에 대한 메타 정보를 담고 있습니다. 여기서는 태그 이름을 Hello로 지정하고, 본문이 없는(empty) 태그로 선언했습니다.
JSP에서 커스텀 태그 사용하기
이제 앞에서 정의한 커스텀 태그 Hello를 JSP 프로그램에서 다음과 같이 사용할 수 있습니다.
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>taglib 디렉티브에서 prefix는 JSP 내에서 태그를 호출할 때 사용할 접두사이며, uri는 TLD 파일의 위치를 가리킵니다. 위 JSP를 실행하면 다음과 같은 결과가 출력됩니다.
Hello Custom Tag!
정리
JSP 커스텀 태그 작성 절차를 요약하면 다음과 같습니다.
① SimpleTagSupport를 상속받아 doTag() 메서드를 오버라이드한 태그 핸들러 클래스를 작성한다 → ② 클래스를 컴파일해 CLASSPATH 경로에 배치한다 → ③ 태그 정보를 담은 TLD 파일을 WEB-INF 디렉터리에 생성한다 → ④ JSP에서 taglib 디렉티브로 태그 라이브러리를 선언하고 커스텀 태그를 사용한다.