I.                    들어가면서

JSP 의 장점이라면 비즈니스 로직과 프리젠테이션 로직의 분리라 할 수 있습니다.

, 개발자와 디자이너의 역할을 완전히 분리하여 개발자는 동적인 페이지 구성을 위한

내부 로직에만 전념할 수 있으며 디자이너는 HTML의 구성에만 전념할 수 있다는 것입니다.

또한 페이지 디자인이 바뀔 경우 개발자가 참여하는 것이 아니라 디자이너가 단독으로 처리

할 수 있다는 것입니다. 그리고, 페이지에 문제가 발생했을 경우 개발자가 페이지를 수정하는

것이 아니라 빈즈와 Tag Handler 클래스만 수정하면 되는 장점도 있습니다.

이러한 것은 Custom Tag Library를 통해 가능한 것입니다.

 

물론, Custom Tag Library를 만들려면 ASP나 PHP에 비해 훨씬 많은 코딩이 필요하지만 추후 위에 언급한 점들을 생각한다면

충분히 그 역할을 하지 않을까 생각합니다.

모든 페이지에 Custom Tag Library를 적용하는건 무리 일수도 있기 때문에 프로젝트의 범위와 기능을 생각해서 조화롭게 사용해야 할 것입니다.

 

이번 강좌에서는 이러한 Tag 에 대해서 알아 보겠습니다.

 

본 강좌의 내용은 Orion 사의 튜토리얼 을 번역 및 수정 했음을 밝히는 바 입니다.

저작권에 문제가 된다면 알려주시기 바랍니다.

 

II.                  Tag 란 무엇인가??

태그는 javax.servlet.jsp.tagext.Tag 인터페이스를 구현한 클래스이다.

태그는 JSP페이지에서 사용되는 기능들을 캡슐화 하여 사용되는데 그 예로는 조건분기,데이터베이스 Access , 반복등이 그것에 속한다.

태그는 BodyTag , Tag(= Simple Tag – 단순태그)로 나뉘어 지는데 이번 장에서는 단순태그만을 논하도록 하겠다.

 

Tag 는 한번만 수행되는 반면에 BodyTag 는 여러 번 수행될수 있다.

 

III.                Tag 의 작동 메커니즘

1.현재 pageContext를 설정하기 위해 setPageContext() 를 사용한다.

2.연관된 Tag 의 부모를 설정하기 위해 setParent()를 사용한다.

3.attribute 설정

4.doStartTag() 호출 – EVAL_BODY_INCLUDE 와 SKIP_BODY를 리턴하며, EVAL_BODY_INCLUDE를 리턴하면

몸체를 수행하며 SKIP_BODY를 리턴하면 몸체를 수행하지 않는다.

5.doEndTag() 호출 – EVAL_PAGE 와 SKIP_PAGE를 리턴하며, EVAL_PAGE를 리턴하면

JSP페이지 수행을 계속하며 SKIP_PAGE를 리턴하면 페이지 수행을 멈춘다.

6.release() 호출 – Tag가 사용한 자원을 자원을 정리하도록 하는 메서드

 

예외발생)

doStartTag() , doEndTag() => JspTagException 발생

 

IV.               HelloWorld Tag 의 작성

tag.HelloWorldTag

-pageContext:PageContext
-parent:Tag

+HelloWorldTag()
+doStartTag():int
+doEndTag():int
+release():void
+setPageContext(pageContext:javax.servlet.jsp.PageContext):void
+setParent(parent:javax.servlet.jsp.tagext.Tag):void

+getParent():javax.servlet.jsp.tagext.Tag

 

 

 

 

 

 

 

 

 

 

 

          

 

Interface

javax.servlet.jsp.tagext.Tag

 

 

 

           (참고) 원문의 도표와 화살표는 UML 표기법으로 작성되어 있음

          

           위의 메서드나열순서대로 Tag Handler 클래스를 작성한다.

            

             <HelloWorldTag.java>

 

package tag.HelloWorldTag;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

 

// 몸체가 없는 태그 핸들러 클래스 이므로 Tag 인터페이스를 구현한다.

public class HelloWorldTag implements Tag{

       // 멤버 변수 선언

       private PageContext pageContext;

       private Tag parent;

      

       public HelloWorldTag(){super();}

 

       // 몸체를 처리하지 않으므로 SKIP_BODY를 리턴하도록 한다.

       // 앞서 설명했듯이 예외처리도 하도록 한다.

       public int doStartTag() throws javax.servlet.jsp.JspTagException{

                    return SKIP_BODY;

       }

 

       // JSP페이지의 나머지 부분이 처리되도록 EVAL_PAGE를 리턴한다.

       public int doEndTag() throws javax.servlet.jsp.JspTagException{

                    return EVAL_PAGE;           

}

public void release(){}

// JSP 컨테이너에의하여 호출되며 Tag 의 PageContext를 설정하는데 사용된다.

// 일단 Tag는 자신의 PageContext를 기억하고 있다는 사실만을 알아두도록하자

public void setPageContext(final javax.servlet.jsp.PageContext pageContext){

             this.pageContext = pageContext;

}

 

// 중첩연관태그에 사용되는 메서드 이다. 이후의 문서에서 다룰 것이다.

public javax.servlet.jsp.tagext.Tag getParent(){

             return parent;

}

 

V.                 태그핸들러 Descriptor 작성

<mytag.tld>

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE taglib      

       PUBLIC "-//Sun MicroSystems, Inc. //DTD JSP Tag Library 1.1//EN"       

       "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

 

<taglib>

       <tlibversion>1.0</tlibversion>

       <jspversion>1.1</jspversion>

       <shortname>mt</shortname>

       <uri>WEB-INF/tlds/mytag.tld</uri>

       <info>My First Tag Library</info>

       <tag>

                    <name>helloworld</name>

                    <tagclass>tag.HelloWorldTag</tagclass>

                    <info>A Hello World Tag</info>

       </tag>

</taglib>

 

VI.               web.xml 에 태그라이브러리 설명자 파일 등록

<web.xml>

 

<?xml version="1.0" encoding="ISO-8859-1"?>

 

<!DOCTYPE web-app

    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

 

<web-app>

       <taglib>

                    <taglib-uri>taglibExample</taglib-uri>

                    <taglib-location>/WEB-INF/tlds/mytag.tld</taglib-location>

       </taglib> 

</web-app>

 

VII.             Tag 핸들러 사용하기

<helloWorld.jsp>

 

<%@ page contentType=”text/html;charset=EUC-KR” %>

<%@ taglib uri=”taglibExample” prefix=”mt”%>

<HTML>

<HEAD>

<TITLE>Hello World!</TITLE>

</HEAD>
<BODY BGCOLOR="#FFFFFF">

<HR>
<mt:helloWorld/>
<HR>

</BODY>

</HTML>

 

(주의) taglib 의 uri는 web.xml에 등록된 설명자 파일의 uri와 일치시키도록 한다.

원문튜토리얼의 경우 web.xml에 태그라이브러리 설명자 파일 등록과정이 생략되고

대신 jsp파일의 uri 설정부분을 바로 태그라이브러리 설명자 파일과 매핑을 시켜주었다.

 

(작업디렉토리예)

tomcat           – webapps

                                 -tag_tu ( helloWorld.jsp)

                                               -WEB-INF (web.xml)

                                                            -classes

                                                                         -tag (HelloWorldTag.class)

                                                            -tlds (mytag.tld)

      

브라우저로 결과를 확인하시 바란다.

http://localhost/tag_tu/helloWorld.jsp                   

 

(사설) 기존의 커스텀 태그핸들러 부분에 대해 설명된 문서를 찾아보았지만,

커스텀태그 메커니즘에 가장 충실했던 문서는 오라이온사의 튜토리얼 인 것 같다.

사실 커스텀태그를 작성하는것도 중요하지만 기본 메커니즘에 충실하지 않으면 이해되지 않는 부분이 상당수 있을 것 같다.

결과확인도 중요하지만 기본 메커니즘을 확실히 이해하기 바란다(특히 작동 순서..)

 

본 강좌의 내용은 Orion 사의 튜토리얼 을 번역 및 수정 했음을 밝히는 바 입니다.

저작권에 문제가 된다면 알려주시기 바랍니다