web

태그핸들러클래스 기반의 커스텀태그

Clearing 2022. 8. 14. 11:28
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