커스텀태그
=> 개발자가 작성한 태그
JSP 페이지에서 반복적인 프로그램 로직을 캡슐화하려고 고안된 것으로,
기본적으로 제공되는 태그 이외에 사용자가 확장한 태그라는 의미에서 붙여진 이름이다.
JSP 서버에서는 커스텀 태그를 구현할 수 있다.
커스텀태그 장점
- V에 존재하는 로직코드(자바)를 분리가능
- 로직코드를 캡슐화(모듈화)
- 보다 완벽한 MVC 구조 구축가능
커스텀태그 개발 방법
- 태그파일 기반의 커스텀태그
프로젝트의 규모가 작을때
간단한 기능 - 태그핸들러클래스 기반의 커스텀태그
프로젝트의 규모가 클때
배포(공개, 공유)를 하는것이 주된 목적일때 사용
태그의 구조
태그 : 주로 쌍으로 이루어져있음
태그 바디: 비울경우(사용하지않을경우) < /> 닫는것을 권장
속성 : 속성값들을 작성할때에는 ""로 묶는것을 권장
taglib 지시어
- 내가 만든 (파일기반의) 커스텀태그
<%@ taglib tagdir="커스텀태그 파일의 위치" prefix="커스텀태그명" %>
<prefix명 : 파일명>태그 바디</prefix : 파일명>
<prefix명 : 파일명 /> - 남이 만든 (핸들러클래스기반의) 커스텀태그
<%@ taglib uri="커스텀태그 파일의 위치" prefix="커스텀태그명" %>
<prefix:커스텀태그명>태그 바디</prefix:커스텀태그>
<prefix:커스텀태그명/>
1. 태그파일 기반의 커스텀태그 사용방법
1) tag파일 생성
WEB-INF파일에 태그를 넣어둘 파일 생성 후, 그 폴더 내부에 태그(tag) 파일 생성
2) taglib 지시어 선언
커스텀태그를 사용할 jsp페이지에 taglib 지시어가 선언되어야 사용이 가능
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>
tagdir에 입력된 경로에 있는 tag파일을 prefix에 입력된 이름인 kim으로 불러올 수 있음
< 예시 1 >
tag파일
<%@ tag language="java" pageEncoding="UTF-8"%>
커스텀태그입니다. HELLO! :D
jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 내가 만든걸 쓸때 쓰는 방식 -->
<h1><kim:print/></h1>
</body>
</html>
< 예시 2 >
attribute 사용하여 커스텀태그에 속성 부여
<%@ attribute name="속성" %>
tag파일
dobody를 사용하여 jsp파일의 태그바디의 내용을 tag파일로 불러올 수 있다.
<h1><jsp:doBody/></h1>
<%@ tag language="java" pageEncoding="UTF-8"%>
<!-- attribute사용하여 커스텀태그에 속성부여 -->
<%@ attribute name="border" %>
<%@ attribute name="bgcolor" %>
<jsp:useBean id="test" class="test.Test"/>
<h1><jsp:doBody/></h1>
<table border="${border}" bgcolor="${bgcolor}">
<%
for(String v : test.getDatas()){
%>
<tr>
<td><%=v%></td>
</tr>
<%
}
%>
</table>
jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="kim" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<kim:test border="5" bgcolor="lightpink">과일 목록</kim:test>
</body>
</html>
2. 태그핸들러클래스 기반의 커스텀태그 사용방법
1) 핸들러클래스 생성
일반 클래스 생성 후 , SimpleTagSupport를 상속하여 핸들러클래스로 전환할 수 있다.
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
// 핸들러클래스를 만들고싷어용...
// "핸들러" 클래스가 어딘가에 존재한다고함!!
// "상속"
public class MsgTagHandler extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut();
out.println("핸들러클래스기반으로 출력하는 메세지! :D");
}
// 시작태그를 만나면 자동으로 호출되어 수행되는 메서드
}
2) 태그라이브러리 생성
xml 파일 생성하는 방법
WEB-INF폴더 하위에 tld폴더를 생성
tld 우클릭 new -> others -> XML File 선택
파일 확장자는 .tld로!
Create file using a DTD or XML Schema file을 선택
Select XML Catalog entry를 선택한 후 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0xsd를 클릭
j2ee가 <no prefix>로 표시되도록 클릭 후 Prefix에 기입된 내용을 지워주고 OK버튼
Source탭에 태그 관련 내용을 정의
< 예시1 >
java파일
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
// 핸들러클래스를 만들고싷어용...
// "핸들러" 클래스가 어딘가에 존재한다고함!!
// "상속"
public class MsgTagHandler extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut();
out.println("핸들러클래스기반으로 출력하는 메세지! :D");
}
// 시작태그를 만나면 자동으로 호출되어 수행되는 메서드
}
tld파일 ( 태그 내용 정의 )
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>0.0</tlib-version>
<short-name>MsgTag</short-name>
<tag>
<name>msg</name>
<tag-class>test.MsgTagHandler</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
jsp파일
taglib지시어의 속성 중 uri를 활용하여 tld파일의 경로를 기입
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/MsgTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1><mytag:msg/></h1>
</body>
</html>
< 예시2 >
java파일
package test;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class TestTagHandler extends SimpleTagSupport {
// 태그 속성을 저장할 멤버변수
private String border;
private String bgcolor;
public String getBorder() {
return border;
}
public void setBorder(String border) {
this.border = border;
}
public String getBgcolor() {
return bgcolor;
}
public void setBgcolor(String bgcolor) {
this.bgcolor = bgcolor;
}
@Override
public void doTag() throws JspException, IOException {
//out내장객체 사용을 위한 선언
JspWriter out=getJspContext().getOut();
// 태그 바디의 내용을 받아오는 코드
// <jsp:doBody/>
JspFragment body = getJspBody();
if(body!=null) {
out.println("<h1>");
body.invoke(null);
out.println("</h1>");
}
out.println("<table border="+border+" bgcolor="+bgcolor+">");
for(String v:new Test().getDatas()) {
out.println("<tr><td>"+v+"</td></tr>");
}
out.println("</table>");
}
}
tld파일
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
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/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
<tlib-version>0.0</tlib-version>
<short-name>NMTOKEN</short-name>
<tag>
<name>test</name>
<tag-class>test.TestTagHandler</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>border</name>
<required>true</required>
</attribute>
<attribute>
<name>bgcolor</name>
<required>true</required>
</attribute>
</tag>
</taglib>
jsp파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/tld/TestTag.tld" prefix="mytag" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:test bgcolor="lightblue" border="1">목록</mytag:test>
</body>
</html>
출력화면
'JSP' 카테고리의 다른 글
[JSP] 트랜잭션 commit(), rollback() (0) | 2022.08.18 |
---|---|
[JSP] 리스너 클래스, JSTL (0) | 2022.08.18 |
[JSP] 표현언어 EL (Expression Language) (0) | 2022.08.14 |
[JSP] MVC 패턴 - 로그인, 게시판 만들기 (0) | 2022.08.09 |
[JSP] forward / redirect 특정페이지 이동방법 (0) | 2022.08.08 |