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