JSP/Servlet – 커스텀 액션에 변수를 사용해보자

 

커스텀 액션에 변수를 선언하려면 variable 지시자를 사용해야 합니다.

 

    <%@variable name-given="변수이름"%>

 

이렇게 선언한 변수는 기본적으로 String 타입이 됩니다.

 

변수의 타입을 설정할 때는 variable-class라는 애트리뷰트를 추가하면 됩니다.

 

    <%@variable name-given="변수이름" variable-class="java.lang.Integer"%>

 

선언한 변수를 태그파일내 뿐만 아니라 커스텀 액션의 본체 밖에서 사용하고자 한다면 scope 애트리뷰트를 추가하면 됩니다.

 

    <%@variable name-given="변수이름" variable-class="java.lang.Integer" scope="사용범위" %>

 

사용 범위는 NESTED, AT_BEGIN, AT_END 중에 한 값을 지정할 수 있습니다. NESTED는 커스텀 액션 본체 안에서만 사용할 수 있고

 

AT_BEGIN은 커스텀 액션의 시작 태그 다음부터, AT_END는 커스텀 액션의 끝 태그 다음부터 사용할 수 있습니다.

 

variable 지시자를 이용해서 변수를 선언한 다음 값을 대입하려면 JSTL의 커스텀 액션인 <c:set>을 사용해야 합니다.

 

    <c:set var="변수이름" value="50" />

 

변수의 값을 가져오기 위해서는 EL식을 사용하면 됩니다.

 

    ${변수 이름}

 

 

위와 같이 JSTL 라이브러리를 lib 폴더에 넣고 tags 폴더에는 태그파일 그리고 Maximum.jsp파일을 프로젝트에 구성합니다.

 

max.tag

 

<%@tag pageEncoding="euc-kr"%>

<%@tag body-content="empty"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@attribute name="num1" type="java.lang.Integer"%>

<%@attribute name="num2" type="java.lang.Integer"%>

<%@variable name-given="maximum" variable-class="java.lang.Integer" scope="AT_END" %>

<%

    int result;

    if(num1 > num2)

        result = num1;

    else

        result = num2;

%>

<c:set var="maximum" value="<%= result %>" />

 

Maximum.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" 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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    최대값 구하기 <BR>

    

    <util:max num1="${param.NUM1 }" num2="${param.NUM2 }" /> <BR>

    최대값 : ${maximum }

</body>

</html>

 

 

실행 화면

최대값 구하는 max 커스텀 액션이 잘 동작합니다.

 

 

이번에는 커스텀 액션을 다음과 같이 만들어보겠습니다.

 

    <util:max var="MAX" num1="${param.NUM1 }" num2="${param.NUM2 }" />

 

이렇게 애트리뷰트를 이용해서 변수를 지정할 때는 var라는 애트리뷰트를 미리 태그파일에 선언해야합니다.

 

또한 이 애트리뷰트를 필수 애트리뷰트로 만들기 위해 required 애트리뷰트를 추가하고 true로 놓습니다.

 

그리고 애트리뷰트에 스크립팅 요소나 익스프레션 언어를 값으로 지정할 수 없도록 하기위해 rtexprvalue 애트리뷰트를 false로 지정해야합니다.

 

    <%@attribute name="var" required="true" rtexprvalue="false" %>

 

변수를 선언하는 variable지시자도 name-given애트리뷰트가 아닌 name-from-attribute를 이용해서 지정합니다. 그리고 태그 파일안에서 사용할 변수는

 

alias 애트리뷰트를 이용해서 할 수 있습니다.

 

<%@variable name-from-attribute="var" alias="maximum"

            variable-class="java.lang.Integer" scope="AT_END" %>

 

 

다시 위와 같이 파일을 구성해 봅시다.

 

max.tag

 

<%@tag pageEncoding="euc-kr"%>

<%@tag body-content="empty"%>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@attribute name="var" required="true" rtexprvalue="false" %>

<%@attribute name="num1" type="java.lang.Integer"%>

<%@attribute name="num2" type="java.lang.Integer"%>

<%@variable name-from-attribute="var" alias="maximum"

        variable-class="java.lang.Integer" scope="AT_END" %>

<%

    int result;

    if(num1 > num2)

        result = num1;

    else

        result = num2;

%>

<c:set var="maximum" value="<%= result %>" />

 

Maximum.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" 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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    최대값 구하기 <BR>

    

    <util:max var="MAX" num1="${param.NUM1 }" num2="${param.NUM2 }" /> <BR>

    최대값 : ${MAX }

</body>

</html>

 

실행 화면

결과는 위와 같습니다.

 

마지막으로 커스텀 액션의 본체 안에서 변수를 사용하는 방법을 알아봅시다.

 

커스텀 액션의 본체 안에서만 변수를 사용할 수 있도록 하기 위해 사용 범위를 'NESTED'로 지정해야합니다.

 

<%@variable name-from-attribute="var" alias="number"

                            variable-class="java.lang.Integer" scope="NESTED"%>

 

 

위와 같이 예제를 구성합니다.

 

compute.tag

 

<%@tag pageEncoding="euc-kr" %>

<%@tag body-content="scriptless" %>

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@attribute name="var" required="true" rtexprvalue="false" %>

<%@attribute name="start" type="java.lang.Integer" %>

<%@attribute name="end" type="java.lang.Integer" %>

<%@variable name-from-attribute="var" alias="number"

                        variable-class="java.lang.Integer" scope="NESTED"%>

<% for(int cnt=start; cnt <= end; cnt++){ %>

    <c:set var="number" value="<%= cnt %>" />

    <jsp:doBody/>

<% } %>

 

 

Square.jsp

 

<%@ page language="java" contentType="text/html; charset=EUC-KR"

pageEncoding="EUC-KR"%>

<%@taglib prefix="util" 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=EUC-KR">

<title>Insert title here</title>

</head>

<body>

    제곱 테스트<BR>

    <util:compute var="num" start="1" end="5">

        ${num } 제곱 = ${num * num } <BR>

    </util:compute>

</body>

</html>

 

실행 화면

실행을 하면 커스텀 액션이 제대로 동작하는 것을 알 수 있습니다.

블로그 이미지

가카리

프로그래밍, 취업 및 직장생활, 주식 부동산 재테크 전문 블로그

댓글을 달아 주세요