본문 바로가기

개발자노트/웹

HTML - JSP - 핸들러클래스 기반의 커스텀태그 , .tld 파일 생성법 , tld파일 만드는법

[태그 핸들러클래스 기반의 커스텀태그] 는 .tld + TagHandler.java 가 한세트임

 

태그 핸들러클래스 ( .java )

+

태그라이브러리 기술자 ( .tld 파일 ) 디스트럭터

→ tld 파일 만드는 방법 

1. WEB-INF 폴더에 tld 폴더 생성 == WEB-INF / tld

2. tld 폴더 우클릭 후 new → other → xml 검색 후 선택 ( xml = 설정과 관련 된 파일 )

3. xml 파일 안에 tld가 있는 것임 그러니,

   xml 파일 생성할 당시 확장자명을 .tld로 바꾼 후

   Finish가 아닌 Next 를 선택

4. 기본적으로 template 파일로 생성에 체크되어있지만,  DTD or XML Schema file로 만들기 선택후 Next

5. Workspace 혹은 기본적으로 XML에 지정되어있는 형식을 불러올 수 있는데 ,

    XML tatalog entry 체크 후 java.sun.com /... j2ee / web-jsptaglibary 를 선택 후 Next

6. 기본적으로 j2ee로 Prefix 되어있는데, 우리는 태그명 또한 바꿀 것이기 때문에 j2ee를 클릭 후 edit을 눌러 값을 지워줌

j2ee가 지워지고 <no prefix>로 변경되었으면 Finish로 추가하면 끝

 

 

 

 

사용예제 1 ) 단순출력

 

위에서 언급했듯 .java와 .tld는 한쌍임을 기억!

 

.java 코드

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(); // 현재 이 파일은 서블릿이 아니고 .java 파일이기 때문에 out.을 쓰기 위해
		out.println("핸들러클래스 기반으로 출력하는 메세지");
	}
	
}

핸들러 클래스를 사용하기 위해 SimpeTagSupport를 상속함

doTag 메서드는 태그를 시작할 당시 자동으로 호출되어 수행됨

Java에서 Jsp 문구를 사용하기 위해 JspWriter out = getJspContext().getOut(); 를 선언

 

 

MsgTag.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>

위에 생성법대로 했다면 링크같은 것들이 자동으로 import 되어있을 것임.

<name> 태그명 </name> 에 태그명을 정의해주고,

<tag-class>핸들러.java</tag-class> 에 java 파일 경로.파일명 을 써주고

<body-content> </body-content> 에 바디에 들어갈 내용을 적어주면 되는데 아무것도 적어주지 않을거면 비어있다는 뜻인
empty를 적어주면 됨

 

 

mytag.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>Insert title here</title>
</head>
<body>

<h1><mytag:msg/></h1>

</body>
</html>

.jsp 파일에서는 핸들러기반이기 때문에 <%@ taglib uri="경로" 를 써주고, prefix="재정의할 태그명" %> 을 작성

<prefix에 적은이름 : 사용할 태그명 /> 을 호출하여 쓰면 된다. 즉

<mytag : msg/> 을 적으면 tld 파일에 <name> msg </name> 이라는 이름을 가진 태그를 사용하는 것이다.

 

 

 

 

수행결과

 

 

 

 

 

사용예제 2 )  핸들러 클래스기반의 태그 또한 속성을 다음과 같은 방법으로 재정의 할 수 있다.

 

우선 Test.java 코드를  다음과 같이 작성하고

package test;

public class Test {
	private String[] datas= {"appple","banana","kiwi"};
	private int num1=10; // 값을 이미 넣었기 때문에 세터 안할것임!
	private int num2=20;
	public String[] getDatas() {
		return datas;
	}
	public int getNum1() {
		return num1;
	}
	public int getNum2() {
		return num2;
	}

}

 

핸들러를 사용하기 위한 TestTagHandler.java 코드를 작성

 

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;
	
	
	@Override
	public void doTag() throws JspException, IOException {
		JspWriter out=getJspContext().getOut();
		JspFragment body=getJspBody();
		// == getJspBody(); // 서포트에 내장 , 외부에 작성한 바디에 값을 받아온다
				       	  // <jsp:doBody />
		
		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>");
		
	}


	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;
	}
	
	
}

- 태그의 속성을 저장하기 위한 멤버변수 선언

  private String border;
  private String bgcolor;

 

doTag() 메서드를 오버라이딩하여

- java 코드에서 jsp메서드를 사용하기 위해 JspWriter out=getJspContext().getOut();  선언

 

- 태그를 호출 할 당시 body에 적은 내용을 가져오기 위한 JspFragment body=getJspBody(); 선언


- Test.Java의 생성자를 사용하기 위해 for each문 안에 new Test()로 객체생성하고 .getDatas()를 사용하여 datas를 가져옴

   → for(String v: new Test().getDatas()) {

 

-  private 되어있으니 , getter / setter 를 추가해줌

 

 

 

TestTag.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>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>

위와 비슷하지만 <attribute> 가 추가 된 것을 볼 수 있는데, 속성을 정의해주기 위해 사용된다.

<attribute> 안에 <name>에 재정의 할 멤버변수명들을 적어주고, <required>true</required> 를 사용해,

태그가 호출 될 당시 강제성을 부여해줌

 

 

Mytag.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="lightblue" border="1">목록</mytag:test>

</body>
</html>

.tld 코드에 requird 속성을 걸어놓아서 자동완성 될 당시 bgcolor=" " border=" " 값이 자동으로 추가 됨

 

 

 

 

 

수행결과