JSP 사용자 정의 태그
사용자 정의 태그는 사용자 정의 JSP 언어 요소입니다. JSP 페이지에 사용자 정의 태그가 포함되어 있으면 이는 서블릿으로 변환되고, 태그는 태그 핸들러라고 불리는 객체에 대한 작업은 서블릿이 실행될 때 웹 컨테이너가 호출하는 작업입니다.
JSP 태그 확장을 사용하면 새 태그를 생성하고 이를 JSP 페이지에 직접 삽입할 수 있습니다. 이러한 사용자 정의 태그를 작성하기 위해 단순 태그 핸들러가 JSP 2.0 사양에 도입되었습니다.
SimpleTagSupport 클래스를 상속하고 doTag() 메서드를 재정의하여 가장 간단한 사용자 정의 태그를 개발할 수 있습니다.
"Hello" 태그 생성
다음으로 태그 형식이
<ex:Hello />
인 <ex:Hello>라는 사용자 정의 태그를 생성하겠습니다. 사용자 정의 JSP 태그를 생성하려면 먼저 태그를 처리하는 Java 클래스를 생성해야 합니다. 따라서 다음과 같이 HelloTag 클래스를 생성해 보겠습니다.
package com.php; 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!"); } }
다음 코드는 getJspContext() 메서드를 사용하여 현재 JspContext 객체를 가져오고 "Hello Custom Tag!"를 대체하는 doTag() 메서드를 재정의합니다. JspWriter 객체에 전달됩니다.
위 클래스를 컴파일하여 환경 변수 CLASSPATH 디렉터리에 복사합니다. 마지막으로 <Tomcat 설치 디렉터리>webappsROOTWEB-INFcustom.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.php.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.php; 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.php.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
사용자 정의 태그 속성 사용자 정의 표준에서 다양한 속성을 설정할 수 있으며, 사용자 정의 태그 클래스는 JavaBean의 setter 메소드를 구현해야 합니다.
package com.php; 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.php.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다음 속성도 포함할 수 있습니다.
属性 | 描述 |
---|---|
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> .....