English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
사용자 정의 태그는 사용자가 정의한 JSP 언어 요소입니다. JSP 페이지에 사용자 정의 태그가 포함되면 태그는 servlet로 변환되고, 태그는 대상으로 변환됩니다. tag handler 객체의 작업이며, servlet이 실행될 때 웹 컨테이너가 이러한 작업을 호출합니다.
JSP 태그 확장은 새로운 태그를 생성하고 JSP 페이지에 직접 삽입할 수 있게 합니다. JSP 2JSP 2.0 규范에서 Simple Tag Handlers를 도입하여 이러한 사용자 정의 태그를 작성할 수 있습니다.
SimpleTagSupport 클래스를 상속하고 doTag() 메서드를 재정의하여 가장 간단한 사용자 정의 태그를 개발할 수 있습니다.
다음은 사용자 정의 태그 <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> .....