[ JSTL 이란? ]
JSTL은 JSP에서 유용하게 사용될 수 있는 기능을 만들어 둔 커스텀 태그 라이브러리이다. JSTL을 사용하면 JSP에서 스크립트릿의 사용을 줄일 수 있으며 특히 화면에 데이터를 표현할 때 필요한 프로그램 요소를 대체할 수 있어 유용하다.
JSTL을 사용하기 위해서는 라이브러리를 다운받고 적용하고 선언해야 하는데 차례차례 해보도록 하자.
우선 http://tomcat.apache.org/taglibs/standard/ 이곳을 들어갑니다.
Standard 1.1 다운로드를 클릭해주세요.
birnaries를 클릭해주세요.
jakarta-taglibs-standard-1.1.2.zip을 다운로드 받고 압축을 풉니다.
그 다음 lib 폴더로 들어오면 두 개의 jar파일이 있는데 이것을 모두 복사한다.
그리고 여러분들이 적용할 프로젝트의 WEB-INF/lib 에 모두 붙여 넣습니다.
여기까지가 JSTL 라이브러리를 추가한 것이다. 이제 JSTL 사용 선언을 해보자.
core(핵심) 라이브러리를 사용하기 위해서 taglib 지시어에 다음과 같이 입력을 해주면 된다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set> 태그
변수를 설정하거나 객체의 멤버변수 값을 설정할 때 사용하는 태그이다.
<c:set var="변수이름" value="값" />
이렇게 선언하면. ${변수이름}을 사용할 수 있다.
다른 영역에 저장하고 싶다면, scope="session"을 추가하면 된다. 디폴트 값은 "page"이다.
<c:set var="변수이름" value="값" [scope={"page|request|session|application"}] />
그런데 이 변수는 내부적으로 자바 변수로 선언되는 것이 아니라 page 데이터 영역의 속성으로 선언되기 때문에 <%= 변수이름%> 형태로는 출력될 수 없다.
<c:out> 태그
이 태그는 변수 내용을 출력할 때 사용되는 태그이다. EL태그로도 출력할 수 있지만, 아래와 같이 태그가 포함된 변수를 escapeXml 항목을 true/false 지정해서 태그를 포함해서 출력할지 적용해서 출력할지 결정할 수 있다.
<c:set var="aaa" value="hello" />
<!-- 1. 태그 바디가 없는 경우 -->
<c:out value="${aaa}" [escapeXml="{true|false}"] />
<!-- 2. 태그 바디가 있는 경우 -->
<c:out value="${aaa}" [escapeXml="{true|false}"] >
default value(value에 내용이 없을 때 출력될 기본 값)
</c:out>
<c:remove> 태그
이 태그는 변수를 제거할 때 사용된다.
<c:remove var="변수이름" />
이렇게 사용하면 해당 이름의 변수가 사라진다. 그런데 이렇게 선언할 경우 모든 scope에 해당 이름을 가진 변수가 제거되므로 특정 영역의 변수만 제거하고 싶다면 다음과 같이 한다.
<c:remove var="변수이름" scope="request" />
<c:if test="true|false"> 태그
test 안의 내용이 true이냐 false이냐에 따라서 내용을 출력하거나 출력하지 않는다. 따라서 EL 형태를 응용해서, <c:if test="${ 10 > 0 }" > 이렇게 표현한다면 EL은 true/false를 리턴할 것이고 그 값에 따라 JSTL도 동작하게 되는 형태이다.
자바의 if문과 유사하지만, else는 지원하지 않는다.
<!-- 1. 바디 내용이 없는 경우 -->
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"] />
<!-- 2. 바디 내용이 있는 경우 -->
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]>
body content
</c:if>
예시를 들자면 다음과 같다.
<c:remove var="aaa" />
<c:if test="${empty aaa ? true : false}" var="result">
empty!<br>
</c:if>
${result}
실행 결과는,
empty!
true
가 된다.
test 안에 넣을 부분을 EL을 사용해서 조금 더 구체적으로 활용할 수 있다.
<c:if test="${(!empty param.id) && (!empty param.password) ? true : false}" var="result">
두 값 모두 존재한다.<br>
</c:if>
${result}
이런 id값과 password 모두가 들어왔는지 체크해서 처리하는 루틴도 고려해볼 수 있다.
<c:choose>, <c:when>, <c:otherwise> 태그
이들 태그는 함께 사용되며, 자바의 if~else if문, switch문과 기능이 유사하다.
<c:choose> 태그 내에는 <c:when> 태그가 여러 개 올 수 있다.
<!-- <c:choose>는 일종의 스위치 문이다.
처음 일치하는 것만 출력한다. -->
<c:choose>
<c:when test="${1 > 0}">
1은 0보다 크다<br>
</c:when>
<c:when test="${2 > 1}">
2은 1보다 크다<br>
</c:when>
<c:otherwise>
대부분 숫자는 0보다 크다<br>
</c:otherwise>
</c:choose>
좀 더 응용을 해보자.
<body>
<form action="jstl.jsp">
<select name="name">
<option value="장동건">장동건</option>
<option value="권상우">권상우</option>
</select>
<input type="submit" value="전송">
</form>
<c:choose>
<c:when test="${param.name == '장동건'}">
${param.name}
</c:when>
<c:when test="${param.name == '권상우'}">
${param.name}
</c:when>
<c:otherwise>
선택 안했네..
</c:otherwise>
</c:choose>
</body>
<c:forEach> 태그
반복문과 관련된 태그로, forEach 태그는 자바 for문과 유사하다. 가장 유용하고 중요한 JSTL 태그 중 하나이다.
<!-- 1. 컬렉션 객체의 크기 만큼 반복 -->
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
body content
</c:forEach>
<!-- 2. 지정된 횟수 반복 -->
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"]>
body content
</c:forEach>
1부터 10까지 출력하는 예제를 들어보자.
<c:forEach var="임시변수명" begin="1" end="10">
${임시변수명}<br>
</c:forEach>
이번에는 1, 3, 5, 7 .. 순으로 증가하도록 증가치를 지정해보자.
<c:forEach var="임시변수명" begin="1" end="10" step="2">
${임시변수명}<br>
</c:forEach>
이번에는 배열의 내용을 순서대로 출력하는 예제를 살펴보자.
<c:forEach var="배열 요소를 저장할 임시변수 이름" items="${배열이름}">
${배열 요소를 저장할 임시변수 이름}<br>
</c:forEach>
<c:forTokens>
문자열에 포함된 토큰을 분리해서 각각의 토큰에 대해 반복 처리를 수행하도록 만드는 기능이다.
기본적으로는 for문과 유사하지만, StringTokenizer 클래스 기능을 제공한다.
자바의 StringTokenizer 클래스는 문자열로부터 특정 구분자(공백, '-' 등)를 기준으로 문자열을 분할하는 기능을 제공하는 클래스이다.
<c:forTokens var="temp" items="aaa bbb ccc" delims=" ">
${temp}<br>
</c:forTokens>
그런데 문자열을 분할할 때 여러 개가 가능하다.
<c:forTokens var="temp" items="aaa!bbb@ccc^ddd" delims="!@^">
${temp}<br>
</c:forTokens>
결과는 aaa, bbb, ccc, ddd가 분리되어 출력된다.
<날짜와 관련된 태그>
<fmt:formatDate value="<%=new Date() %>" type="both" />
위와 같이 할 경우, 날짜와 시간이 모두 출력되게 된다. type에 date, time 둘 중 하나를 쓰면 하나만 나오게 된다.
<숫자와 관련된 태그>
<fmt:formatNumber value="12345678" groupingUsed="true"/><br>
<fmt:formatNumber value="3.141592" pattern="#.##"/>
위의 경우 세 자리마다 끊어서 쉼표가 출력되고, 아래의 경우 소수점 둘째자리까지만 출력된다.
'Programming > Servlet' 카테고리의 다른 글
서블릿(Servlet) 필터(Filter)를 사용하여 한글 처리 문제를 해결하기(어노테이션 방식) (0) | 2020.08.03 |
---|---|
서블릿(Servlet) url 매핑기법 2가지(web.xml 방식, 어노테이션 방식) (0) | 2020.07.30 |
[JSP] JSP Beans(빈즈)에 대해 알아보자 (0) | 2019.10.09 |
[JSP] 표현언어(Expression Language)란? (0) | 2019.10.09 |
(Servlet/JSP) setCharacterEncoding, setContentType 정리 (4) | 2019.10.02 |