JSTL을 사용하면서 필요에 의해 찾게 된 기능 중 하나가 바로 숫자 포맷을 맞추는 것이다.

연도, 월을 선택하는 select 박스를 만들던 중 1월에서 9월까지를 01월에서 09월로 표현하기 위해 찾았다.


우선 사용을 위해서는 상단에 taglib을 추가해야하는데, 추가할 taglib은 아래와 같다.

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

위의 taglib을 추가하였으면 fmt JSTL을 JSP에서 사용할 수 있다.


월을 두자리 숫자로 나타내기 위해 사용한 formatNumber은 아래와 같다.

<fmt:formatNumber value='month' pattern='00' />


물론 실제 사용할 때는 selected의 option부분을 forEach문을 이용하여 사용하였기에 value에는 forEach문의 변수가 들어가도록 넣었다.

그리고 selected의 값을 위해 if를 사용하여 비교(선택된 값인 month변수의 값이 있는 경우)를 하였다.

<c:forEach var="i" begin="1" end="12">

<option value="<fmt:formatNumber value='${13 - i}' pattern='00' />"

<c:if test="${13 - i eq month*}">selected="selected"</c:if>>

<fmt:formatNumber value='${13 - i}' pattern='00' />

</option>

</c:forEach>

기존에 숫자 포맷을 맞출 필요가 없을 때는 해당 부분에 <c:out>을 사용하여 값을 보여줬었다.


*) 위에 type은 정의하지 않았는데 number를 기본 값으로 가지며, number, percent, urrency가 존재한다.


JSTL을 이용하여 합계를 구하는 방법이 필요할 때가 있다.

(기본적으로 <c:set>, <c:out>을 사용한다.)


개인적으로는 forEach문과 함께 사용하는 경우가 많은 것 같다.

보통 가장 우측이나 하단에 합계에 관련되어 숫자를 계산하기에 적합하다.


아래 형태는 우측에 합계를 나타낼 때 자주 사용할 수 있는 형태이다.

<c:forEach items="${output}" var="data">

<c:set var="row_sum" value="0" />

<tr>

<td>

<c:set var="row_sum" value="${row_sum+ data.num_1}"

</td>

<td>

<c:set var="row_sum" value="${row_sum+ data.num_2}"

</td>

……

<td>

<c:set var="row_sum" value="${row_sum+ data.num_n}"

</td>

<td>

<c:out value="${row_sum}" />

</td>

</tr>

</c:forEach>


아래 형태는 하단에 합계를 나타낼 때 자주 사용할 수 있는 형태이다.

<c:set var="col_sum" value="0" />

<c:forEach items="${output}" var="data">

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_1}"

</td>

</tr>

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_2}"

</td>

</tr>

……

<tr>

<td>

<c:set var="col_sum" value="${col_sum+ data.num_n}"

</td>

</tr>

</c:forEach>

<tr>

<td>

<c:out value="${col_sum}" />

</td>

</tr>


두가지 모두를 사용해서 한 테이블을 나타낼 수도 있고, 각각 필요한 걸 사용할 수도 있다.

굳이 <c:set>이 <td>안에 들어가지 않더라도 사용하는데는 문제가 없으나 기본 위치를 저렇게 생각하고 사용하면 개인적으로 편리한 것 같다.

우측 합계와 같이 변수를 따로 몇개 더하지 않아도 된다면 굳이 <c:set>을 사용하지 않고, <c:out>안에서 더하더라도 상관 없을 것 같다.

+ Recent posts