서블릿 11장

Recursion_Error·2023년 6월 3일
0

커스텀 태그 Custom Tag

개발자가 원하는 기능을 수행하는 액션태그를 직접 개발할 수 있는 방법

커스텀태그를 개발하는 방법 - 클래스 파일 기반 개발 방법

커스텀 태그를 자바 클래로 구현, 액션태그를 JSP문서에 생성해 사용

클래스 파일 기반 개발 방법 구성요소 - 태그 핸들러 클래스 Tag Handler Class

커스텀 태그의 기능을 구현하는 자바클래스

simpleTagSupport 클래스를 상속받아 구현

하나의 커스텀태그마다 하나의 태그 핸들러 클래스 존재
/* 태그 핸들러 클래스 구조 */
public class 클래스이름 extends SimpleTagSupport {
	/* doTag()는 인자를 가질 수 없음 */
	public void doTag() throws JspException, IOException{
    	//커스텀 태그 기능
    }
}

태그핸들러클래스 주요객체, 메서드

  • JspContext 객체
    : 현재 JSP 문서 정보를 가지고 있는 객체
    simpleTagSupport 객체의 getJspContext() 메서드에 의해 생성
JspContext context = this.getJspContext();
  • JspWriter 객체
    : JSP 문서와 클라이언트 사이의 출력 스트림을 생성하는 객체
    JspContext 객체의 getOut() 메서드에 의해 생성
JspWriter out = context.getOut();
  • Jspfragment 객체
    : 커스텀태그의 몸체 처리를 위한 객체
    SimpleTagSupport 객체의 getJspBody() 메서드에 의해 생성

  • invoke() 메서드
    : 커스텀태그의 몸체를 읽어들이는 기능
    invoke 인자로 StringWriter 객체가 주로 사용

JspFragment body = this.getJspBody();
StringWriter stringWriter = new StringWriter();
body.invoke(stringWriter); //JspFragment가 제공

클래스 파일 기반 개발 방법 구성요소 - 태그 라이브러리 디스크립터 Tag Library Descriptor

태그 핸들러클래스와 액션태그 이름을 연결해 주는 XML파일
하나의 TLD내에 여러 개의 연결이 존재0
tld 확장자를 가짐
<tag>
  <name> 태그 이름 </name>
  <tag-class> 태그 핸들러 클래스 </tag-class>
  <body-content> 몸체 존재 여부 </body-content>
  <attribute>
    <name> 속성 이름 </name>
    <required> 필수 여부 </required>
    <rtexprvalue> 동정 데이터 사용 여부 </rtexprvalue>
    <type> 속성 값의 클래스 타입 </type>
  </attribute>
</tag>

클래스 파일 기반 개발 방법 구성요소 - taglib 지시문

커스텀태그의 prefix와 TLD를 연결
<%@ taglib prefix = "prefix 이름" uri = "TLD 이름" %>

prefix : 커스텀 태그의 prefix 이름을 지정 (임의 지정0)
uri : TLD의 위치와 이름 지정

몸체 있는 커스텀 태그 구현

/* 태그 핸들러 클래스 */
public class ClassCustomTag2 extends SimpleTagSupport{
	
	public void doTag() throws JspException, IOException{
		
        //문서 정보를 포함하는 객체와 출력을 위한 객체 생성
		JspContext context = this.getJspContext();
		JspWriter out = context.getOut();
		
        //몸체 처리를 위해 객체 생성
		JspFragment body = this.getJspBody();
		
        //몸체의 문자열 읽어 stringWriter에 출력
		StringWriter stringWriter = new StringWriter();
		body.invoke(stringWriter);
		
        //stringWriter 객체에 출력된 내용 문자열로 반환
		String str = stringWriter.toString();
		
        //커스텀 태그 기능 구현
		String UpperStr = str.toUpperCase();
		
		for(int i=0; i<3; i++) {
			out.println("" + UpperStr + " ");
		}
		
		out.println("<br>");
	}
}
<!-- 태그 라이브 디스크립터 -->
 <tag>
  	<name>upper</name>
  	<tag-class>chapter11.ClassCustomTag2</tag-class>
    
    <!-- 몸체가 있으므로 scriptless로 지정 --> 
  	<body-content>scriptless</body-content>
  </tag>
<!-- jsp 파일 -->
<b> upper 커스텀 태그 실행 </b> <br>
<my:upper> custom tag </my:upper>

커스텀태그를 개발하는 방법 - 태그 파일 기반 개발 방법

태그파일 확장자는 tag

태그파일기반 - taglib 지시문

<%@ taglib tagdir = "태그 파일의 위치" prefix = "prefix 이름" %>

몸체 처리

  • tag 지시문의 body-content 속성
    : scriptless ( 몸체 내 EL만 사용 가능 ), tagdependent ( 모두 문자열로 간주 )

  • <jsp:doBody> 태그
    : 몸체를 읽어 들이기 위해 사용

profile
무한으로 돌리는 . . .

0개의 댓글