이전글


태그 내부의 속성값을 태그를 호출한 JSP와 공유하는 방법
태그파일을 이용하여 커스텀태그를 개발하였을때 속성을 정의하는 디렉티브(지시자)는 <%@ attribute @> 디렉티브입니다. 그렇다면 다음과 같이 두 속성 num1num2sum이라는 커스텀태그로 넘겨주었을때 내부에서 더해진 결과값 sumResult 속성을 얻어내고 싶다면 어떻게 해야할까요?


태그 내부에서 사용된 속성을 태그를 호출한 JSP에서 공유하기 위한 지시자가 <%@ variable %> 디렉티브입니다. <%@ variable %> 디렉티브는 표현언어(EL) 그리고 JSTL과 하나의 세트로 사용됩니다.





예제 프로젝트
커스텀태그에서 JSP와의 데이터 공유를 어떤식으로 하고 <%@ variable %> 디렉티브가 어떤식으로 동작하는지 예제를 통해 알아보도록 하겠습니다.

예제 풀소스는 다음 예제 GIT 소스 링크의 sum.tag태그파일과 variableDirectiveTest.jsp테스트파일 두가지를 참고하시기 바랍니다. 추가적으로 데이터 공유는 JSTL 코어의 <c:set> 태그가 필요하므로 JSTL 라이브러리 .jar 파일들을 WEB-INF/lib 하위에 넣어주어야 합니다. 





variable 디렉티브(지시자)
variable 디렉티브는 EL을 통해 태그 내부의 값을 JSP와 공유하기 위해 사용됩니다. <%@ variable %> 디렉티브에서 사용할 수 있는 속성들은 다음과 같고 자세한것을 예제를 진행하면서 알아볼 것입니다.

속성명
설명
name-from-attribute
공유 변수명을 attribute 디렉티브를 통해 동적으로 정하는 경우 사용할 attribute name을 지정합니다.
name-given
EL에서 사용할 변수명을 지정합니다.
scope
공유 변수가 EL을 통해 사용될 범위를 JSP를 기준으로 지정합니다.
AT-BEGIN : 태그가 시작되는때부터 사용합니다.
NESTED : 시작태그와 끝태그 사이 태그 몸체에서 사용합니다.
AT_END : 끝태그 이후부터 사용됩니다. 즉 태그를 사용한 JSP를 기준으로 태그 호출 이후 공유변수를 사용할 수 있습니다.
variable-class
공유 변수에 대한 자료형 타입을 지정합니다.
description
공유 변수에 대한 설명을 입력합니다.




태그를 호출하는 variableDirectiveTest.jsp 파일 작성
먼저 실질적으로 sum태그를 호출하는 variableDirectiveTest.jsp파일을 작성할것입니다. 태그를 호출한 이후 EL 구문으로 ${sumResult}를 사용하여 태그 내에서 처리한 덧셈 결과를 출력하고 있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="dololak" tagdir="/WEB-INF/tags" %>
<html>
<head>
<title>커스텀 태그  속성 공유 테스트</title>
</head>
<body>
    <!--태그실행 -->
    <dololak:sum num1="3" num2="10" />
    
    <!-- 실행후 공유된 변수값 출력 -->
    덧셈 결과 : ${sumResult}
</body>
</html>
cs




sum.tag 태그파일 작성
다음은 커스텀 태그파일입니다.
<%@ tag body-content="empty"  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<%@ attribute name="num1" required="true"  type="java.lang.Integer" %>
<%@ attribute name="num2" required="true"  type="java.lang.Integer" %>
<%@ variable name-given="sumResult"  variable-class="java.lang.Long" scope="AT_END" %>
 
<c:set var="sumResult" value="${num1 + num2}"/>
cs


태그파일의 내용은 매우 심플한데, 태그를 정의하는 내용과 JSTL 태그 라이브러리 사용을 선언하는 부분이 있습니다. 그리고 다음 코드와 같이 덧셈을 수행할 피연산 변수값을 받아올 attribute 디렉티브가 있습니다.
<%@ attribute name="num1" required="true"  type="java.lang.Integer" %>
<%@ attribute name="num2" required="true"  type="java.lang.Integer" %>
cs


다음 코드가 핵심입니다.
<%@ variable name-given="sumResult"  variable-class="java.lang.Long" scope="AT_END" %>
cs

variable디렉티브를 통해 공유 변수를 설정합니다. name-given을 통해 공유변수로 사용할 변수명을 지정합니다. 태그를 호출하는 JSP에서는 EL지정한 변수명으로  사용하여 값을 사용할 수 있습니다. variable-class속성은 해당 공유 변수의 자료형을 지정합니다. EL은 내부적으로 사용하는 타입이 정수의 경우 java.lang.Long타입을 사용하므로 Long으로 지정해 주어야 오류가 나지 않습니다.

scope속성은 JSP에서 태그를 호출했을때의 공유변수를 어느 시점부터 사용이 가능한지의 범위를 지정합니다. AT_BEGIN으로 지정해도 결과는 같지만 태그가 끝나는 시점부터라는 의미의 AT_END로 지정하여 더욱 범위를 명확하게 할 수 있습니다.


variable 디렉티브는 공유 변수에 대한 설정을 해준것 뿐 실제 어떤 값이 담기는것은 아닙니다. 다음의 JSTL <c:set>을 통해 sumResult 공유변수에 더한값을 세팅해 주어야 합니다.
<c:set var="sumResult" value="${num1 + num2}"/>
cs











테스트
테스트 결과는 다음과 같습니다.







pageContext 기본객체를 이용하여 공유변수값 출력하기
태그 내에서 값을 공유할때 내부적으로 JSP의 기본객체인 pageContext#setAttribute() 메서드를 이용하여 값을 세팅합니다. 따라서 태그를 호출한 후 다음과 같은 방법으로 EL을 대신하여 값을 가져올 수 있습니다.
<!--태그실행 -->
<dololak:sum num1="3" num2="10" />
 
<!-- 실행후 공유된 변수값 출력 -->
덧셈 결과 : ${sumResult}<br/>
덧셈 결과2 : <%= pageContext.getAttribute("sumResult"%>
cs

호출결과는 다음과 같습니다.




다음글


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!