커스텀 액션 태그(Custom Action Tag)
* 커스텀 액션 태그(Custom Action Tab)
JSTL ?
jsp에서 사용되는 커스텀 액션 태그
공통적으로 사용되는 코드들을 합하여 보다 쉽게 사용할 수 있도록 태그화하여
표준으로 제공되는 라이브러리
라이브러리 추가
1. 톰캣사이트 접속 "https://tomcat.apache.org/"
2. 메뉴에서 taglib 메뉴를 찾아 접속 (Download-Taglibs)
3. 4개의 라이브러리 파일 다운로드(.jar) -> dev-jstl 폴더에 복사
4. WEB-INF/lib/ 위치에 라이브러리 추가
JSTL 선언방법
JSTL을 사용하기 위하여 해당 jsp페이지 상단에 taglib 지시어를 사용하여 선언
<%@ taglib prefix="접두어" uri="라이브러리 파일상의 uri주소" %>
1. JSTL Core Library
변수와 조건문, 반복문 등 로직과 관련된 문법을 제공
1) 변수
변수 선언과 동시에 초기화 <c:set var="변수명" value="값" [scope="저장객체"]>
- 변수 선언하고 초기화까지의 기능을 제공
- 해당 변수의 저장된 값을 어떤 scope에 setAttribute를 통해서 담아둘지 결정
=> c:set으로 선언한 변수는 반드시 EL로 접근해야 함!
ex1) num1 이라는 변수에 10이라는 값을 저장
<c:set var="num1" value="10"/> => pageContext.setAttribute("num1", 10)
scope를 지정하지 않으면 기본 pageScope로 지정된다.
ex2) request 영역에 num2라는 변수에 20이라는 값을 저장
<c:set var="num2" value="20" scope="request"/>
=> c:set으로 선언한 변수는 반드시 EL로 접근해야 함!
num1 : ${ num1 }
num2 : ${ num2 }
ex3) num1과 num2의 합을 저장한 addNum이라는 변수를 session 영역에 저장
<c:set var="addNum" value="${ num1 + num2 }" scope="session"/>
addNum : ${ addNum }
- value 속성 대신 시작태그와 종료태그 사이에 초기값 지정 가능
<c:set var="result">
9999
</c:set>
=> ${ result }
<c:set var="result" value="7777" scope="request"/>
변수 삭제 <c:remove var="삭제할 변수명" [scope="삭제하고자하는 영역"]>
- 해당 scope 영역에 저장되어 있는 변수를 찾아 제거하는 태그
=> 해당 scope에 .removeAttribute() 를 사용하여 제거하는 것과 동일하게 처리됨
ex1) addNum 변수를 삭제, 특정 scope 영역에서 제거
addNum : ${ addNum }
<c:remove var="addNum" scope="session"/>
ex2) 모든 scope에서 result 제거
<c:remove var="result"/>
변수(데이터) 출력 <c:out value="출력하고자 하는 값" [default="기본값"] [escapeXml="true|false"]>
ex1) addNum에 저장된 값을 출력
<c:out value="${ addNum }" />
<c:out value="${ addNum }" default="데이터 없음" />
ex2) outData라는 변수에 "강조태그!!!" 값을 저장
<c:set var="outData" value="강조태그!!!" />
<c:out value="${ outData }" />
excapeXml 속성이 true(기본값)
-> 출력데이터에 태그가 포함되어 있는 경우 해석되지 않음 => innerText
<c:out value="${ outData }" escapeXml="false" /> => innerHTML
2. 조건문 - if <c:if test="조건식">
- Java의 if문과 비슷한 역할을 하는 태그
- 조건식은 test 속성에 작성 (EL구문을 사용하여 작성)
ex1) num1이 num2보다 큰가? JSTL로 선언된 변수는 접근 불가! (EL로만 접근 가능)
<c:if test="${ num1 > num2 }">
num1이 num2보다 큽니다.
</c:if>
<c:if test="${ num1 < num2 }">
num1이 num2보다 작습니다.
</c:if>
ex2) hi 변수에 저장된 값이 "안녕" 일 경우 hihihi~ 출력, 그렇지 않은 경우 byebye 출력
<c:set var="hi" value="안녕" />
<c:if test="${ hi eq '안녕' }">
hihihi~ <br>
</c:if>
<c:if test="${ hi ne '안녕' }">
byebye <br>
</c:if>
3. 조건문 - Choose <c:choose, c:when, c:otherwise>
- Java의 if - else, if - else if문과 비슷하게 동작하는 태그
- 구조
choose 하위 요소로 c:when, c:otherwise를 사용!
c:choose
c:when /c:when
c:otherwise /c:otherwise
c:choose
ex1) num1의 값이 20보다 크면 "20보다 큼", 10보다 크거나 같으면 "10보다 크거나같음"
, 그렇지 않으면 "10보다 작음" 을 출력
<c:choose>
<c:when test="${ num1 gt 20 }">
20보다 큼
</c:when>
<c:when test="${ num1 ge 10 }"> (<== <%-- num1 >= 10 )
10보다 크거나 같음
</c:when>
<c:otherwise>10보다 작음</c:otherwise>
</c:choose>
4. 반복문 - c:forEach
for loop문 <c:forEach var="변수명" begin="초기값" end="끝값" [step="반복 시 증가값"]>
향상된 for문 <c:forEach var="변수명" items="배열/컬렉션(순차적으로 접근하고자 하는 객체)"
[varStatus="현재 접근된 요소의 상태값을 보관하는 변수명"]>
<c:forEach var="i" begin="0" end="9">
i의 값은 : ${ i }
</c:forEach>
ex1) h1 ~ h6 태그를 출력하는데, "나는 hx태그야"
<c:forEach var="t" begin="1" end="6">
<h${ t }> 나는 h${ t }태그야 </h${ t }>
</c:forEach>
ex2) <c:set var="fruits">
수박, 애플, 토마토, 망고, 딸기
</c:set>
- fruits에 저장된 값 : ${ fruits }
<c:forEach var="f" items="${ fruits }">
${ f }
</c:forEach>
ex3) colors라는 변수에 4가지의 색상을 콤마(,)로 구분하여 저장, 목록 태그로 해당 글자 색상을 출력
<c:set var="colors">
red, orange, blue, pink
</c:set>
<ul>
<c:forEach var="c" items="${ colors }">
<li style="color: ${ c };">${ c }</li>
</c:forEach>
</ul>
ex4) ArrayList<Person> list = new ArrayList<>();
list.add(new Person("홍길동", 30, "남자"));
list.add(new Person("홍골동", 26, "남자"));
list.add(new Person("홍걸동", 25, "여자"));
<c:set var="pList" value="<%= list %>" scope="request"/> (<== request.setAttribute("pList", list); )
<table border="1">
<thead>
<tr>
<th>No</th>
<th>이름</th>
<th>나이</th>
<th>성별</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ empty pList }">
<tr>
<td colspan="4">조회된 결과가 없습니다.</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach var="p" items="${ pList }" varStatus="s">
<tr>
<td>${ s.count }</td> (count: 1부터 시작)
<td>${ p.name }</td>
<td>${ p.age }</td>
<td>${ p.gender }</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</tbody>
</table>
5. 반복문 - forTokens
특정 구분자를 통해서 순차적으로 접근하고자 할 때 사용
<c:forTokens var="변수명" items="분리하고자하는대상" delims="구분자">
- 구분자를 통해서 분리된 각각의 값에 순차적으로 접근하여 반복문 수행
- 콤마(,)가 아닌 다른 구분자를 사용하고자 할 때 사용
- Java에서 문자열.split("구분자") 또는 StringTokenizer 와 비슷한 기능
ex) movie라는 이름의 변수에 5개 저장 (구분자: / . ,)
<c:set var="movie" value="에일리언/행복의나라.인사이드아웃2,친구.유희왕빛의피라미드" />
영화 목록
<ol>
<c:forTokens var="m" items="${ movie }" delims="/.,">
<li>${ m }</li>
</c:forTokens>
</ol>
6. url, query string 관련 - c:url, c:param
url 경로를 생성하고, query string을 정의해 둘 수 있는 태그
<c:url var="변수명" value="요청할url">
<c:param name="키값" value="데이터" />
<c:param name="키값" value="데이터" />
</c:url>
<c:url var="listUrl" value="list.do">
<c:param name="cpage" value="1"/>
<c:param name="num" value="10"/>
</c:url>