※ xyz.itwill.custom 패키지에 HelloMessageTag.java 클래스 생성
📃HelloMessageTag.java
package xyz.itwill.custom; import java.io.IOException; // import javax.servlet.jsp.JspException; // import javax.servlet.jsp.tagext.TagSupport; // //태그 속성이 있으며 태그 내용이 없는 커스텀 태그의 클래스 public class HelloMessageTag extends TagSupport{ private static final long serialVersionUID = 1L; // //태그 속성값을 저장하기 위한 필드 선언 - 태그의 속성명과 같은 이름으로 필드 선언 private String name; // //생성자에서는 객체 생성에 필요한 초기화 작업에 대한 명령 작성 - 필드 초기값 설정 public HelloMessageTag() { //커스텀 태그에서 속성을 생략할 경우 기본적으로 사용될 속성값을 필드에 자동 저장하기 위해 작성 //→ 태그 속성이 필수인 경우 필드 기본값 설정 생략 name="홍길동"; } public String getName() { return name; } // //커스텀 태그에서 태그의 속성을 사용하여 속성값을 설정할 경우 Setter 메소드 자동 호출 //→ 매개변수로 속성값을 제공받아 필드값 변경 public void setName(String name) { this.name = name; } // //커스텀 태그 사용시 실행될 명령이 있는 경우에만 메소드를 오버라이드 선언하여 작성 //→ 메소드를 오버라이드 선언하지 않으면 자동으로 부모클래스의 명령이 없는 메소드 호출 @Override public int doStartTag() throws JspException { try { if(name.equals("홍길동")) { pageContext.getOut().println("<h3>관리자님, 안녕하세요.</h3>"); } else { pageContext.getOut().println("<h3>"+name+"님, 안녕하세요.</h3>"); } } catch (IOException e) { throw new JspException(e.getMessage());//웹브라우저에 에러메세지 출력 } return super.doStartTag(); } }
※ WEB-INF/tld 폴더에 custom.tld 파일 생성(tld 파일 만드는법 [MVC 4-5 참고])
※ [MVC 4-7] tld 파일에서 추가 작성📃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> <!-- --> <!-- HelloTag.java에 사용하는 tag --> <!-- 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> <!-- --> <!-- HelloMessageTag.java에 사용하는 tag --> <tag> <name>helloMessage</name> <tag-class>xyz.itwill.custom.HelloMessageTag</tag-class> <body-content>empty</body-content> <!-- attribute : 태그 속성을 등록하기 위한 엘리먼트 --> <attribute> <!-- name : 태그 속성명을 설정하는 엘리먼트 - 태그 클래스의 필드명과 같은 이름으로 작성 --> <name>name</name> <!-- required : 커스텀 태그의 속성에 대한 필수 여부를 설정하기 위한 엘리먼트 --> <!-- → false : 선택 속성(기본), true : 필수 속성(무조건 써야함) --> <required>true</required> </attribute> </tag> </taglib>
※ webapp/custom 폴더에 hello_message_tag.jsp 생성
📃hello_message_tag.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@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 - AnyAttribute And NoBody</h1> <hr> <%-- 커스텀 태그의 속성을 생략한 경우 태그 클래스의 생성자에서 설정한 기본값을 속성값으로 사용 --%> <%-- → 커스텀 태그의 속성이 필수로 설정된 경우 속성을 생략하면 에러 발생 --%> <%-- <simple:helloMessage/> --%><%-- 에러 발생 --%> <%-- --%> <%-- 커스텀 태그의 속성이 필수로 설정된 경우 태그 사용시 속성 자동 완성 --%> <simple:helloMessage name="홍길동"/> <%-- --%> <%-- 커스텀 태그의 속성을 사용하여 속성값을 설정한 경우 태그 클래스의 필드에 대한 Setter 메소드를 자동 호출하여 속성값을 전달받아 필드명 변경 --%> <%-- → 태그 클래스에 필드에 대한 Setter 메소드가 없는 경우 500 에러 발생 --%> <simple:helloMessage name="임꺽정"/> </body> </html>