English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

JSP 커스텀 태그

사용자 정의 태그는 사용자가 정의한 JSP 언어 요소입니다. JSP 페이지에 사용자 정의 태그가 포함되면 태그는 servlet로 변환되고, 태그는 대상으로 변환됩니다.    tag handler 객체의 작업이며, servlet이 실행될 때 웹 컨테이너가 이러한 작업을 호출합니다.

JSP 태그 확장은 새로운 태그를 생성하고 JSP 페이지에 직접 삽입할 수 있게 합니다. JSP 2JSP 2.0 규范에서 Simple Tag Handlers를 도입하여 이러한 사용자 정의 태그를 작성할 수 있습니다.

SimpleTagSupport 클래스를 상속하고 doTag() 메서드를 재정의하여 가장 간단한 사용자 정의 태그를 개발할 수 있습니다.

"Hello" 태그 생성

다음은 사용자 정의 태그 <ex:Hello>를 생성하려면, 다음과 같은 형식으로 합니다:

<ex:Hello />

사용자 정의 JSP 태그를 생성하려면, 먼저 태그를 처리하는 Java 클래스를 생성해야 합니다. 따라서, HelloTag 클래스를 생성하겠습니다. 다음과 같이 합니다:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    JspWriter out = getJspContext().getOut();
    out.println("Hello Custom Tag!");
  }
}

다음 코드는 doTag() 메서드를 재정의하여 getJspContext() 메서드를 사용하여 현재의 JspContext 객체를 가져오고 "Hello Custom Tag!"을 JspWriter 객체에 전달합니다.

위 클래스를 컴파일하고 CLASSPATH 디렉토리에 복사합니다. 마지막으로 다음과 같은 태그 라이브러리를 생성합니다: <Tomcat 설치 디렉토리>webapps\ROOT\WEB-INF\custom.tld。

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

그래서 이제 JSP 파일에서 Hello 태그를 사용할 수 있습니다:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello/>
  </body>
</html>

위 프로그램의 출력 결과는 다음과 같습니다:

Hello Custom Tag!

태그 본문 접근

태그에서 메시지 내용을 포함할 수 있습니다. 예를 들어, 우리가自定义의 Hello에 내용을 포함하려면 다음과 같은 형식으로 합니다:

<ex:Hello>
   This is message body
</ex:Hello>

태그 처리 클래스 파일을 수정할 수 있습니다. 코드는 다음과 같습니다:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       getJspBody().invoke(sw);
       getJspContext().getOut().println(sw.toString());
    }
}

다음은 TLD 파일을 수정하는 방법입니다:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

이제 수정된 태그를 JSP에서 사용할 수 있습니다. 다음과 같이 사용할 수 있습니다:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello>
        This is message body
    </ex:Hello>
  </body>
</html>

위 프로그램의 출력 결과는 다음과 같습니다:

This is message body

사용자 정의 태그 속성

사용자 정의 표준에서 다양한 속성을 설정할 수 있습니다. 속성을 수신하려면, 값이 사용자 정의 태그 클래스에서 setter 메서드를 구현해야 합니다. JavaBean의 setter 메서드는 다음과 같습니다:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
   private String message;
   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       if (message != null) {
          /* 속성에서 메시지 사용 */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* 내용체에서 메시지 사용 */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }
}

속성의 이름은 "message"이므로 setter 메서드는 setMessage()입니다. 이제 TLD 파일에서 <attribute> 요소에 이 속성을 추가해 보겠습니다:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

지금부터 JSP 파일에서 message 속성을 사용할 수 있습니다. 예를 들어:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello message="This is custom tag" />
  </body>
</html>

위의 예제 데이터 출력 결과는 다음과 같습니다:

This is custom tag

다음과 같은 속성을 포함할 수 있습니다:

속성설명
name속성의 이름을 정의합니다. 각 태그의 속성 이름은 유일해야 합니다.
required속성이 필수적이거나 선택적인지를 지정합니다. false로 설정되면 선택적입니다.
rtexprvalue표현식을 실행할 때, 태그 속성이 유효한지를 선언합니다.
type이 속성의 Java 클래스 타입을 정의합니다. 기본적으로 설정됩니다. String
description설명 정보로 간주됩니다
fragment이 속성이 선언되면, 속성 값은 JspFragment

다음은 지정된 속성 예제입니다:

.....
    <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
    </attribute>
.....

만약 두 가지 속성을 사용했다면, 다음과 같이 TLD 파일을 수정하세요:

.....
    <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
    </attribute>
    <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
    </attribute>
.....