[03] 커스텀태그
[ 자바 커스텀태그]
- 커스텀태그란 자신이 직접 정의할 수 있는 태그를 의미한다
- 일반적으로 태그들은 모두 각각의 기능이 있지만 그 기능들로는 자신이 원하는 내용을 구현하지 못할수 있다
- 현재 존재하는 태그 외에도 새로운 태그를 만들어내어 자신만이 원하는 기능을 구현할 수 있다
- 커스텀태그는 라이브러리 형태로 만들어두고 필요할 때마다 가져다가 쓰는것이 일반적이다.
- 커스텀태그를 만들어서 프로그래밍을 하면 개발 속도는 빨라지고 효율적으로 개발할 수 있다.
- 바디가 없는 태그 < />
- 바디가 있는 태그 < > </ >
- 커스텀태그는 바디가 있는 태그를 사용자가 임의적으로 만들어서 쓰는 태그
* 커스텀태그 사용의 장점
- 자신이 직접 원하는 기능을 구현하여 작성할 수 있는 태그이기 때문에
일반 태그로 구현하지 못했던 한계점을 극복할 수 있다.
- 작성한 커스텀태그를 라이브러리로 작성해 둔다면 다음 개발 할때에
가져다 사용하기 매우 편리한 프로그래밍 기능이다.
- 직접 작성한 태그이므로 가독성이 높고 유지보수가 쉽다
- 반복적인 기능을 쉽게 구현할 수 있으므로 코딩 시간이 짧아질수 있다
* 커스텀 태그의 구조 및 작동원리
- 커스텀태그가 작동하기 위해서는 실제로 커스텀 태그의 기능을 하는
클래스파일이 존재해야 한다. 이 클래스 파일을 태그 핸들러 한다.
- 태그 핸들러가 존재한다면 그 다음으로는 태그 핸들러에 대한
TLD파일이 존재해야 한다.
- TLD파일 : 태그핸들러의 기능을 JSP페이지에서 태그로 사용할 수 있게
만들어 주는 기능이다
- 작성한 커스텀태그를 JSP페이지에서 태그 라이브러리로 등록하여 사용한다
[사용자 정의 태그 사용하기]
- 커스텀 태그를 사용하려면 javax.servlet.jsp.tagext패키지 필요
tomcat\lib\jsp-api.jar 복사
C:\Program Files\Java\jdk1.6.0_29\lib 붙여넣기
내컴퓨터->속성->고급->환경변수
CLASSPATH .;C:\Program Files\Java\jdk1.6.0_29\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_29\lib\servlet-api.jar;C:\Program Files\Java\jdk1.6.0_29\lib\jsp-api.jar
JAVA_HOME C:\Program Files\Java\jdk1.6.0_29
- 작성순서
1) 자바 클래스 파일 .class
커스텀 태그 정의 (구조,로직)
2) TLD파일 .tld
자바클래스 파일을 태그로 사용할 수 있도록 등록
3) web.xml
JSP페이지에서 사용할 수 있도록 TLD파일 등록
4) JSP페이지 .jsp
커스텀 태그 사용
- 커스텀태그를 정의하고 처리하는 태그핸들러
. 태그 핸들러를 만들기 위한 클래스
TagSupport body 내용을 처리하지 않는 경우
BodyTagSupport body 내용을 처리하는 경우
. body의 유무 구분
body가 없는 경우 <tag:welcome/>
body가 있는 경우 <tag:welcome>홍길동</tag:welcome>
예제1) body가 없는 경우=================================
WelcomeTag.java-----------------------
package part.custom;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class WelcomeTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Welcome to My Custom Tag");
} catch (Exception ex) {
throw new JspTagException("WelcomeTag: " + ex.getMessage());
}
return SKIP_BODY;
}
}
doStartTag() 시작태그를 만날때 실행 <tag:welcome부분을 만나면 자동실행
pageContext.getOut() out객체 리턴
SKIP_BODY body가 없음을 알리며 태그명 뒤에 />처리를 한다.
/WEB-INF/tlds/welcomeTag.tld------------------------
<?xml version="1.0" encoding="euc-kr" ?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
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"
version="2.0"
>
<description>JSP1.2 커스텀 태그 예제</description>
<display-name>간단한 JSP1.2 커스텀 태그 예제</display-name>
<tlib-version>1.0</tlib-version>
<short-name>welcomeTag</short-name>
<tag>
<name>welcome</name>
<tag-class>part.custom.WelcomeTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
<body-content>empty</body-content>
커스텀 태그의 body가 존재하지 않을 경우 empty로 입력해야함. 필수요소
web.xml---------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>mvc</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>mycomputeadd</taglib-uri>
<taglib-location>/WEB-INF/tlds/el-functions.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/tlds/welcomeTag.tld</taglib-uri>
<taglib-location>/WEB-INF/tlds/welcomeTag.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
custom/WelcomeTag.jsp-----------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="tag" uri="/WEB-INF/tlds/welcomeTag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>JSP1.2의 커스텀태그 작성 1</h3>
<font color="red">
<tag:welcome/>
</font>
</body>
</html>
=========================================
예제2) body가 있는 경우
WelcomeBodyTag.java------------------------------------------
package part.custom;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class WelcomeBodyTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("환영합니다 <b>");
} catch (Exception ex) {
throw new JspTagException("WelcomeBodyTag: " + ex.getMessage());
}
return EVAL_BODY_INCLUDE;
}
}
EVAL_BODY_INCLUDE body부분이 그대로 출력되기를 원할때
welcomeTag.tld-------------------------------------------------
<tag>
<name>welcomeBody</name>
<tag-class>part.custom.WelcomeBodyTag</tag-class>
<body-content>JSP</body-content>
</tag>
커스텀태그의 body가 존재할 경우 JSP로 입력. 필수 요소
welcomeBodyTag.jsp-------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="tag" uri="/WEB-INF/tlds/welcomeTag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>JSP1.2의 커스텀태그 작성 2-body있는 태그</h3>
<font color="blue">
<tag:welcomeBody>홍길동</tag:welcomeBody>
</font>
</body>
</html>