728x90
태그 핸들러 클래스는 .java 파일로 만들어지며 태그 라이브러리 기술자(작성자)는 .tld 파일(.xml 파일)로
만들어지며 태그 파일과 같이 WEB-INF 하위에 tld 폴더를 만들어 관리한다.
tld 파일은 xml파일 생성 시 Next -> Create file using a DTD or XML Schema file -> Select XML Catalog entry
이후 플러그인에서 j2ee/web-jsptaglibrary를 선택한 후 j2ee의 Prefix를 지우고 no prefix로 생성한다.
tld 파일은 다음과 같은 형태로 작성된다.
<tag>
<name>커스텀태그명</name>
<tag-class>패키지경로명.핸들러클래스명</tag-class>
<body-content>태그바디의 형태</body-content>
</tag>
태그 바디의 형태 자리에 들어갈 수 있는 것들로는 empty, JSP, tagdependent 등이 있다.
예시를 위해 다음과 같은 클래스 파일을 만들었다.
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
// 자바 내에 존재하는 핸들러 클래스
// "상속"
public class MsgTagHandler extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut(); // 화면에 출력해주는 아웃 객체가 없어 생성
out.println("핸들러클래스기반으로 출력하는 메세지! :D");
}
// 시작 태그를 만나면 자동으로 호출되어 수행되는 메서드
}
위 클래스를 사용하는 .tld 파일
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>0.0</tlib-version>
<short-name>MsgTag</short-name>
<tag>
<name>msg</name>
<tag-class>test.MsgTagHandler</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
위 .tld 파일을 사용하는 .jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="WEB-INF/tld/MsgTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>핸들러 클래스 기반의 커스텀태그</title>
</head>
<body>
<h1><mytag:msg/></h1>
</body>
</html>
출력 결과
또 다른 예시로 사용할 클래스 파일을 생성하였다.
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class TestTagHandler extends SimpleTagSupport{
// 태그 속성을 저장할 멤버변수
private String border;
private String bgcolor;
public String getBorder() {
return border;
}
public void setBorder(String border) {
this.border = border;
}
public String getBgcolor() {
return bgcolor;
}
public void setBgcolor(String bgcolor) {
this.bgcolor = bgcolor;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = getJspContext().getOut();
JspFragment body = getJspBody(); // 외부에 작성한 태그바디 내용을 받아오는 코드 (상속받은 Support의 내장 메서드)
if(body!=null) { // 바디내에 아무것도 작성되지 않으면 오류가 발생될 수 있기에 작성
out.println("<h1>");
body.invoke(null);
out.println("</h1>");
}
out.println("<table border="+border+" bgcolor="+bgcolor+">");
for(String v:new Test().getDatas()) {
out.println("<tr><td>"+v+"</td></tr>");
}
out.println("</table>");
}
}
위 클래스를 사용하는 .tld 파일
required를 사용해 태그 생성 시 속성이 부여된다.
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>0.0</tlib-version>
<short-name>NMTOKEN</short-name>
<tag>
<name>test</name>
<tag-class>test.TestTagHandler</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>border</name>
<required>true</required>
</attribute>
<attribute>
<name>bgcolor</name>
<required>true</required>
</attribute>
</tag>
</taglib>
위 .tld 파일을 사용하는 .jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="WEB-INF/tld/TestTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:test bgcolor="" border=""></mytag:test>
<mytag:test bgcolor="lightblue" border="1">목록</mytag:test>
</body>
</html>
출력 결과
728x90
'web' 카테고리의 다른 글
리스너 클래스 (0) | 2022.08.16 |
---|---|
JSP - JSTL (0) | 2022.08.16 |
태그 파일 기반의 커스텀태그 (0) | 2022.08.13 |
커스텀 태그 (0) | 2022.08.12 |
표현언어, EL식 (0) | 2022.08.12 |