[서블릿/JSP] *.tag 태그 파일내부에서 사용한 attribute name과 scope 객체의 attribute name 겹치는 경우
Servlet&Jsp 2019. 8. 11. 09:00이전글
공유변수와 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의
attribute
에 sumResult
라는 이름으로 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
디렉티브를 통해 태그의 속성을 추가로 하나 더 받습니다. 이 속성을 통해 공유변수명을 지정할것입니다. rtexprvalue
를 false
로 한 이유는 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 |
결과
'Servlet&Jsp' 카테고리의 다른 글
[서블릿/JSP] JSP 1.2 버전 커스텀 태그 만들기 (0) | 2019.08.29 |
---|---|
[서블릿/JSP] JSP 1.2 방식으로 태그 속성 및 커스텀 태그 몸체 처리하기 (0) | 2019.08.29 |
[서블릿/JSP] *.tag 태그파일에서 동적 속성 사용하는 방법 (0) | 2019.08.11 |
[서블릿/JSP] *.tag 태그 파일 내부에서 사용한 변수를 호출한 JSP로 넘기기 (0) | 2019.08.10 |
[서블릿/JSP] 태그파일 방식으로 커스텀 태그 만들기 (0) | 2019.08.10 |