본문 바로가기

JSP

[JSP] 커스텀태그 사용법

728x90
반응형

커스텀태그 

=> 개발자가 작성한 태그 

JSP 페이지에서 반복적인 프로그램 로직을 캡슐화하려고 고안된 것으로,

기본적으로 제공되는 태그 이외에 사용자가 확장한 태그라는 의미에서 붙여진 이름이다.

JSP 서버에서는 커스텀 태그를 구현할 수 있다.

 

커스텀태그 장점 

  • V에 존재하는 로직코드(자바)를 분리가능
  • 로직코드를 캡슐화(모듈화) 
  • 보다 완벽한 MVC 구조 구축가능

커스텀태그 개발 방법

  • 태그파일 기반의 커스텀태그 
    프로젝트의 규모가 작을때 
    간단한 기능 
  •  태그핸들러클래스 기반의 커스텀태그
    프로젝트의 규모가 클때 
    배포(공개, 공유)를 하는것이 주된 목적일때 사용

태그의 구조 

태그 : 주로 쌍으로 이루어져있음 
태그 바디: 비울경우(사용하지않을경우) < /> 닫는것을 권장 
속성 : 속성값들을 작성할때에는 ""로 묶는것을 권장

 

taglib 지시어

  • 내가 만든 (파일기반의) 커스텀태그 
    <%@ taglib tagdir="커스텀태그 파일의 위치" prefix="커스텀태그명" %>
    <prefix명 : 파일명>태그 바디</prefix : 파일명>
    <prefix명 : 파일명 /> 
  • 남이 만든 (핸들러클래스기반의) 커스텀태그
    <%@ taglib uri="커스텀태그 파일의 위치" prefix="커스텀태그명" %>
    <prefix:커스텀태그명>태그 바디</prefix:커스텀태그>
    <prefix:커스텀태그명/> 

1. 태그파일 기반의 커스텀태그 사용방법

1) tag파일 생성

WEB-INF파일에 태그를 넣어둘 파일 생성 후,   그 폴더 내부에 태그(tag) 파일 생성 

파일 생성 경로

2) taglib 지시어 선언

커스텀태그를 사용할 jsp페이지에 taglib 지시어가 선언되어야 사용이 가능

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>

tagdir에 입력된 경로에 있는 tag파일을 prefix에 입력된 이름인 kim으로 불러올 수 있음 


< 예시 1 > 

tag파일

<%@ tag language="java" pageEncoding="UTF-8"%>

커스텀태그입니다. HELLO! :D

jsp파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 내가 만든걸 쓸때 쓰는 방식 -->
<h1><kim:print/></h1>


</body>
</html>

 

< 예시 2 > 

attribute 사용하여 커스텀태그에 속성 부여 

<%@ attribute name="속성" %>

tag파일

dobody를 사용하여 jsp파일의 태그바디의 내용을 tag파일로 불러올 수 있다.

<h1><jsp:doBody/></h1>

<%@ tag language="java" pageEncoding="UTF-8"%>

<!-- attribute사용하여 커스텀태그에 속성부여 -->
<%@ attribute name="border" %>
<%@ attribute name="bgcolor" %>

<jsp:useBean id="test" class="test.Test"/>
<h1><jsp:doBody/></h1>
<table border="${border}" bgcolor="${bgcolor}">
	<%
		for(String v : test.getDatas()){
	%>
		<tr>
			<td><%=v%></td>
		
		</tr>
	<%
		}
	%>
</table>

jsp파일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<kim:test border="5" bgcolor="lightpink">과일 목록</kim:test>

</body>
</html>


2. 태그핸들러클래스 기반의 커스텀태그 사용방법 

1) 핸들러클래스 생성 

일반 클래스 생성 후 , SimpleTagSupport를 상속하여 핸들러클래스로 전환할 수 있다.

파일경로

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");
	}
	// 시작태그를 만나면 자동으로 호출되어 수행되는 메서드 
}

2) 태그라이브러리 생성 

 

xml 파일 생성하는 방법 

WEB-INF폴더 하위에 tld폴더를 생성

tld 우클릭 new -> others -> XML File 선택

파일 확장자는 .tld로! 

Create file using a DTD or XML Schema file을 선택

Select XML Catalog entry를 선택한 후 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0xsd를 클릭

j2ee가  <no prefix>로 표시되도록 클릭 후 Prefix에 기입된 내용을 지워주고 OK버튼

Source탭에 태그 관련 내용을 정의


< 예시1 > 

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();
		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>

jsp파일 

taglib지시어의 속성 중 uri를 활용하여 tld파일의 경로를 기입

<%@ 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>

< 예시2 > 

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;
	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 {
		//out내장객체 사용을 위한 선언
		JspWriter out=getJspContext().getOut();
		// 태그 바디의 내용을 받아오는 코드 
		// <jsp:doBody/>
		JspFragment body = getJspBody();
		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파일

<?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>

 

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>

출력화면

728x90
반응형