이전글


공유변수와 scope상의 Attribute Name 충돌
태그파일 (*.tag)을 이용하여 커스텀태그를 개발했을때 <%@ variable %> 디렉티브와 name-given속성을 이용하면 커스텀태그를 호출한 JSP페이지와 해당 변수값을 공유할 수 있습니다. 이방법에 대한것은 이전글에서 포스팅하였습니다. 예제 GIT 소스
<%@ 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

그런데 이경우 한가지 문제가 있습니다. JSP상의 scope객체들 사이에 공유변수와 같은이름의 변수명으로 된 값이 있다면 변수명이 중복됩니다. 

예를 들어 request scope의 attributesumResult라는 이름으로 100을 설정해 두었을때 커스텀태그가 실행된 이후에는 ${sumResult}의 결과가 100이 아닌 13으로 출력될것입니다. JSP에서 사용하는 값이 많아질수록 변수명이 겹쳐질 확률이 높습니다.
<%
    request.setAttribute("sumResult"100);
%>
 
<!--태그실행 -->
<dololak:sum num1="3" num2="10" />
 
<!-- 실행후 공유된 변수값 출력 -->
덧셈 결과 : ${sumResult}<br/>
cs










태그 호출시 공유변수명 동적으로 지정하기
variable 디렉티브의 name-from-attribute속성을 이용하는 방법이 있습니다. sum2.tag라는 커스텀 태그를 다음과 같이 작성합니다.
<%@ tag body-content="empty"  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<%@ attribute name="attName" required="true" rtexprvalue="false"  %>
<%@ attribute name="num1" required="true"  type="java.lang.Integer" %>
<%@ attribute name="num2" required="true"  type="java.lang.Integer" %>
<%@ variable name-from-attribute="attName" alias="sumResult"  variable-class="java.lang.Long" scope="AT_END" %>
 
<c:set var="sumResult" value="${num1 + num2}"/>
cs


추가 및 변경된 부분은 다음 두 줄입니다.
<%@ attribute name="attName" required="true" rtexprvalue="false"  %>
<%@ variable name-from-attribute="attName" alias="sumResult"  variable-class="java.lang.Long" scope="AT_END" %>
cs

attribute디렉티브를 통해 태그의 속성을 추가로 하나 더 받습니다. 이 속성을 통해 공유변수명을 지정할것입니다. rtexprvaluefalse로 한 이유는 JSP에서 해당 속성 사용시 스크립트 요소나 EL등을 통해 지정하지 못하게 해야하기 때문입니다.

variable 디렉터리의 name-from-attribute속성을 통해 "attrName" 으로 들어온 속성값을 공유변수로 지정하도록 했습니다. alias는 별칭을 지정할 수 있는 속성인데, "sumResult"로 값을 주었기 때문에 태그 내부에서는 공유변수명을 "sumResult"로 사용할 수 있습니다.


정리하자면 다음과 같습니다.






태그 호출 JSP 작성
커스텀태그를 호출할 variableDirectiveTest2.jsp 파일의 내용은 다음과 같습니다. attrName값을 "mySumResult"으로 지정하였기 때문에 태그 호출후 EL에서 ${mySumResult}로 변수를 공유합니다.
<%@ 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:sum2 attrName="mySumResult" num1="300" num2="10" />
    
    <!-- 실행후 공유된 변수값 출력 -->
    덧셈 결과 : ${mySumResult}<br/>
    
</body>
</html>
cs



테스트 결과






태그 내부에서 사용하는 alias변수인 "sumResult"request 스코프상에서 사용한다 하더라도 변수가 충돌나지 않습니다.
<%
    request.setAttribute("sumResult"100);
%>
 
<!--태그실행 -->
<dololak:sum2 attrName="mySumResult" num1="300" num2="10" />
 
<!-- 실행후 공유된 변수값 출력 -->
덧셈 결과 : ${mySumResult}<br/>
덧셈 결과2 : ${sumResult}
cs


결과



블로그 이미지

도로락

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

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