프로그래밍/JSP
JSP - 커스텀 태그 만들기
Heidong
2021. 11. 11. 00:38
반응형
커스텀 태그를 정의할 tld 파일의 경로 : webapp - WEB-INF - views
myTag.tld의 내용
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>myTag</short-name>
<tag>
<name>hello</name>
<tag-class>com.tag.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>sum</name>
<tag-class>com.tag.SumTag</tag-class>
<body-content>empty</body-content>
<attribute> <!-- 태그 속성 정의 -->
<name>num</name>
<required>true</required> <!-- 필수 여부 -->
<rtexprvalue>true</rtexprvalue> <!-- EL등 사용 가능 여부(동적 처리) -->
<type>int</type>
</attribute>
</tag>
<tag>
<name>for</name>
<tag-class>com.tag.ForTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>begin</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>Integer</type>
</attribute>
<attribute>
<name>end</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>Integer</type>
</attribute>
<attribute>
<name>step</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>Integer</type>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue> <!-- el 사용 여부임 -->
<type>String</type>
</attribute>
</tag>
<tag>
<name>each</name>
<tag-class>com.tag.ForEachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.util.List</type>
</attribute>
</tag>
</taglib>
JSP 파일에서의 실행 방법
<%@page import="com.tag.User"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="my" uri="/WEB-INF/myTag.tld" %>
<%
List<User> list = new ArrayList<>();
list.add(new User("이자바", 23));
list.add(new User("홍자바", 22));
list.add(new User("다자바", 25));
// pageContext : 현재 JSP 페이지에 대한 설정 정보를 가지고 있는 객체
pageContext.setAttribute("list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3>커스텀 태그</h3>
<p>
<my:hello/>
</p>
<hr>
<p>속성이 있는 태그</p>
<p>
1~100까지 합 : <my:sum num="100"/>
</p>
<hr>
<p>몸체가 있는 태그</p>
<p>
<c:forEach var="n" begin="1" end="10" step="2">
${n} |
</c:forEach>
</p>
<p>
<my:for var="n" begin="1" end="10" step="2">
${n} |
</my:for>
</p>
<hr>
<p>forEach</p>
<p>
<c:forEach var="vo" items="${list }">
${vo.name } | ${vo.age } <br>
</c:forEach>
</p>
<hr>
<p>
<my:each var="vo" items="${list }">
${vo.name } | ${vo.age } <br>
</my:each>
</p>
</body>
</html>
myTag.tld에서 정의했던 내용을 JSP 파일에서 사용 하는 것.
JSP 파일 맨위에서 taglib 정의를 해야한다.
2번째 방법
그리고 커스텀 태그를 직접적으로 어떤 기능을 넣을건지 .tag파일의 위치 : webapp - WEB-INF - tags
now.tag의 파일 내용
<%@tag import="java.util.Calendar"%>
<%@ tag pageEncoding="UTF-8"%>
<%@ tag body-content="empty" %>
<%@ tag trimDirectiveWhitespaces="true" %>
<%
Calendar cal = Calendar.getInstance();
String s = String.format("%tF %tT", cal, cal);
%>
<%-- 태그파일 : 단순태그 --%>
<%=s %>
맨 윗줄에 tag내용들을 추가해야 한다.
trim~ = 불필요한 공백을 없앰
이걸 실제로 JSP 파일에서 사용 하는 방법은
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="tf" tagdir="/WEB-INF/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
</head>
<body>
<h3>태그 파일</h3>
<p>
지금 시간은 <tf:now/>
</p>
<hr>
<p>속성이 있는 태그</p>
<div>
<tf:header title="안녕하세요"/>
</div>
<div>
<tf:header title="자바" level="3"/>
</div>
</body>
</html>
위에 taglib에서 tf로 이름을 줬으니 tf:now로 now 파일의 내용을 가져 올 수 있다.
now에는 현재 시간을 구하는 객체와 변수가 담겨있다.
속성이 있는 태그의 경우
header.tag의 파일 내용
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ tag body-content="empty" %>
<%@ tag trimDirectiveWhitespaces="true" %>
<%@ attribute name="title" required="true" %>
<%@ attribute name="level" type="Integer" %>
<%-- 속성이 있는 태그 --%>
<%
String s = null, e = null;
if(level == null || level <= 1) {
s = "<h1>";
e = "</h1>";
} else if(level >= 6) {
s = "<h6>";
e = "</h6>";
} else {
s = "<h" + level + ">";
e = "</h" + level + ">";
}
%>
<%-- 속성값은 EL, 표현식(스크립릿)에서 사용 가능하다. --%>
<%=s%>${title}<%=e%>
jsp 파일에서 속성으로 title을 줘야만 사용이 가능하다.
header.tag 파일에서는 속성이 있다는 전제하에 코드를 짜면 된다.
반응형