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

임승현·2023년 1월 25일
0

MVC

목록 보기
18/27

🌈STEP_01 태그 클래스 작성

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

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

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

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

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

0개의 댓글