420 likes | 891 Views
Custom Tag. Internet Computing Laboratory @ KUT Youn-Hee Han. What is Custom Tag?. Custom Tag 개발자가 필요에 의해서 자신이 스스로 개발하는 태그 JSP 코드의 복잡성을 줄여준다 . 주로 , Action Tag 나 EL 및 JSTL 등으로도 그 복잡성이 해결이 안되는 내용을 별도의 자바 소스로 처리하고 실제 JSP 내에서는 태그하나로 그 내용을 처리하고자 할 때 사용한다 . Custom Tag 의 장점
E N D
Custom Tag Internet Computing Laboratory @ KUT Youn-Hee Han
What is Custom Tag? • Custom Tag • 개발자가 필요에 의해서 자신이 스스로 개발하는 태그 • JSP 코드의 복잡성을줄여준다. • 주로, Action Tag나 EL 및 JSTL 등으로도 그 복잡성이 해결이 안되는 내용을 별도의 자바 소스로 처리하고 실제 JSP 내에서는 태그하나로 그 내용을 처리하고자 할 때 사용한다. • Custom Tag의 장점 • 한 번 작성한 커스텀 태그는 재사용이 가능하다. • 프로그램의 가독성을 향상 시킬 수 있다. • 업무의 효율성을 향상 시킬 수 있다. • 종류 • JSP 1.2 – 클래식 커스텀 태그 • JSP 2.0 – SimpleTag & Tag File
자바 클래스파일 TLD 파일 (.tld ) web.xml JSP 페이지 태그파일 (.tag) JSP 페이지 Custom Tag 구현 방법 • 구현방법 • 자바의 클래스 파일 기반으로 구현 (커스텀 태그 핸들러 이용) • JSP 1.2 기반의 클래식 커스텀 태그 • JSP 2.0 기반의 SimpleTag • 태그 파일 기반으로 구현 • JSP 2.0 기반의 태그 파일
수업시간에 다루는 내용 • 1. 커스텀 태그 라이브러리 • 1.1 커스텀 태그의 이익 • 1.2 커스텀 태그의 종류 • 1.3 커스텀 태그와 관련된 인터페이스 계층도 • 1.4 커스텀 태그의 구성 • 2. 클래식 커스텀 태그 구현 • 2.1 Tag 인터페이스와 IterationTag 인터페이스의 실행 방식 • 2.2 클래식, 단순 커스텀 태그 구현 • 2.3 클래식, 속성을 사용하는 커스텀 태그 • 2.4 클래식, 동적 속성을 사용하는 커스텀 태그(2.0) • 2.5 클래식, 액션 태그를 사용하는 커스텀 태그(2.0) • 2.6 클래식, 선택적으로 몸체 내용을 처리하는 커스텀 태그 • 2.7 클래식, 반복작업을 처리하는 커스텀 태그 • 2.8 클래식, 스크립트의 변수를 생성하는 커스텀 태그 • 2.9 클래식, 몸체 내용을 사용하는 커스텀 태그 • 2.10 클래식, 태그 간의 교류 • 2.11 예외 처리 태그
수업시간에 다루는 내용 • 3. JSP 2.0의 SimpleTag를 이용한 구현(2.0) • 3.1 SimpleTag의 기본 구현 방법 • 3.2 SimpleTag, 단순 커스텀 태그 및 속성을 사용하는 태그 구현 • 3.3 SimpleTag, 몸체 내용을 출력하는 커스텀 태그 • 3.4 SimpleTag, 반복 작업을 처리하는 커스텀 태그 • 3.5 SimpleTag, 스크립트의 변수를 생성하는 커스텀 태그 • 4. 손쉬운 커스텀 태그 구현: 태그 파일(2.0) • 5. TLD 파일 정리 • 6. 커스텀 태그 배포하기
Custom Tag 구현 방법 • Tag Handler 관련 클래스 계층도 Body 내용을 처리하지 않을 경우 사용 Body 내용을 처리할 경우 사용
자바 클래스파일 TLD 파일 (.tld) web.xml JSP 페이지 TagHandler:커스텀 태그 정의 ( 구조 , 로직 ) 자바클래스파일을 태그로 사용할 수 있도록 등록 JSP 페이지에서 사용할 수 있도록 TLD 파일 등록 JSP 페이지에서 태그 사용 WEB-INF\tlds 폴더에 저장한다. 클래스 파일 기반 구현 방법 • 자바의 클래스 파일 기반으로 구현 jsp2.0을 지원하는 tomcat부터는 생략가능
중요 사항 • Tag Handler 컴파일을 위한 sjc.bat 재정비 • Tag Handler의 중요 메소드 • doStartTag() • JSP 내에서 커스텀 태그의 시작 태그를 만날 때 호출 • doEndTag() • JSP 내에서 커스텀 태그의 끝 태그를 만날 때 호출 • doAfterBody() • 태그의 몸체 내용을 처리한 뒤 호출한다. • 이외 3,4개의 메소드 존재 (p.537의 표 20.1, 표 20.2) 참조 set CLASSPATH= set CLASSPATH=%CLASSPATH%;D:\jakarta-tomcat-5.0.19\webapps\2006777888\WEB-INF\classes;D:\jakarta-tomcat-5.0.19\common\lib\servlet-api.jar; D:\jakarta-tomcat-5.0.19\common\lib\jsp-api.jar javac -d D:\jakarta-tomcat-5.0.19\webapps\2006777888\WEB-INF\classes %1
Java 파일 • Tag Handler Java 파일 (p.539) /2006777888/WEB-INF/src/HeaderListTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderListTag extends TagSupport { public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); … … return SKIP_BODY; } public int doEndTag() throws JspException { … … return EVAL_PAGE; } }
Java 파일 • Tag Handler Java 파일에서 return 상수 의미
TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.542) /2006777888/WEB-INF/tlds/classicStyle.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 web-jsptaglibrary_2_0.xsd” version="2.0"> <description>클래식 스타일의 커스텀 태그 예제</description> <display-name>클래식스타일예제</display-name> <tlib-version>1.0</tlib-version> <short-name>classicStyle</short-name> <uri>http://javacan.madvirus.net/jsp/classicTag</uri> <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderListTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
JSP 파일 구성 방법 • 커스텀 태그 사용 JSP 예 (p.544) /2006777888/headerList.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>HeaderList</title></head> <body> 헤더 목록: <exam:headerList /> </body> </html> 개별적으로 알아서 붙여줌 tld 파일에서 <uri>…</uri>에 명시된 내용을 적어줌 tld 파일에서 <tag><name>…</name></tag>에 명시된 내용을 적어줌
Custom Tag 속성 처리 - Java 파일 • Tag Handler Java 파일 (p.546) /2006777888/WEB-INF/src/HeaderTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport { private String name; private String defaultValue; public void setName(String name) { this.name = name; } public void setDefault(String defaultValue) { this.defaultValue = defaultValue; } … … }
Custom Tag 속성 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.548) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderTag</tag-class> <body-content>empty</body-content> </tag> <tag> <name>header</name> <tag-class>kut.ime.tag.HeaderTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>default</name> <required>false</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> 필수 옵션
Custom Tag 속성 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 속성처리 /2006777888/header.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>Header</title></head> <body> accept-language: <exam:header name="accept-language" /> <br> no-header: <exam:header name="no-header" /> <br> no-header(with default): <exam:header name="no-header" default="지원안함"/> <br> </body> </html> tld 파일에서 <uri>…</uri>에 명시된 내용을 적어줌 tld 파일에서 <tag><name>…</name></tag>에 명시된 내용을 적어줌
Custom Tag 동적 속성 처리 - Java 파일 • Tag Handler Java 파일 (p.550) /2006777888/WEB-INF/src/DynamicTag.java package kut.ime.tag; import java.io.IOException; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.DynamicAttributes; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport implements DynamicAttributes{ private String kind; private Map dynamicAttr = new java.util.HashMap(); public void setKind(String value) { this.kind = value; } public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { dynamicAttr.put(localName, value); } … … }
Custom Tag 동적 속성 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.552) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>dynamicAttr</name> <tag-class>kut.ime.tag.DynamicTag</tag-class> <body-content>empty</body-content> <attribute> <name>kind</name> <required>true</required> </attribute> <dynamic-attributes>true</dynamic-attributes> </tag> </taglib>
Custom Tag 동적 속성 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 동적 속성처리 /2006777888/dynaic.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>동적 속성</title></head> <body> <exam:dynamicAttr kind=“색상“ red=“빨강” blue=“파랑” yellow=“노랑”/> <br> </body> </html>
Custom Tag 몸체 포함처리 - Java 파일 • Tag Handler Java 파일 (p.560) /2006777888/WEB-INF/src/isLoginTag.java package kut.ime.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; public class HeaderTag extends TagSupport { public int doStartTag() throws JspException { HttpSession session = pageContext.getSession(); if (session == null) { return SKIP_BODY; } if (session.getAttribute("MEMBERID") == null) { return SKIP_BODY; } else { return EVAL_BODY_INCLUDE; } } }
Custom Tag 몸체 포함 처리 - TLD 파일 • Tag Library Descriptor (TLD) 파일 (p.561) /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>isLogin</name> <tag-class>kut.ime.tag.IsLoginTag</tag-class> <body-content>JSP</body-content> </tag> </taglib>
Custom Tag 몸체포함 처리 – JSP 파일 • 커스텀 태그 사용 JSP 예 – 몸체 처리 /2006777888/login.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <% session.setAttribute("MEMBERID", "madvirus"); %> <exam:isLogin> 첫번째, 로그인하였습니다. </exam:isLogin> <% session.removeAttribute("MEMBERID"); %> <exam:isLogin> 두번째, 로그인하였습니다. </exam:isLogin> <p>두번째는 출력되지 않음. </body> </html>
Custom Tag 몸체 변경처리 - Java 파일 /2006777888/WEB-INF/src/BodyChangeTag.java • Tag Handler Java 파일 (교재 예제 아님, p574 참조) package kut.ime.tag; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; public class BodyChangeTag extends BodyTagSupport { public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } public int doEndTag() throws JspException { String content = bodyContent.getString(); if (content.equals("대한민국")) content = "Korea!!!"; if (content.equals("한국기술교육대학교")) content = "KUT!!!"; try { JspWriter out = pageContext.getOut(); out.print(content); } catch(IOException e) { throw new JspException(e); } return EVAL_PAGE; } }
Custom Tag 몸체 변경 처리 – TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • 커스텀 태그 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>bodychange</name> <tag-class>kut.ime.tag.BodyChangeTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> /2006777888/bodychange.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>BodyChange</title></head> <body> 사랑해요! <exam:bodychange>대한민국</exam:bodychange></BR> 사랑해요! <exam:bodychange>한국기술교육대학교</exam:bodychange> </body> </html>
문제: 구구단 출력 커스텀 태그 • 문제] 다음과 같은 JSP를 구성할 수 있는 커스텀 태그를 구성하기 <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <head><title>구구단</title></head> <body> <exam:gugu level=“2“/> <br> <exam:gugu level=“3“/> <br> <exam:gugu level=“4“/> <br> <exam:gugu level=“5“/> <br> . . . </body> </html>
JSP 2.0: SimpleTag사용 • SimpleTag를 사용한 Tag Handler 구현방법 • 실제 구현시에 SimpleTagSupport 클래스를 상속 받아 구현 • 하나의 메소드만 구현함 • 위 메소드는 커스텀 태그의 끝 태그를 만다면 실행 • 리턴형이 void임에 주의 • 즉, returnEVAL_PAGE 등의 코딩은 필요 없음 • 출력할 내용은 다음과 같은 코드를 사용하여 출력함 • 즉, pageContext 변수 활용 못함 public class MySimpleTag extends SimpleTagSupport { … } public void doTag() throws JspException, IOException getJspContext().getOut().print(“……..”);
JSP 2.0: SimpleTag사용 • SimpleTag를 사용한 Tag Handler 구현방법 • 몸체 내용은 getJspBody() 메소드를 통해 JspFragment로 전달받음 • 몸체내용을 아무 변경 없이 response로출력할 때 JspFragment의 invoke(null) 메소드 활용 • 몸체 내용을 저장하여 수정이 필요할 때… • 주의: 위와 같이 몸체 내용을 얻어올 때, 몸체 내용으로 JSP Script는 사용 못함 • 즉, SimpleTag를 사용할 때 <body-content> 값으로 JSP를 가질 수 없음 JspFragment body = getJspBody(); body.invoke(null); StringWriter writer = new StringWriter(); JspFragment body = getJspBody(); body.invoke(writer); String bodyText = writer.toString();
SimpleTag 사용한간단한태그 처리 - Java 파일 • Tag Handler Java 파일 (교재 예제 아님) /2006777888/WEB-INF/src/STag.java package kut.ime.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class STag extends SimpleTagSupport { public void doTag() throws JspException, IOException { getJspContext().getOut().print("Hello SimpleTag!"); } }
SimpleTag 사용한간단한태그 처리 - TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • SimpleTag 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>stag</name> <tag-class>kut.ime.tag.STag</tag-class> <body-content>empty</body-content> </tag> </taglib> /2006777888/simpletag.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <body> <exam:stag/> </body> </html>
SimpleTag 사용한몸체 변경처리 - Java 파일 • Tag Handler Java 파일 – 1/2(교재 예제 아님) /2006777888/WEB-INF/src/MySimpleTag.java package kut.ime.tag; import javax.servlet.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.util.StringTokenizer; import java.io.*; public class MySimpleTag extends SimpleTagSupport { private String elemSep = ","; private String lineSep = ";"; public void doTag() throws JspException, IOException { StringWriter writer = new StringWriter(); JspFragment body = getJspBody(); body.invoke(writer); String bodyText = writer.toString(); StringBuffer tableOut = new StringBuffer(); StringTokenizer bodyTk = new StringTokenizer(bodyText, lineSep);
SimpleTag 사용한몸체 변경처리 - Java 파일 • Tag Handler Java 파일 – 2/2(교재 예제 아님) /2006777888/WEB-INF/src/MySimpleTag.java tableOut.append("<TABLE>"); while (bodyTk.hasMoreTokens()) { String str = bodyTk.nextToken(); StringTokenizer token = new StringTokenizer(str, elemSep); tableOut.append("<TR>"); while(token.hasMoreTokens()) { tableOut.append("<TD>"); tableOut.append((String)token.nextToken()); tableOut.append("</TD>"); } tableOut.append("</TR>"); } tableOut.append("</TABLE>"); getJspContext().getOut().print(tableOut); } }
SimpleTag 사용한몸체 변경처리 - TLD & JSP 파일 • Tag Library Descriptor (TLD) 파일 • SimpleTag 사용 JSP 예 /2006777888/WEB-INF/tlds/classicStyle.tld … <tag> <name>changeTable</name> <tag-class>kut.ime.tag.MySimpleTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> /2006777888/tablechange.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" uri="http://javacan.madvirus.net/jsp/classicTag" %> <html> <body> <exam:changeTable> 1,2,3,4; 2,12,3,9; </exam:changeTable> </body> </html>
WEB-INF\tags 폴더에 저장한다. 태그파일 (.tag) JSP 페이지 태그 파일을 활용한 커스텀 태그 구현 • 특징 • JSP 2.0 기반에서 제공하는 방법이다. • 커스텀 태그를 정의한 태그 파일을 생성 후 JSP 페이지에서 해당 태그를 사용하는 방법이다. • 해당 태그파일이 내부적으로 태그 핸들러로 변환된다. • 태그파일명이 JSP에서 사용하는 태그이름이 된다.
tag 디렉티브 • 용도 • 태그 파일의 설정 정보를 기술하는데 사용된다. • 사용법 • <%@ tag import=“java.io.*” pageEncoding=“EUC-KR” %> • 속성들
Tag File 실습예제 – body가 없는 경우 Tag File JSP File /2006777888/WEB-INF/tags/FirstTag.tag <%@ tag body-content="empty" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 실습 예제입니다. /2006777888/FirstTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:FirstTag/> </body> </html>
Tag File 실습예제 – body가 있는 경우 Tag File JSP File /2006777888/WEB-INF/tags/SecondTag.tag <%@ tag body-content="scriptless" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 두번 째 실습 예제입니다. <jsp:doBody/> /2006777888/SecondTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:SecondTag>두번째 태그 파일!!!</exam:SecondTag> </body> </html>
attribute 디렉티브 • 용도 • 태그 파일에서 커스텀 태그의 속성을 명시한다. • 사용법 • <%@ attribute name=“size” %> • 속성들
Tag File 실습예제 – 속성 처리 Tag File JSP File /2006777888/WEB-INF/tags/ThirdTag.tag <%@ tag body-content="scriptless" pageEncoding="EUC-KR" %> <%@ tag isELIgnored="false" %> <%@ attribute name="size" %> <font size="${size}" %> 안녕하세요. Tag File 세번 째 실습 예제입니다. <jsp:doBody/> </font> /2006777888/SecondTagExam.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:ThirdTagsize="5">세번째 태그 파일!!!</exam:ThirdTag> </body> </html>
Dynamic Attribute • 동적속성으로만 접근 /2006777888/WEB-INF/tags/attrExam.tag <%@ tag body-content="empty" pageEncoding="euc-kr" %> <%@ tag dynamic-attributes="attr" %> ${attr.end}<BR> <c:out value="${attr.delimeter}"/><BR> ${attr.red}<BR> ${attr.blue}<BR> <c:out value="${attr.header}"/><BR> <c:out value="${attr.bottom}"/> <%--<%= end %>--%> /2006777888/tags/dynamicAttr.jsp <%@ page contentType = "text/html; charset=euc-kr" %> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %> <html> <body> <tf:attrExam end="4" delimeter="<br>" red="빨강!" blue="파랑“> <jsp:attribute name="header">속성 사용방법</jsp:attribute> <jsp:attribute name="bottom">예제 완료</jsp:attribute> </tf:attrExam> </body> </html>
Dynamic Attribute • 동적속성과정적 속성의 차이 /2006777888/WEB-INF/tags/attrExam.tag <%@ tag body-content="empty" pageEncoding="euc-kr" %> <%@ tag dynamic-attributes="attr" %> <%@ attribute name="end" required="true"%> <%@ attribute name="head" required="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 1. ${attr.end}<BR> 2. <c:out value="${attr.delimeter}"/><BR> 3. ${attr.red}<BR> 4. ${attr.blue}<BR> 5. <c:out value="${attr.head}"/><BR> 6. <c:out value="${attr.bottom}"/><BR> 7. <%= end %><BR> 8. <%= head %> 9. ${end} 10. ${head}