SimpleTagSupport를 이용해 직접 Tag Library를 작성하는 방법 (=JSTL을 직접 만들겠다.)
학습목표
SimpleTagSupport를 이용해 Custom Tag를 만드는 방법을 설명할 수 있다.
Tag 파일을 이용해 Custom Tag를 만드는 방법을 설명할 수 있다.
Custom Tag
- 개발자의 목적에 따라서 Tag를 정의하고, 그 Tag를 작동하게 해주는 Tag 확장 mechanism
- 개발자가 JSP에서 JSTL처럼 이용될 수 있는 개발자 임의의 Tag를 직접 정의 가능
Custom Tag 구성요소
- Tag handller class : Tag 지시자를 사용하여 호출되는 Class로 모든 수행 Logic이 Class에 존재함
- Tag library description(xml file) : Tag Library를 JSP 파일에서 참조할 수 있도록 정의하는 Description로 보통 .tld 확장자로 생성
- Tag 지시자 : JSP 파일에서 Tag Library Descriptor를 참조하기 위해 정의하는 부분
SimpleTagSupport
- Tag Handller Class 작성 시 SimpleTagSupport 클래스를 상속받아 작성
- Custom Tag Handler를 쉽게 작성하기 위해 제공
작성법
- SimpleTagSupport를 상속받아 작성
- doTag() 메서드를 오버라이드 받아 작성
- doTag() : 실제 Tag 대신 처리해야 될 logic을 담음
- JspFragment를 통해서 Body 내용 획득
- JspContext 객체를 이용한 JspWriter 객체 획득
- JspContext 객체를 PageContext 객체로 변경 후 웹 기본 객체 획득
SimpleTagSupport 활용
1. JspFragment를 이용한 태그의 body 획득
JspFragment = getJspBody();
StringWriter = new StringWriter();
fragment.invoke(writer);
String body = writer.toString();
Tag에 있는 값을 TagHandler class에 얻어줘야 하는 이유는?
JSP 개발자가 추가한 문자를 TagHandler class 내에서 얻어줘야 참조해서 작업 가능
2. TLD 파일에 등록
- 확장자가 tld인 파일
- WEB-INK/tld에 위치
3. TLD 파일 구성
- <taglib (tilb-version, jsp-version?, short-name, url? info?, tag++)>
- tilb-version : Custom Tag의 Version 명시함
- uri : 이 Custom Tag를 식별하기 위한 유일한 Key
- info : Custom Tag의 사용법을 명시함
- <tag (name, tag-class, body-content?, info?, attribute*)>
- Tag에 대한 자세한 정보를 지정하는 Tag
- name : JSP 파일에서 prefix와 같이 사용할 Tag 이름을 명시함
- tag-class : Tag Class의 package를 포함한 이름을 명시함
- body-content : body를 어떻게 사용하는지 명시함
- empty : body를 사용하지 않을 경우
- JSP : JSP에서 처리
- scriptless : JSP의 Script 사용 불가
- tagdependent : Tag에 의존적으로 지정할 경우
- info : 이 tag에 대한 정보를 명시함
- <attribute (name, required?, rtexprvalue?)>
4. JSP에서 이용
taglib 지시태그로 선언하고 이용
<%@ taglib prefix="my" uri="http://myTag.com" %>
<my:simple></my:simple>
Tag 파일 이용
Tag 파일을 이용한 Custom Tag
- Custom Tag에 의해 처리될 내용을 Java 파일을 작성하지 않고 확장자가 Tag 파일로 작성
- 확장자가 Tag 파일이지만 JSP 문법으로 작성하는 파일
- Tag : TagHandler class 자체가 출력 목적일 경우 JSP 문법으로 쉽게 작성
.tag 파일을 Container가 Tag 클래스로 변형
작성 방법은 일반 JSP와 동일함
WEB-INF/tags/core.tag 파일로 가정
<% tag body-content="empty" pageEncoding="euc-kr"%>
<%
for(int i=0; i<5; i++)
out.println("Hello<br/>");
%>
JSP 파일
<% taglib prefix="tf" tagdir="/WEB-INF/tags"%>
........................
<b><tf:core />
Tag 파일에 사용 가능한 지시태그
- tag : JSP의 pgae 지시태그와 동일, Tag 파일의 설정정보 명시
- <%@ tag body-content="empty" pageEncoding="euc-kr"%>
- body-content
- body의 종류 명시
- empty, tagdependent, scriptless
- dynamic-attribute : 동적 속성을 사용할 때 사용
- description : tag 설명
- import : JSP와 동일
- pageEncoding : JSP와 동일
- isELIgnored : JSP와 동일
- taglib : Tag 파일에서 사용할 Tag Library 지정
- include : Tag 파일에 포함할 다른 Tag 파일을 지정
- attribute : attribute 사용법에 대한 설정
- <%@ attribute name="count" type="java.lang.Integer" required="true" %>
- description : attribute 설명
- name : 태그 속성의 이름, 태그 파일내에서 변수로 사용
- required : 필수 속성 여부
- rtexprvalue : 표현식의 사용가능 여부
- type : 속성 타입
- vairable : EL 변수로 사용될 변수에 대한 설정
Tag Body 획득
Custom Tag가 사용된 곳에서 입력한 Tag의 Body 값 획득
JSP 파일
<tf:attr count="3">
world
</tf:attr>
Tag 파일
<jsp:doBody />
.....
<jsp:doBody var="content" scope="page" />
실습
1. SimpleTagSupport를 이용하는 방법 테스트
SimpleTag.java
package ch15;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SimpleTag extends SimpleTagSupport{
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext)getJspContext();
JspWriter out = pageContext.getOut();
for(var i=0; i<5; i++) {
out.println("HELLO<br/>");
}
}
}
Tag 클래스가 사용될 때 "HELLO"를 다섯번 출력하도록 하는 작업
tld 파일을 생성하여 JSP에서 사용하기 위한 방법 및 정보 설정
simpleStyle.tld
<?xml version="1.0" encoding="euc-kr" ?>
<taglib xmlns="http://java.sun.com/xmL/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancce"
xsi:schemaLocation="http://java.sun.com/xmL/ns/j2ee
web-jsptagLibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>simpleSytle</short-name>
<uri>http://myTag.com</uri>
<tag>
<name>simple</name>
<tag-class>ch15.SimpleTag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
버전 : 1.0
short-name : simpleSytle
식별자 uri 값을 임의의 URL로 지정
Tag에 대한 정보 입력 - Tag 이름, 만들어 놓은 클래스 지정, Tag 사용 시 body의 정의 지정
JSP 페이지에서 사용 테스트를 위해 webapp 폴더에 서브 폴더 생성
main.jsp
<%@ taglib prefix="my" uri="http://myTag.com" %>
Tag Library 등록하고 테스트 결과 확인
2. Custom Tag를 만들 때 확장자가 tag인 파일로 만드는 방법 테스트
attr.tag
<%@ tag body-content="scriptless" pageEncoding="euc-kr" %>
<%@ attribute name="count" type="java.lang.Integer" required="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach begin="1" end="${count }">
<jsp:doBody />
</c:forEach>
JSP 문법으로 Custom Tag를 만들기 위한 파일이므로 JSP랑 유사한 선언을 하면 됨
JSP 페이지에서 이용하기 위한 작업
main.jsp
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
taglib 선언
<body>
<my:simple></my:simple>
<tf:attr count="3">
world
</tf:attr>
</body>
body에 world 입력
테스트 결과 확인
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
17차시 Spring Boot (0) | 2023.07.04 |
---|---|
16차시 MVC Model (0) | 2023.07.04 |
14차시 JSTL - Formatting (0) | 2023.07.03 |
13차시 JSTL - Core (0) | 2023.07.02 |
12차시 Expression Language (1) | 2023.07.01 |