Custom Tag(JSP 1.2, 2.0 변경 사항)
Custom Tag
-JSTL 에서 지원하지 못하는 Tag 형식을 사용자가 정의해서 사용하는 Tag
1. 장점
-재사용성 : 한번 작성한 tag는 언제든지 재 사용이 가능하다.
-package 배포 : 표준화해서 다른 개발자가에게 package로 배포가 가능하다.
-가독성 : 프로그램의 가독성이 높아진다.
-의존성 : Scriptlet 을 사용하지 않기 때문에 자바 문법에 의존적이지 않는다.
2. 종류
a. JSP 1.2 스타일로 구현한 커스텀 태그
b. JSP 2.0 또는 그 이상 버전의 SimpleTag 를 사용한 커스텀 태그
c. JSP 2.0 또는 그 이상 버전의 태그 파일을 사용한 커스텀 태그
3. 자바 클래스를 기반으로 한 커스텀 태그 만들기
1) 작성순서
a. 커스텀 태그를 정의하는 자바파일의 작성
b. TLD(Tag Library Description) 파일 - 자바의 클래스 파일 등록
c. JSP 페이지에서 Custom Tag 사용
2) javax.servlet.jsp.tagext Interfaces
a. BodyTag
-JSP1.2 에서 제공하는 기존의 Custom Tag 구현시 사용
-태그의 body 내용이 있을 때 사용하는 Custom Tag
b. IterationTag
-JSP 1.2에서 제공하는 기존의 Custom Tag 구현시 사용
-반복적인 작업을 처리하는 Tag
c. Tag
-JSP 1.2에서 제공하는 기존의 Custom Tag 구현시 사용
-단순한 태그 처리시 사용하는 Custom Tag
d. SimpleTag
-JSP 2.0에서 제공하는 기존의 Custom Tag 구현시 사용
-Tag, IterationTag를 하나로 묶어서 쉽게 구현이 가능한 태그
4. JSP 1.2 기반
1) Tag Interface
-단순한 태그 처리시 사용하는 Custom Tag
-TagSupport class 지원
-int doEngTag() : 끝 태그를 만날때 실행됨
-int doStartTag() : 시작 태그를 만날때 실행됨
-Tag getParent() : 부모태그를 구한다.
-void release() : custom tag 를 사용하지 않을 때 실행됨
-void setPageContext(PageContext pc) : custom tag가 포함된 JSP page context를 전달 받는다.
-void setParent(Tag t) : 해당 태그의 부모태그가 존재할 때 부모태그를 설정한다.
2) Iteration Tag
-반복적인 작업을 처리하는 Custom Tag
-Tag interface를 상속받으므로 Tag Interface의 모든 멤버 사용가능
-TagSupport지원
-int doAfterBody() : 태그의 body 내용을 처리한 뒤에 실행
3) BodyTag
-IterationTag 인터페이스를 상속받으므로 IterationTag 인터페이스의 모든 멤버 사용 가능
-BodyTagSupport 지원
-void doInitBody() : body 를 수행하기 위한 준비
-void setBodyContent(BodyContent b) : bodycontent 속성을 지정
4) 사용예
a. Java Class 정의 : WEB-INF/src/
package com.javasoft.libs;
public class HelloTag extends TagSupport {
public void doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.print("<font size='7' color='red'>");
out.print("Hello Custom Tag");
out.print("</font>");
} catch(Exception ex) {
throw new JspTagException ("Exception Occurrance : " + ex.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() throws JspTagException{
return EVAL_PAGE;
}
}
b. TLD 파일 정의 : WEB-INF/tlds/
<Hello.tld>
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/j2ee"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>JSP1.2 Custom Tag Example</description>
<display-name>간단한 JSP 1.2 커스텀 태그 예제</display-name>
<tlib-version>1.0.0.0</tlib-version>
<short-name>mytag</short-name>
<tag>
<name>hello</name>
<tag-class>com.javasoft.libs.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
c. web.xml 수정 <----JSP 2.0 이상에서는 할 필요없음
<taglib>
<taglib-uri>/WEB-INF/tlds/hello.tld<taglib-url>
<taglib-location>/WEB-INF/tlds/hello.tld<taglib-url>
</taglib>
d. JSP 에서 사용
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="mytag" uri="/WEB-INF/tlds/mytaglib.tld" %>
<html>
<body>
<mytag:hello/>.
</body>
</html>
5. JSP 2.0 기반
1) Simple Tag
-body 의 사용여부와 상관없이 simpleTag 인터페이스 사용
-SimpleTagSupport 클래스를 사용하여 Custom tag 작성
-void doTag() : custom tag 를 만나면 살행된다.
-protected JspFragment getJspBody() : JspFrament 객체로 customtag의 body를 처리
-protected JspContext getJspContext() : JspContext 객체를 얻는다.
2) 사용예
a. Java Class 정의 <--여기만 틀림
package com.javasoft.libs;
public class SimpleTag extends SimpleTagSupport {
public void doTag() throws JspException {
JspWriter out = getJspContext().getOut();
try {
out.print("<font size='7' color='red'>");
out.print("Simple Custom Tag");
out.print("</font>");
} catch(Exception ex) {
throw new JspTagException ("Exception Occurrance : " + ex.getMessage());
}
return SKIP_BODY;
}
}
6. Tag 파일을 기반으로 하는 Custom Tag
1) 개요
a. Tag File
-Custom Tag를 정의한 파일로 Custom Tag 당 하나의 Tag File이 매핑됨
b. Jsp Page
-해당 Custom Tag를 사용하는 Jsp Page
2) 작성방법
- Custom Tag 를 정의한다.
- 확장자는 .tag 를 사용한다.
-<%@ tag %> directive 를 사용한다.
-Tag Handler 로 변환되어 처리된다.
-jsp와 동일한 방식으로 같은 문법을 사용하여 작성한다.
3) Tag File Directive
a. taglib : JSP 페이지의 taglib와 동일한 기능을 수행
b. include :JSP 페이지의 include 와 동일한 기능, 단 tag file 에 맞는 문법 사용해야
c. tag : JSP 페이지의 page directive 와 동일, tag 파일의 설정 지원
d. attribute : tag file 에서 custom tag의 속성을 명시
e. variable : EL을 명시
4) tag Directive
-display-name : tag file의 확장자를 제외한 파일명
-body-content : 태그의 body의 내용에 대한 정보를 제공, empty | tagdependent | scriptless 중 하나의 값을 설정
-dynamic-attributes : 해당 태그의 동적인 속성을 지원, 이름과 값의 쌍이 map 으로 저장
-small-icon : 이미지 파일의 태그소스파일로부터 상대적인 경로를 기술
-large-icon : 이미지 파일의 태그소스파일로부터 상대적인 경로를 기술
-description : 태그의 설명
-example : 해당 액션이 사용될 때의 예제
-lanaguge
-import
-pageEncoding
7. body 가 있는 tag file 작성하기
1) body-content 속성 설정
a. tagdependent - custom tag의 내용을 처리하지 않고 그대로 사용
b. scriptless : EL 요소나 action tag 의 처리결과를 사용
2)<jsp:doBody> tag 를 사용함
a. <jsp:invoke>tag 와 유사
b. var : 속성의 이름을 저장하기 위한 변수
c. scope : 속성변수가 유지되는 범위를 설정
8. <%@ attribute %> tag
1) custom tag의 속성을 명시
2) 속성
a. description : 속성에 대한 설명
b. name : 속성의 이름, 중복을 허용하지 않음, 필수 항목
c. required : 속성의 필수여부를 설정, true | false로 설정
d. rtexprvalue : 속성의 값으로 표현식이 사용 가능한가의 여부를 결정
e. type : 속성의 타입을 기술, java.lang.String 이 기본
f. fragment : 속성값을 전달할 때 사용, JspFragment를 사용하는 경우, true로 설정
9. <%@ variable %> Directive
1) EL 변수를 명시하는 경우에 사용
2) 속성
a. description : 속성에 대한 설명
b. name-given / name-from-attribute : 태그파일을 사용할 페이지에서 사용할 EL의 변수이름, 두가지 속성중 하나만 기술
c. alias name-from-attribute : 속성을 사용하는 경우 반드시 기술해야 하는 속성, custom tag의 body 에서 사용될 변수를 정의
d. declare : 변수의 선언과 관계없이 기본값은 true
e. scope : 변수의 범위를 설정, AT_BEGIN | AT_END | NESTED(default)
출처 - http://seemoon.tistory.com/138