1. 커스텀 태그(Custom Tag)
- 스크립트 코드와 EL을 혼합해서 사용하는 대신 또 다른태그를 만들어서 사용할 수 있도록 지원한다.
- JSTL 또한 커스텀 캐그의 일종으로 커스텀 태그를 모아 놓은 커스텀 태그 라이브러리의 한 종류이다.
2. 커스텀 태그 장점
- 재사용성 향상 : 한번 작성한 커스텀 태그는 어떤 JSP 컨테이너에서든지 사용 가능하다.
- 쉽고 단순한 JSP 제작 : 자바 코드에 익숙하지 않은 개발자들도 커스텀태그를 통해서 쉽게 JSP 페이지를 작성할 수 있게 된다.
- 코드의 가독성 향상 : 스크립트 코드를 줄일 수 있기 때문에 JSP 코드의 가독성을 높일 수 있다.
3. 커스텀 태그 종류
- JSP 1.2 스타일로 구현한 커스텀 태그
- JSP 2.0 또는 그 이상 버전의 SimpleTag를 사용한 커스텀 태그
- 태그 클래스라고 한다.
- JSP 1.2 방식 & SimpleTag 커스텀 태그는 자바 클래스 기반의 커스텀 태그이다.
- 작성방법과 설치방법이 복잡하다.
- 소스코드가 공개 되지 않는다.
- JSP 2.0 또는 그 이상 버전의 태그 파일을 사용한 커스텀 태그
- 태그 파일이라고 한다.
- 커스텀 태그의 표준 인터페이스를 구현하거나 클래스를 상속 받아서 구현한다.
- JSP와 유사한 방식으로 커스텀 태그를 구현할 수 있도록 해준다.
- 서블릿 대신 JSP로 구현하듯 커스텀 태그 클래스를 태그 파일로 구현할 수 있다.
- 작성방법과 설치방법이 간단하다.
- 소스코드 상태 그대로 설치해야 하므로 소드코드가 공개된다.
- 태그파일은 위의 방식 클래스로 변환시킨 다음에 실행된다.
4. 태그 파일 커스텀 태그
- JSP 문법을 사용해서 커스텀 태그로 동작할 수 있도록 만들어진 소스 코드
4.1. 태그 파일 기본
- JSP 페이지를 작성하듯이 태그 파일을 작성할 수 있다.
- JSP 소스코드를 서블릿 클래스로 변환 하듯이 태그 파일을 커스텀 태그 클래스로 변환한다.
- 태그 파일만의 디렉티브를 사용할 수 있다.
- taglib 디렉티브를 사용해서 태그 파일에서 또 다른 커스텀 태그를 사용할 수 있다.
- 참고 page 디렉티브 : 2013/09/12 - [Java/Java EE] - JSP 디렉티브(Directive) - page
디렉티브 |
설명 |
tag |
JSP 페이지의 page 디렉티브와 동일, 태그 파일의 정보를 명시 |
taglib |
태그 파일에서 사용할 태그 라이브러리를 명시할 때 사용,문법은 JSP 페이지와 완전히 동일 |
include |
태그 파일에 특정한 파일을 포함시킬 때 사용, 태그 파일에 포함되는 파일은 태그 파일에 알맞은 문법으로 작성 해야 함 |
attribute |
태그 파일이 커스텀 태그로 사용될 때 입력 받을 속성을 명시 |
variable |
EL 변수로 사용될 변수에 대한 정보를 지정 |
- tag 디렉티브는 태그 파일과 관련된 설정 정보를 포함한다. 아래는 tag 디렉티브의 속성
- display-name : 태그 파일을 도구에서 보여줄 때 사용될 이름을 지정, 기본값은 확장자 ".tag"를 제외한 태그 파일의 나머지 이름이다.
- body-content : 몸체 내용의 종류를 입력, empty, tagdependent, scriptless 중 한가지를 사용, 기본값은 scriptless
- dynamic-attributes : 동적 속성을 사용할 때, 속성의 <이름,값>을 저장하는 Map 객체를 page 범위에 속성에 저장할 때 사용할 이름을 명시, EL에서 변수이름이로 사용할 수 있다.
( JSP 페이지의 pageContext 와 비슷하게 jspContext 기본 객체를 지원한다. )
- description : 태그에 대한 설명
- import : 사용할 자바 클래스를 지정
- pageEncoding : 페이지 자체의 캐릭터 인코딩을 지정
- isELIgnored : page 표현 언어를 지원할 여부를 지정
- deferredSyntaxAllowedAsLiteral : #{ 문자가 문자열 값으로 사용되는 것을 허용 여부를 지정
- trimDirectiveWhitespaces : 출력 결과에서 템플릿 텍스트의 공백 문자를 제거할지의 여부를 지정
4.1.1. 태그 파일 위치 및 태그 파일 참조 방법
- 태그 파일은 \WEB-INF\tags 디렉터리 또는 그 하위 디렉터리에 위치한다.
- 이 디렉터리에 위치한 파일 중 .tag 확장자나 .tagx 확장자를 갖는 파일만 태그파일로 인식된다.
- 태그파일의 이름은 커스텀 태그의 이름이 된다.
- uri 속성 대신 tagdir 속성을 사용, 태그 파일이 위치한 디렉터리의 경로를 입력하고 해당 디렉터리에 있는 태그 파일의 이름은 각각 하나의 커스텀 태그 이름이 된다.
<!-- \WEB-INF\tags\util 디렉터리에 testTag.tag 태그 파일이 있다고 가정했을 경우 --> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags/util" %> . . . <tf:testTag . . .> . . . </tf:testTag>
4.1.2. 태그 파일에서 사용 가능한 기본 객체
- JSP 페이지와 마찬가지로 기본 객체를 사용해서 원하는 정보를 얻고 알맞은 작업을 수행할 수 있다.
- jspContext : pageContext 제공하는 setAttribute(), getAttribute() 메서드를 그대로 제공하며 각 속성과 관련된 작업을 처리
- request : JSP 페이지의 request 기본 객체와 동일 (참조 : 2013/09/13 - [Java/Java EE] - JSP 기본(내장) 객체 - request)
- response : JSP 페이지의 response 기본 객체와 동일 (참조 : 2013/09/16 - [Java/Java EE] - JSP 기본(내장) 객체 - response)
- session : JSP 페이지의 session 기본 객체와 동일 (참조 : 2013/09/22 - [Java/Java EE] - JSP 기본(내장) 객체 - 세션(session))
- application : JSP 페이지의 applicaion 기본 객체와 동일 (참조 : 2013/09/19 - [Java/Java EE] - JSP 기본(내장) 객체의 속성(Attribute))
- out : JSP 페이지의 out 기본 객체와 동일 (참조 : 2013/09/16 - [Java/Java EE] - JSP 기본(내장) 객체 - out, pageContext, application, page)
<!-- now.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="empty"%> <%@ tag import="java.util.Calendar"%> <% Calendar c = Calendar.getInstance(); %> <%= c.get(Calendar.YEAR) %>년 <%= c.get(Calendar.MONTH) %>월 <%= c.get(Calendar.DATE) %>일<br>
<!-- starLine.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="empty"%> ★★★★★★★★★★★★★★★★★★★★★★★★★<br>
<!-- tagfile.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile</title> </head> <body> <tf:starLine/> <tf:now/> <tf:starLine/> </body> </html> <!-- 실행결과 ★★★★★★★★★★★★★★★★★★★★★★★★★ 2013년 9월 2일 ★★★★★★★★★★★★★★★★★★★★★★★★★ -->
4.2. 태그 파일의 속성(attribute)
- attribute 디렉티브(지시자)를 사용하여 속성을 이용, 태그 파일을 실행하는데 필요한 값을 전달받을 수 있다.
속성 |
설명 |
description |
속성에 대한 설명 |
name |
속성 이름, 태그 파일 내에서 스크립트 변수나 EL변수의 이름으로 사용, 각각의 attribute 디렉티브는 name 속성의 값이 달라야한다. tag 디렉티브(dynamic-attributes), variable 디렉티브(name-given) 속성과 값이 같으면 에러가 발생한다. |
required |
속성의 필수 여부를 지정, 필수일 경우 true 아닌 경우 false를 값으로 지정, 기본값은 false |
rtexprvalue |
속성 값으로 표현식을 사용할 수 있는지의 여부를 지정, 기본값은 true |
type |
속성 값의 타입을 명시, int 등의 기본 데이터 타입은 명시할 수 없고 java.lang.Integer 와 같은 래퍼 타입을 사용, 기본값은 java.lang.String |
fragment |
<jsp:attribute> 액션 태그로 속성값을 전달할 때 true로 지정, true일 경우 rtexprvalue은 자동으로 false, type은 javax.servlet.jsp.tagext.JspFragment가 된다. |
4.2.1 속성 값 전달 기본 방식
- attribute 디렉티브의 name 속성에 지정한 이름을 태그파일의 스크립트 요소나 EL로 변수처럼 사용할 수 있다.
- <@ attribute name="속성명" %>
- name 속성의 지정한 이름은 태그 파일을 사용하는 JSP에서 지정한 이름속성으로 태그 파일에 값을 전달 할 수 있다.
<!-- forStarLine.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="empty" trimDirectiveWhitespaces="true"%> <%@ attribute name="color"%> <%@ attribute name="size" type="java.lang.Integer" required="true"%> <font color="${ color }"> <% for (int i = 0; i < size; i++) out.print("★"); %> </font>
<!-- header.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="empty"%> <%@ attribute name="title" required="true"%><!-- required 속성, 필수 attribute 명시 --> <%@ attribute name="level" type="java.lang.Integer"%><!-- type 속성, 기본 값은 String --> <% String headStartTag = null; String headEndTag = null; if (level == null) { headStartTag ="<h1>"; headEndTag ="</h1>"; } else if (level == 1) { headStartTag ="<h1>"; headEndTag ="</h1>"; } else if (level == 2) { headStartTag ="<h2>"; headEndTag ="</h2>"; } else if (level == 3) { headStartTag ="<h3>"; headEndTag ="</h3>"; } %> <%= headStartTag %>${ title }<%= headEndTag %>
<!-- tagfileAttribute.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile Attribute</title> </head> <body> <tf:forStarLine size="25" color="blue"/> <tf:header title="텍스트 제목" level="1"/> <tf:forStarLine size="25" color="red"/> <tf:header title="${ 'EL 제목' }" level="2"/> <tf:forStarLine size="25" color="gray"/> <tf:header title='<%= "표현식 제목" %>' level="3"/> </body> </html> <!-- 실행결과
-->
4.2.2. <jsp:attribute> 액션 태그 이용, 속성 값 전달
- attribute 디렉티브의 fragment 속성 값이 true일 경우, JSP에서는 속성에 값을 전달할 때 <jsp:attribute> 액션 태그를 사용해야 한다.
- <%@ attribute name="속성명" fragment="boolean" %>
- attribute 몸체에서는 텍스트, EL, <jsp:include> 액션 태그를 사용할 수 있다. (스크립트 코드는 사용할 수 없음)
- name 속성 : 속성의 이름 (필수)
- trim 속성 : 속성의 값 좌우의 공백문자들(' ', \r, \n, \t 등)을 제거할 지의 여부, 기본값은 true
- 태그 파일에서는 <jsp:invoke> 액션 태그를 이용해서 설정한 속성 값을 사용한다.
- fragment 속성 : attribute 디렉티브의 name 속성과 같은 값을 가진다. 이 속성 값만 지정하는 경우에는 <jsp:attribute> 액션 태그의 몸체 내용을 처리한 결과가 그대로 출력된다.
- var 속성 : 변수명,
- scope 속성 : 영역지정, page request session attribute
<!-- invoke.tag --> <%@ tag language="java" pageEncoding="UTF-8"%> <%@ attribute name="invoke" fragment="true"%> <jsp:invoke fragment="invoke"/>
<!-- tagfileAttribute2.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile Attribute2</title> </head> <body> <tf:invoke> <jsp:attribute name="invoke"> <jsp:include page="tagfile.jsp" flush="true"/> </jsp:attribute> </tf:invoke> </body> </html> <!-- 실행결과
-->
4.2.3. 동적 속성 전달
- 상황에 따라서 동적으로 속성을 추가할 때 상ㅇ한다.
- <%@ tag dynamic-attributes="Map이름" %>
- 동적 속성들은 java.util.Map 타입의 EL 변수에 저장되므로 dynamic-attributes 속성에서 명시한 Map이름으로 Map EL 변수를 통해서 접근할 수 있다.
<!-- select.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="empty" trimDirectiveWhitespaces="true"%> <%@ tag dynamic-attributes="optionMap"%> <%@ attribute name="name" required="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <select name="${ name }"> <c:forEach items="${ optionMap }" var="option"> <option value="${ option.key }">${ option.value }</option> </c:forEach> </select>
<!-- tagfileDynamicAttribute.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile DynamicAttribute</title> </head> <body> <tf:select name="nick" panti="팬티맨" temple="절맨"/> <tf:select name="fruit" apple="apple" orange="orange" pear="pear" lemon="lemon"/> </body> </html>
4.3. 몸체(본체) 내용 처리
- 태그 파일을 사용할 경우에도 몸체 내용울 출력, 데이터로 사용, 반복 출력 등을 할 수 있다.
- 몸체 내용을 사용하는 방식은 EL 등을 처리 한뒤 사용하는 방식, 데이터 자체로 사용하는 방식 2가지가 있다.
- tag 디렉티브의 body-content 속성에 empty 대신에 'scriptless' 또는 'tagdependent' 값을 써야한다.
- 몸체를 전달하는 방법은 몸체 내용을 직접 삽입하는 방법과 <jsp:body> 태그를 이용하는 방법이 있다.
- 태그 파일로 구현된 태그의 몸체에는 일반 텍스트, EL, <jsp:include> 태그만 위치할 수 있다.
- 몸체 내용에는 스크립트 요소(표현식, 스크립트릿)을 사용할 수 없다. (스크립트 요소 참조 : 2013/09/12 - [Java/Java EE] - JSP 스크립트 요소 )
<!-- scriptless.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="scriptless"%> <jsp:doBody />
<!-- tagdependent.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="tagdependent"%> <jsp:doBody />
<!-- tagfileBodyContent.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile BodyContent</title> </head> <body> <c:set var="eltext" value="EL 텍스트" /> <table border="1" cellpadding="20"> <tr> <td> <tf:scriptless><b>scriptless</b></tf:scriptless> </td> <td> <tf:tagdependent><b>tagdependent</b></tf:tagdependent> </td> </tr> <tr> <td> <tf:scriptless>일반 텍스트</tf:scriptless> </td> <td> <tf:tagdependent>일반 텍스트</tf:tagdependent> </td> </tr> <tr> <td> <tf:scriptless>${ eltext }</tf:scriptless> </td> <td> <tf:tagdependent>${ eltext }</tf:tagdependent> </td> </tr> <tr> <td> <tf:scriptless> <jsp:body>jsp:body 태그를 이용</jsp:body> </tf:scriptless> </td> <td> <tf:tagdependent> <jsp:body>jsp:body 태그를 이용</jsp:body> </tf:tagdependent> </td> </tr> <tr> <td> <%-- <tf:scriptless><%= out.println("스크립트") %></tf:scriptless> 에러 발생 --%> </td> <td> <tf:tagdependent><%= out.println("스크립트") %></tf:tagdependent> </td> </tr> </table> </body> </html> <!-- 실행결과
-->
4.3.1. EL 및 태그가 처리된 몸체 내용 사용 - scriptless
- <%@ tag body-content="scriptless" %> <jsp:doBody var="변수명" scope="영역"/>
- <jsp:doBody /> : 몸체로 전달받은 내용을 그대로 출력
- <jsp:doBody var="" scope"" /> : 몸체로 전달받은 내용을 var 속성으로 지정한 scope 영역에 EL 변수에 저장한다. scope 기본값은 page
<!-- tagfileBodyCotentScriptless.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Date" %> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile BodyContent Scriptless</title> </head> <body> <c:set var="dateEL" value="<%= new Date() %>" /> <tf:removeHtml trim="true"> <font size="10">현재 <style>시간</style>은 ${ dateEL } 입니다. </font> </tf:removeHtml> <br><br> <tf:removeHtml trim="true" length="5" trail=". . . 끝에 붙는 문자열"> <u>현재 시간</u>은 <b>${ dateEL }</b> 입니다. </tf:removeHtml> <br><br> <tf:removeHtml length="5"> <jsp:body><u>현재 시간</u>은 <b>${ dateEL }</b> 입니다.</jsp:body> </tf:removeHtml> </body> </html> <!-- 실행결과 현재 시간은 Wed Oct 02 15:54:17 KST 2013 입니다. 현재 시간. . . 끝에 붙는 문자열 현재 시간 -->
4.3.2. 몸체 내용 자체를 데이터로 사용 - tagdependent
- 몸체 내용에 포함된 EL이나 액션 태그를 처리하지 않고 텍스트 값으로 사용한다.
<!-- out.tag --> <%@ tag language="java" pageEncoding="UTF-8" body-content="tagdependent" trimDirectiveWhitespaces="true"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <jsp:doBody var="bodyText" /> <c:out value="${ bodyText }" escapeXml="true" /> <!-- escapeXml 이스케이프 문자로 변경하여 HTML 태그 처리 안되게 -->
<!-- tagfileBodyContentTagdependent.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.Date" %> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile BodyContent Tagdependent</title> </head> <body> <c:set var="dateEL" value="<%= new Date() %>" /> <tf:out> <jsp:body><u>현재 시간</u>은 <b>%{ dateEL }</b> 입니다.</jsp:body> </tf:out> <br><br> <tf:out> <u>현재 시간</u>은 <b>%{ dateEL }</b> 입니다. </tf:out> </body> </html> <!-- 실행결과 <u>현재 시간</u>은 <b>%{ dateEL }</b> 입니다. <u>현재 시간</u>은 <b>%{ dateEL }</b> 입니다. -->
4.4 변수 생성
- 태그 파일을 사용하는 페이지에서 사용할 수 있는 EL 변수를 추가할 수 있다.
- 태그 파일이 JSP 페이지로 데이터를 넘겨주기 위해서 변수를 사용한다.
4.4.1. variable 디렉티브와 name-given을 이용해서 변수 추가
- <%@ variable name-given="EL변수명" variable-class="변수타입" scope="변수범위" />
- name-given : 이 태그를 호출할 페이지에 추가될 변수명을 정의
- variable-class : 추가될 변수의 타입, 기본 값은 java.lang.String
- scope : 변수의 범위, AT_BEGIN AT_END NESTED 중 한개 값을 가진다. 기본 값은 NESTED
- AT_BEGIN : 태그 파일의 시작 태그부터 태그파일에서 추가한 변수를 사용할 수 있다.
- NESTED : 태그 파일의 시작태그와 끝 태그 사이에서 변수를 사용할 수 있다.
- AT_END : 태그 파일의 끝 태그 이후부터 변수를 사용할 수 있다.
<!-- sum.tag --> <%@ tag language="java" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%> <%@ attribute name="begin" required="true" type="java.lang.Integer"%> <%@ attribute name="end" required="true" type="java.lang.Integer"%> <%@ variable name-given="sum" variable-class="java.lang.Integer" scope="NESTED"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:set var="sum" value="${ 0 }" /> 반복전<br> <c:forEach var="num" begin="${ begin }" end="${ end }"> 반복<br> <c:set var="sum" value="${ sum + num }" /> </c:forEach> 반복끝<br> <jsp:doBody /><!-- 몸체 내용을 실행하기 전에 태그 파일에서 정의한 변수 sum을 태그를 호출한 페이지에 전달 -->
<!-- tagfileNameGiven.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile name-given</title> </head> <body> 태그전<br> <tf:sum end="10" begin="1"> 태그속<br> 1 ~ 10 까지 합 : ${ sum }<br> </tf:sum> 태그끝<br> </body> </html> <!-- 실행결과 태그전 반복전 반복 반복 반복 반복 반복 반복 반복 반복 반복 반복 반복끝 태그속 1 ~ 10 까지 합 : 55 태그끝 -->
4.4.2. variable 디렉티브와 name-from-attribute을 이용해서 변수 추가
- name-given 속성을 사용하면 정해진 변수명만 사용할 수 있는데, 경우에 따라 원하는 이름을 갖는 변수를 추가할 수 있다.
- <%@ attribute name="속성명" rtexprvalue="boolean" required="boolean" type="변수타입" %>
- <%@ variable alias="변수명" name-from-attribute="사용할속성명" scope="변수범위" %>
- alias : 태그 파일에서 변수의 값을 설정할 때 사용할 이름
- name-from-attribute : 변수의 이름을 생성할 때 사용할 속성의 이름
- scope : 변수의 범위, AT_BEGIN AT_END NESTED 중 한개 값을 가진다. 기본 값은 NESTED
<!-- max.tag --> <%@ tag language="java" pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%> <%@ attribute name="var" required="true" rtexprvalue="false"%> <%@ attribute name="num1" required="true" type="java.lang.Integer"%> <%@ attribute name="num2" required="true" type="java.lang.Integer"%> <%@ variable alias="maxNum" name-from-attribute="var" variable-class="java.lang.Integer" scope="AT_END"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> choose 전<br> <c:choose> <c:when test="${ num1 > num2 }"> <c:set var="maxNum" value="${ num1 }" /> </c:when> <c:otherwise> <c:set var="maxNum" value="${ num2 }" /> </c:otherwise> </c:choose> choose 후<br>
<!-- tagfileNameFromAttribute.jsp --> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="tf" tagdir="/WEB-INF/tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>tagfile name-from-attribute</title> </head> <body> 1번째 태그 전<br> <tf:max var="max1" num2="550" num1="300"> 1번째 태그<br> </tf:max> 1번째 태그 후<br> 최대값 : ${ max1 }<br> 2번째 태그 전<br> <tf:max var="max2" num1="550" num2="300" /> 2번째 태그 후<br> 최대값 : ${ max2 }<br> </body> </html> <!-- 실행결과 1번째 태그 전 choose 전 choose 후 1번째 태그 후 최대값 : 550 2번째 태그 전 choose 전 choose 후 2번째 태그 후 최대값 : 550 -->
4.4.3. 변수의 동기화 처리
- 태그 파일이 생성하는 변수의 범위는 NESTED, AT_BEGIN, AT_END 세가지 중 한가지를 가질 수 있다.
- JSP 컨테이너는 태그 파일에서 생성한 변수의 값을 태그 파일을 호출한 페이지의 변수의 값과 동기화하는데 방식은 변수의 범위에 따라서 달라진다.
흐름 / 범위 |
AT_BEGIN |
NESTED |
AT_END |
태그 시작 |
아무것도 안함 |
EL 변수 저장 |
아무것도 안 함 |
<jsp:doBody> 실행 전 |
태그 > 페이지 복사 |
태그 > 페이지 복사 |
아무것도 안 함 |
태그 끝 |
태그 > 페이지 복사 |
EL 변수 복구 |
태그 > 페이지 복사 |
- 태그 파일에서 변수의 값을 설정하기 위해 사용되는 변수를 A라고 가정
- 태그 파일이 호출하는 페이지에 생성한 변수를 B라고 가정
- 태그 파일의 variable 디렉티브에서 name-given 속성인 경우 A와 B는 같다
- 태그 파일의 variable 디렉티브에서 name-from-attribute 속성인 경우 A의 이름은 alias 속성의 값이 되고 B는 name-from-attribute 속성에서 명시한 속성의 값이 된다.
- 태그 > 페이지 복사
- 태그 파일에 A가 존재하면, 그 값을 이용해서 호출하는 페이지의 B를 생성(또는 수정)한다.
- 태그 파일에 A가 존재하지 않는다면 호출하는 페이지의 page영역에서 B를 삭제한다.
- EL 변수 저장
- 호출하는 페이지의 B의 값을 저장한다.
- B가 존재하지 않았다면 존재하지 않았다는 것도 기억한다.
- EL 변수 복구
- EL 변수 저장 시점에서 저장했던 B의 값을 호출하는 페이지에 복구한다.
- 만약 B가 존재하지 않았다면 호출하는 페이지에도 존재하지 않도록 한다.
'Java > Java EE' 카테고리의 다른 글
JSP MVC(Model View Controller) 패턴 - 답변 게시판(Reply Board) (6) | 2013.10.10 |
---|---|
톰캣(Tomcat) 커넥션풀(DBCP) 설정 (2) | 2013.10.01 |
JSP JSTL(JSP Standard Tag Library) - 국제화 태그(포맷팅) (1) | 2013.09.30 |
JSP JSTL(JSP Standard Tag Library) - 함수 태그(functions) (2) | 2013.09.29 |
JSP JSTL(JSP Standard Tag Library) - 코어 태그(core) (6) | 2013.09.23 |