Presentation is loading. Please wait.

Presentation is loading. Please wait.

Internet Computing KUT Youn-Hee Han

Similar presentations


Presentation on theme: "Internet Computing KUT Youn-Hee Han"— Presentation transcript:

1 Internet Computing Laboratory @ KUT Youn-Hee Han
Custom Tag Internet Computing KUT Youn-Hee Han

2 What is Custom Tag? Custom Tag Custom Tag의 장점 종류
개발자가 필요에 의해서 자신이 스스로 개발하는 태그 JSP 코드의 복잡성을 줄여준다. 주로, Action Tag나 EL 및 JSTL 등으로도 그 복잡성이 해결이 안되는 내용을 별도의 자바 소스로 처리하고 실제 JSP 내에서는 태그하나로 그 내용을 처리하고자 할 때 사용한다. Custom Tag의 장점 한 번 작성한 커스텀 태그는 재사용이 가능하다. 프로그램의 가독성을 향상 시킬 수 있다. 업무의 효율성을 향상 시킬 수 있다. 종류 JSP 1.2 – 클래식 커스텀 태그 JSP 2.0 – SimpleTag & Tag File

3 Custom Tag 구현 방법 구현 방법 자바의 클래스 파일 기반으로 구현 (커스텀 태그 핸들러 이용)
JSP 1.2 기반의 클래식 커스텀 태그 JSP 2.0 기반의 SimpleTag 태그 파일 기반으로 구현 JSP 2.0 기반의 태그 파일 자바 클래스파일 TLD 파일 (.tld ) web.xml JSP 페이지 태그파일 (.tag) JSP 페이지

4 수업시간에 다루는 내용 1. 커스텀 태그 라이브러리 2. 클래식 커스텀 태그 구현 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 예외 처리 태그

5 수업시간에 다루는 내용 3. JSP 2.0의 SimpleTag를 이용한 구현(2.0)
4. 손쉬운 커스텀 태그 구현: 태그 파일(2.0) 5. TLD 파일 정리 6. 커스텀 태그 배포하기

6 자바의 클래스 파일 기반 구현 - JSP 1.2 기법 -

7 Custom Tag 구현 방법 Tag Handler 관련 클래스 계층도 Body 내용을 처리하지 않을 경우 사용

8 클래스 파일 기반 구현 방법 자바의 클래스 파일 기반으로 구현 자바 클래스파일 TLD 파일 (.tld) web.xml JSP
jsp2.0을 지원하는 tomcat부터는 생략가능 자바 클래스파일 TLD 파일 (.tld) web.xml JSP 페이지 TagHandler: 커스텀 태그 정의 ( 구조 , 로직 ) 자바클래스파일을 태그로 사용할 수 있도록 등록 JSP 페이지에서 사용할 수 있도록 TLD 파일 등록 태그 사용 WEB-INF\tlds 폴더에 저장한다.

9 중요 사항 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 \webapps\ \WEB-INF\classes;D:\jakarta-tomcat \common\lib\servlet-api.jar; D:\jakarta-tomcat \common\lib\jsp-api.jar javac -d D:\jakarta-tomcat \webapps\ \WEB-INF\classes %1

10 Java 파일 Tag Handler Java 파일 (p.539)
/ /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;

11 Java 파일 Tag Handler Java 파일에서 return 상수 의미

12 TLD 파일 Tag Library Descriptor (TLD) 파일 (p.542)
/ /WEB-INF/tlds/classicStyle.tld <?xml version="1.0" encoding="euc-kr" ?> <taglib xmlns=" xmlns:xsi=" xsi:schemaLocation=" 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> <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderListTag</tag-class> <body-content>empty</body-content> </tag> </taglib>

13 JSP 파일 구성 방법 커스텀 태그 사용 JSP 예 (p.544) /2006777888/headerList.jsp
page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <html> <head><title>HeaderList</title></head> <body> 헤더 목록: <exam:headerList /> </body> </html> 개별적으로 알아서 붙여줌 tld 파일에서 <uri>…</uri>에 명시된 내용을 적어줌 tld 파일에서 <tag><name>…</name></tag>에 명시된 내용을 적어줌

14 Custom Tag 속성 처리 - Java 파일
Tag Handler Java 파일 (p.546) / /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;

15 Custom Tag 속성 처리 - TLD 파일 Tag Library Descriptor (TLD) 파일 (p.548)
/ /WEB-INF/tlds/classicStyle.tld <tag> <name>headerList</name> <tag-class>kut.ime.tag.HeaderTag</tag-class> <body-content>empty</body-content> </tag> <name>header</name> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <name>default</name> <required>false</required> </taglib> 필수 옵션

16 Custom Tag 속성 처리 – JSP 파일 커스텀 태그 사용 JSP 예 – 속성 처리
/ /header.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <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>에 명시된 내용을 적어줌

17 Custom Tag 동적 속성 처리 - Java 파일
Tag Handler Java 파일 (p.550) / /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);

18 Custom Tag 동적 속성 처리 - TLD 파일
Tag Library Descriptor (TLD) 파일 (p.552) / /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>

19 Custom Tag 동적 속성 처리 – JSP 파일
/ /dynaic.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <html> <head><title>동적 속성</title></head> <body> <exam:dynamicAttr kind=“색상“ red=“빨강” blue=“파랑” yellow=“노랑”/> <br> </body> </html>

20 Custom Tag 몸체 포함 처리 - Java 파일
Tag Handler Java 파일 (p.560) / /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) { } else { return EVAL_BODY_INCLUDE;

21 Custom Tag 몸체 포함 처리 - TLD 파일
Tag Library Descriptor (TLD) 파일 (p.561) / /WEB-INF/tlds/classicStyle.tld <tag> <name>isLogin</name> <tag-class>kut.ime.tag.IsLoginTag</tag-class> <body-content>JSP</body-content> </tag> </taglib>

22 Custom Tag 몸체 포함 처리 – JSP 파일
/ /login.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <% session.setAttribute("MEMBERID", "madvirus"); %> <exam:isLogin> 첫번째, 로그인하였습니다. </exam:isLogin> session.removeAttribute("MEMBERID"); 두번째, 로그인하였습니다. <p>두번째는 출력되지 않음. </body> </html>

23 Custom Tag 몸체 변경 처리 - Java 파일
/ /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;

24 Custom Tag 몸체 변경 처리 – TLD & JSP 파일
Tag Library Descriptor (TLD) 파일 커스텀 태그 사용 JSP 예 / /WEB-INF/tlds/classicStyle.tld <tag> <name>bodychange</name> <tag-class>kut.ime.tag.BodyChangeTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> / /bodychange.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <html> <head><title>BodyChange</title></head> <body> 사랑해요! <exam:bodychange>대한민국</exam:bodychange></BR> 사랑해요! <exam:bodychange>한국기술교육대학교</exam:bodychange> </body> </html>

25 문제: 구구단 출력 커스텀 태그 문제] 다음과 같은 JSP를 구성할 수 있는 커스텀 태그를 구성하기
page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <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>

26 자바의 클래스 파일 기반 구현 - JSP 2.0 기법 -

27 JSP 2.0: SimpleTag사용 SimpleTag를 사용한 Tag Handler 구현방법
실제 구현시에 SimpleTagSupport 클래스를 상속 받아 구현 하나의 메소드만 구현함 위 메소드는 커스텀 태그의 끝 태그를 만다면 실행 리턴형이 void임에 주의 즉, return EVAL_PAGE 등의 코딩은 필요 없음 출력할 내용은 다음과 같은 코드를 사용하여 출력함 즉, pageContext 변수 활용 못함 public class MySimpleTag extends SimpleTagSupport { … } public void doTag() throws JspException, IOException getJspContext().getOut().print(“……..”);

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

29 SimpleTag 사용한 간단한 태그 처리 - Java 파일
Tag Handler Java 파일 (교재 예제 아님) / /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!"); }

30 SimpleTag 사용한 간단한 태그 처리 - TLD & JSP 파일
Tag Library Descriptor (TLD) 파일 SimpleTag 사용 JSP 예 / /WEB-INF/tlds/classicStyle.tld <tag> <name>stag</name> <tag-class>kut.ime.tag.STag</tag-class> <body-content>empty</body-content> </tag> </taglib> / /simpletag.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <html> <body> <exam:stag/> </body> </html>

31 SimpleTag 사용한 몸체 변경 처리 - Java 파일
Tag Handler Java 파일 – 1/2 (교재 예제 아님) / /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);

32 SimpleTag 사용한 몸체 변경 처리 - Java 파일
Tag Handler Java 파일 – 2/2 (교재 예제 아님) / /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);

33 SimpleTag 사용한 몸체 변경 처리 - TLD & JSP 파일
Tag Library Descriptor (TLD) 파일 SimpleTag 사용 JSP 예 / /WEB-INF/tlds/classicStyle.tld <tag> <name>changeTable</name> <tag-class>kut.ime.tag.MySimpleTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib> / /tablechange.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" uri=" %> <html> <body> <exam:changeTable> 1,2,3,4; 2,12,3,9; </exam:changeTable> </body> </html>

34 Tag File - JSP 2.0 기법 -

35 태그 파일을 활용한 커스텀 태그 구현 특징 JSP 2.0 기반에서 제공하는 방법이다.
해당 태그파일이 내부적으로 태그 핸들러로 변환된다. 태그파일명이 JSP에서 사용하는 태그이름이 된다. 태그파일 (.tag) JSP 페이지 WEB-INF\tags 폴더에 저장한다.

36 tag 디렉티브 용도 사용법 속성들 태그 파일의 설정 정보를 기술하는데 사용된다.
tag import=“java.io.*” pageEncoding=“EUC-KR” %> 속성들

37 Tag File 실습 예제 – body가 없는 경우
JSP File / /WEB-INF/tags/FirstTag.tag tag body-content="empty" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 실습 예제입니다. / /FirstTagExam.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:FirstTag/> </body> </html>

38 Tag File 실습 예제 – body가 있는 경우
JSP File / /WEB-INF/tags/SecondTag.tag tag body-content="scriptless" pageEncoding="EUC-KR" %> 안녕하세요. Tag File 두번 째 실습 예제입니다. <jsp:doBody/> / /SecondTagExam.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:SecondTag>두번째 태그 파일!!!</exam:SecondTag> </body> </html>

39 attribute 디렉티브 용도 사용법 속성들 태그 파일에서 커스텀 태그의 속성을 명시한다.
attribute name=“size” %> 속성들

40 Tag File 실습 예제 – 속성 처리 Tag File JSP File
/ /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> / /SecondTagExam.jsp page contentType = "text/html; charset=euc-kr" %> taglib prefix="exam" tagdir="/WEB-INF/tags" %> <html> <body> <exam:ThirdTag size="5">세번째 태그 파일!!!</exam:ThirdTag> </body> </html>

41 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 %>--%> / /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>

42 Dynamic Attribute 동적 속성과 정적 속성의 차이
/ /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=" %> 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}


Download ppt "Internet Computing KUT Youn-Hee Han"

Similar presentations


Ads by Google