프로그래밍/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}&nbsp; | &nbsp; 
	</c:forEach>
</p>

<p>
	<my:for var="n" begin="1" end="10" step="2">
		${n}&nbsp; | &nbsp; 
	</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 파일에서는 속성이 있다는 전제하에 코드를 짜면 된다.

 

반응형