[MVC 4-7] Custom Tag(태그 속성과 태그 내용이 없는 커스텀 태그의 클래스)

임승현·2023년 1월 25일
0

MVC

목록 보기
17/27

🌈STEP_01 태그 클래스 작성

※ xyz.itwill.custom 패키지 생성 → HelloTag.java 클래스 생성

📃HelloTag.java

package xyz.itwill.custom;
import java.io.IOException;
//
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
//
//커스텀 태그(Custom Tag) : JSP 문서에서 스크립트 요소 대신 사용하기 위해 프로그래머가 직접 만든 태그
//→ 태그 클래스 작성 >> TLD 파일에 커스텀 태그 등록 >> JSP 문서에서 커스텀 태그 사용
//
//태그 클래스 : JSP 문서에서 커스텀 태그를 사용할 경우 호출될 메소드가 선언된 클래스
//→ TagSupport 클래스, BodyTagSupport 클래스, SimpltTagSupport 클래스 중 하나를 상속받아 작성
//→ 커스텀 태그 사용시 호출되는 메소드는 부모클래스의 메소드를 오버라이드 선언하여 작성
//
//태그 속성과 태그 내용이 없는 커스텀 태그의 클래스
public class HelloTag extends TagSupport {
	private static final long serialVersionUID = 1L;
	//
	//JSP 문서에서 커스텀 태그를 최초로 사용할 경우 태그 클래스로 객체를 생성하기 위해 한번만 호출
	public HelloTag() {//[ctrl]+[space]로 생성자 만듬
		//System.out.println("HelloTag 클래스의 기본 생성자 호출 - 객체 생성");
	}
	//
	//JSP 문서에서 커스텀 태그의 시작태그를 사용할 때마다 자동 호출되는 메소드
	@Override
	public int doStartTag() throws JspException {
		//System.out.println("HelloTag 클래스의 doStartTag() 메소드 호출");
		//
		try {
			//부모클래스(TagSupport)에서 제공받은 PageContext 객체(pageContext 변수에 저장)를 이용하여 웹프로그램 실행에 필요한 객체를 반환받아 명령 작성
			//PageContext.getOut() : 응답결과를 생성하기 위한 출력스트림(JspWriter 객체)을 반환하는 메소드
			pageContext.getOut().println("<div>안녕하세요.</div>");//IOException 발생
		} catch (IOException e) {
			e.printStackTrace();
		}
		//doStartTag() 태그의 반환값(정수값) : 부모클래스(TagSupport)에서 제공되는 상수 사용
		//→ SKIP_BODY, EVAL_BODY_INCLUDE, EVAL_BODY_AGAIN 중 하나를 선택하여 반환
		//→ SKIP_BODY : 태그내용을 클라이언트에게 전달하지 않을 경우 사용하는 상수 - 기본값
		//→ EVAL_BODY_INCLUDE : 태그내용을 클라이언트에게 전달할 경우 사용하는 상수
		//→ EVAL_BODY_AGAIN : 태그내용을 클라이언트에게 다시 한번 전달할 경우 사용하는 상수 - 태그 내용을 두번 전달
		return SKIP_BODY;
	}
	//
	//JSP 문서에서 커스텀 태그의 태그내용을 사용할 때마다 자동 호출되는 메소드
	@Override
	public int doAfterBody() throws JspException {
		//System.out.println("HelloTag 클래스의 doAfterBody() 메소드 호출");
		//
		//doAfterBody() 태그의 반환값(정수값) : doStartTag() 태그의 반환값과 동일
		return super.doAfterBody();
	}
	//
	//JSP 문서에서 커스텀 태그의 종료태그를 사용할 때마다 자동 호출되는 메소드
	@Override
	public int doEndTag() throws JspException {
		//System.out.println("HelloTag 클래스의 doEndTag() 메소드 호출");
		//
		//doEndTag() 태그의 반환값(정수값) : 부모클래스(TagSupport)에서 제공되는 상수 사용
		//→ SKIP_PAGE, EVAL_PAGE 중 하나를 선택하여 반환
		//SKIP_PAGE : 종료태그 실행 후 JSP 문서를 강제로 종료할 때 사용하는 상수
		//EVAL_PAGE : 종료태그 실행 후 JSP 문서를 계속 실행할 때 사용하는 상수 - 기본값
		return EVAL_PAGE;
	}
}

🌈STEP_02 TLD 파일에 커스텀 태그 등록

※ WEB-INF/tld 폴더에 custom.tld 파일 생성(tld 파일 만드는법 [MVC 4-5 참고])

📃custom.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="Http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd ">
  <description>단순한 형태의 커스텀 태그 구현</description>
  <tlib-version>1.0</tlib-version>
  <short-name>simple</short-name>
  <uri>http://www.itwill.xyz/mvc/custom</uri>
  <!--  -->
  <!-- tag : 커스텀 태그를 등록하기 위한 엘리먼트 -->
  <tag>
  	<!-- name : 커스텀 태그의 이름을 등록하기 위한 엘리먼트 -->
  	<name>hello</name>
  	<!-- tag-class : 커스텀 태그 사용시 생성될 객체의 태그 클래스를 설정하기 위한 엘리먼트 -->
  	<tag-class>xyz.itwill.custom.HelloTag</tag-class>
  	<!-- body-content : 커스텀 태그에서 사용 가능한 태그내용을 설정하기 위한 엘리먼트 -->
  	<!-- → empty : 태그내용이 없는 커스텀 태그를 설정하기 위한 엘리먼트 값 -->
  	<body-content>empty</body-content>
  </tag>
</taglib>

🌈STEP_03 JSP 문서에서 커스텀 태그 사용

※ webapp 폴더에 custom 폴더 생성 → hello_tag.jsp 생성

📃hello_tag.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- taglib 디렉티브를 사용하여 TLD 파일을 제공받아야 JSP 문서에서 커스텀 태그를 사용 가능 --%>
<%@taglib prefix="simple" uri="http://www.itwill.xyz/mvc/custom" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
	<h1>Custom Tag - NoAttribute And NoBody</h1>
	<hr>
	<%-- 태그 내용이 있는 경우 시작태그와 종료태그를 따로 작성 --%>
	<%-- <simple:hello></simple:hello> --%>
	<%-- 태그 내용이 없는 경우 시작태그와 종료태그를 같이 작성 --%>
	<simple:hello/>
	<simple:hello/>
	<simple:hello/>
	<simple:hello/>
	<simple:hello/>
</body>
</html>

0개의 댓글