※ 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; } }
※ 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>
※ 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>