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가 존재하지 않았다면 호출하는 페이지에도 존재하지 않도록 한다.

+ Recent posts