-
JSP - 커스텀 태그 만들기프로그래밍/JSP 2021. 11. 11.반응형
커스텀 태그를 정의할 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 파일에서는 속성이 있다는 전제하에 코드를 짜면 된다.
반응형'프로그래밍 > JSP' 카테고리의 다른 글
JSP - 게시판 페이징 paging (0) 2021.10.18 JSP - EL / JSTL (0) 2021.10.15 JSP - 달력 (0) 2021.10.14 JSP - Parameter 파라미터 전송하기 (0) 2021.10.12 JSP - 전송 방식의 차이 (GET / POST) (0) 2021.10.11