'2009/10'에 해당되는 글 6건

  1. 2009.10.12 스터디 09/05(JSP&servlet 커스텀태그) 수정중 by 대절님

//커스텀태그
 개발자가 직접 자신만의 태그를 만들어 사용하는것.
특징 :
 한번 작성해두면 재사용가능, 가독성 향상, jsp의 스크립트를 사용하지 않기떄문에 자바 문법에 의존적이지 않음
종류 : JSP1.2-클래식커스텀태그,  JSP 2.0=SimpleTag와 태그파일

구현 :
 1. 자바의 클래스 파일 기반으로 구현(커스텀 태그 핸들러 이용)
  자바 클래스 파일  <-->  TLD파일(.tld)  <-->  web.xml  <-->  JSP페이지
 2. 태그 파일 기반으로 구현(jsp 2.0)
  태그파일(.tag)  <--> JSP페이지


//커스텀 태그 핸들러 이용
  자바의 클래스 파일 기반 구현

자바클래스파일 - 실제적인 커스텀 태그 정의(구조, 로직)
     ↕
TLD파일(.tld) - 자바클래스 파일을 태그로 사용할수 있도록 등록 (WEB-INF\tlds폴더에 저장)
     ↕
web.xml - JSP페이지에서 사용할수 있도록 TLD파일 등록
     ↕
JSP페이지 - JSP페이지에서 태그 사용


/classpath설정
c:\Tomcat 5.0\common\lib\servlet-api.jar;c:\Tomcat 5.0\common\lib\jsp-api.jar

/javax.servlet.jsp.tagext 계층 구조

            <<JSP tag>>
           ↑        ↑
<<SimpleTag>>         <Tag>>
           △           ↑ 
SimpleTagSupprt       <<iterationTag>>   ◁┐
                        ↑                 │
                      <<BodyTag>>          │
                         △              TagSupport
                         │                  ↑          
                         └───────BodyTagSupport

<<>> : 인터페이스   △ : 구현

SimpleTag : 2.0추가
Tag : 1.2  - Body없는경우 사용
IterationTag 반복처리
BodyTag : Body가 있는 경우 사용

실제로 1.2버전을 이용해서 구현할때는  TagSupport나  BodyTagSupport 둘중 하나를 이용하면됨.
Body있는 경우 BodyTagSupport 없을 경우 TagSupport

2.0버전 SimpleTag는 1.2에서 사용한 모든 태그를 모두 포함한 API,   2.0(톰캣 5.X)일경우에는 SimpleTagSupport사용


/javax.servlet.jsp.tagext패키지 구조

interface  내용      버전
BodyTag   태그의 body내용이 있을경우 사용   JSP 1.2
IterationTag  반복적인 작업을 처리하는 경우 사용  JSP 1.2
SimpleTag  Tag, IterationTag를 하나로 묶어서 쉽게 구현 JSP 2.0
Tag   단순한 태그처리하는 경우 사용   JSP 1.2

클래스   내용      버전
TagSupport  Tag, IterationTag인터페이스를 미리구현  JSP 1.2
BodyTagSupport  BodyTag인터페이스를 미리 구현   JSP 1.2
SimpleTagSupport SimpleTag인터페이스를 미리 구현   JSP 2.0


예제 ) body가 없는 예제
ClassicTag.java핸들러 작성
classic.tld파일 작성
web.xml에서 tld등록
classic.jsp에서 태그 사용

*커스텀태그 핸들러 작성 ClassicTag.java
public class ClassicTag extends TagSupport{  //body없으므로
  public int doStartTag {
    pageContext.getOut().print('ClassicTag실습'); //문자열을 찍어줄때 pageContext.getOut()
    return SKIP_BODY;    //Body를 건너뛸때, 처리를 원할경우 EVAL_BODY_INCLUDE;
  }
}


*tld파일작성(classic.tld)
stand-examples의 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>
  Tag Library to support examples webapp
 </description>
 <tlib-version>1.1</tlib-version>
 <short-name>classicTag</short-name>

   <tag>
     <name>classic</name>
     <tag-class>test.web.ClassicTag</tag-class>
     <body-content>empty</body-content>
   </tag>
</taglib>

%tld 파일 저장 위치(컨테이너가 자동으로 인식)
WEB-INF안, WEB-INF의 하위디렉토리 안, WEB-INF/lib밑에 jar파일 배포(jar안 META-INF디렉토리),WEB-INF/lib밑에 jar파일 배포(jar안 META-INF의 하위 디렉토리)

%body-content Tag에 들어갈수 있는 값    설명
<body-content>empty</body-content>  몸체를 가질 수 없다.
<body-content>scriptless</body-content>  스크립팅은 사용할수 없다(스크립트릿 표현식 선언문)
<body-content>tagdependent</body-content> 태그 몸체를 문자열로 인식한다.
<body-content>JSP</body-content>  JSP안에 들어갈 수 있는 것은 무엇이든지 가능하다.


*web.xml 에 tld파일 등록  -->JSP 1.2버전, 2.0부턴 작성 X
<web-app>
 <taglib>
  <taglib-url>http://localhost/tag</taglib-url>
  <taglib-location>/WEB-INF/tlds/classic.tld</taglib-location>
 </taglib>
</web-app>


*jsp에서 tag사용
taglib directive태그 이용
<%@taglib prefix='접두사' uri='web.xml에서 설정된 uri값'%>


<%@taglib prefix='tag' uri='http://localhost/tag'%>

<tag:classic/>

 

/JSP 2.0에서 매핑
web.xml에 <taglib>를 사용할 필요 없음, 컨테이너가 자동으로 tld파일과 <uri>이름에 대한 매핑을 함.

*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>
  Tag Library to support examples webapp
 </description>
 <tlib-version>1.1</tlib-version>
 <short-name>classicTag</short-name>
 <uri>http://localhost/tag</uri>                             //이부분이 2.0에 추가하면 jsp에서 선언하고 바로 사용가능

   <tag>
     <name>classic</name>
     <tag-class>test.web.ClassicTag</tag-class>
     <body-content>empty</body-content>
   </tag>
</taglib>

 

예제) body가있는 예제
ClassicBodyTag.java핸들러 작성
classicBody.tld파일 작성
classicBody.jsp에서 태그 사용

*ClassicBodyTag.java
public class ClassicTag extends BodyTagSupport{  //body가 있으므로
  public int doStartTag {
    pageContext.getOut().print('ClassicTag실습'); //문자열을 찍어줄때 pageContext.getOut()
    return EVAL_BODY_INCLUDE;    //Body가 없을 경우->SKIP_BODY
  }
}

*classicBody.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>
  Tag Library to support examples webapp
 </description>
 <tlib-version>1.1</tlib-version>
 <short-name>classicTag</short-name>
 <uri>http://localhost/Bodytag</uri>                             //이부분이 2.0에 추가하면 jsp에서 선언하고 바로 사용가능

   <tag>
     <name>classicBody</name>
     <tag-class>test.web.ClassicBodyTag</tag-class>
     <body-content>JSP</body-content>    //body안에서 JSP사용
   </tag>
</taglib>

*jsp에서 tag사용
<%@ taglib prefix='tag' uri='http://localhost/Bodytag %>

<tag:classicBody>강대철님</tag:classicBody>

 

//jsp2.0 기반 구현
JSP1.2 에서는 body의 처리유무에 따라서 TagSupport또는 BodyTagSupport클래스를 선택해야 된다.
JSP2.0에서는 body처리유무에 상관없이 SimpleTag인터페이스에서 처리
실제 구현은 SimpleTagSupport클래스를 상속받아 커스텀태그 핸들러 작성

doStart() + doEnd()를 합친것이 2.0에서는 doTag()

예제) body가 없는 JSP 2.0기반 커스텀 태그
SimpleTag.java핸들러 작성
simple.tld파일 작성
simple.jsp에서 태그 사용

*SimpleTag.java
public class SimpleTag extends SimpleTagSupport{  //2.0에서는 SimpleTag이용
 public void doTag(){      
  getJstpContext().getOut().print('SimpleTag실습 예제');
 }
}


31''

*simple.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>
  Tag Library to support examples webapp
 </description>
 <tlib-version>1.1</tlib-version>
 <short-name>classicTag</short-name>
 <uri>http://localhost/Bodytag</uri>                             //이부분이 2.0에 추가하면 jsp에서 선언하고 바로 사용가능

   <tag>
     <name>classicBody</name>
     <tag-class>test.web.ClassicBodyTag</tag-class>
     <body-content>JSP</body-content>    //body안에서 JSP사용
   </tag>
</taglib>

 

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 대절님

댓글을 달아 주세요



티스토리 툴바