JSP-사용자 정의 태그

이 장에서는 JSP의 사용자 정의 태그에 대해 설명합니다. 사용자 정의 태그는 사용자 정의 JSP 언어 요소입니다. 사용자 정의 태그를 포함하는 JSP 페이지가 서블릿으로 변환 될 때 태그는 태그 핸들러라는 객체에 대한 작업으로 변환됩니다. 그런 다음 웹 컨테이너는 JSP 페이지의 서블릿이 실행될 때 해당 작업을 호출합니다.

JSP 태그 확장을 사용하면 JavaServer 페이지에 직접 삽입 할 수있는 새 태그를 만들 수 있습니다. JSP 2.0 사양은 이러한 사용자 정의 태그를 작성하기위한 단순 태그 핸들러를 도입했습니다.

맞춤 태그를 작성하려면 간단히 SimpleTagSupport 클래스 및 재정의 doTag() 태그에 대한 콘텐츠를 생성하는 코드를 배치 할 수 있습니다.

"Hello"태그 생성

<ex : Hello>라는 이름의 사용자 지정 태그를 정의하고 본문없이 다음과 같은 방식으로 사용하고 싶다고 생각합니다.

<ex:Hello />

사용자 정의 JSP 태그를 생성하려면 먼저 태그 핸들러 역할을하는 Java 클래스를 생성해야합니다. 이제HelloTag 다음과 같이 클래스-

package com.tutorialspoint;

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() 메소드는 다음을 사용하여 현재 JspContext 객체를받습니다. getJspContext() 방법을 사용하여 "Hello Custom Tag!" 현재까지 JspWriter 목적

위의 클래스를 컴파일하고 환경 변수 CLASSPATH에서 사용할 수있는 디렉토리에 복사 해 보겠습니다. 마지막으로 다음 태그 라이브러리 파일을 만듭니다.<Tomcat-Installation-Directory>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.tutorialspoint.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

이제 위에서 정의한 맞춤 태그를 사용하겠습니다. Hello 다음과 같이 JSP 프로그램에서-

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello/>
   </body>
</html>

위의 JSP를 호출하면 다음 결과가 생성됩니다.

Hello Custom Tag!

태그 본문에 액세스

표준 태그에서 본 것처럼 태그 본문에 메시지를 포함 할 수 있습니다. 이름이 지정된 사용자 정의 태그를 정의하려는 경우<ex:Hello> 몸에 다음과 같은 방식으로 사용하고 싶습니다.

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

태그의 본문을 처리하기 위해 위의 태그 코드를 다음과 같이 변경합니다.

package com.tutorialspoint;

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

여기에서 호출 결과 출력은 먼저 StringWriter태그와 관련된 JspWriter에 기록되기 전에 다음과 같이 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.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
   </tag>
</taglib>

이제 다음과 같이 적절한 본문으로 위의 태그를 호출하겠습니다.

<%@ 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.tutorialspoint;

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) {
         /* Use message from attribute */
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
         /* use message from the body */
         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.tutorialspoint.HelloTag</tag-class>
      <body-content>scriptless</body-content>
      
      <attribute>
         <name>message</name>
      </attribute>
   
   </tag>
</taglib>

다음과 같이 메시지 속성을 가진 JSP를 따르자-

<%@ 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

속성에 대한 다음 속성 포함 고려-

S. 아니. 재산 및 목적
1

name

name 요소는 속성의 이름을 정의합니다. 각 속성 이름은 특정 태그에 대해 고유해야합니다.

2

required

이 속성이 필수인지 아니면 선택적인지 여부를 지정합니다. 선택 사항 인 경우 거짓입니다.

rtexprvalue

태그 속성의 런타임 표현식 값이 유효한지 선언합니다.

4

type

이 속성의 Java 클래스 유형을 정의합니다. 기본적으로 다음과 같이 가정합니다.String

5

description

정보 설명이 제공 될 수 있습니다.

6

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>
.....