JSTL이란?
- EL태그는 JSP의 표현식을 대체한 것이라면, JSTL은 개발자들이 만든 커스텀 태그를 표준화한 것이다.
- body태그에서 사용
- 정식 문법이 아니며, 라이브러리 파일(.jar)을 다운받은 후, 지시자로 선언하여 사용.
- https://tomcat.apache.org/download-taglibs.cgi
- Jar Files 다운 (4개 다 받아도 OK) WEB-INF/lib에 복붙한다.
<%@ taglib prefix="" uri="" %>
- JSTL 페이지 작성 시 <%@ %> 지시자를 이용하여 알린다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- prefix(uri에 내가 쓰려는 태그를 설정, 접두어를 붙여줌)와, uri 속성을 지닌다.
- prefix=”c”일때
- 태그 종류 : 코어, XML, 국제화, 데이터베이스, 함수
- <c:out …/>
- EL과 함께 쓰임.
공유공간 명칭
JSTL |
EL |
JSP |
영역설명 |
page |
pageScope |
pageContext |
하나의 파일에서 등록시킨 객체를 동일 파일 내에서만 접근할 수 있는 영역 |
request |
requestScope |
request |
하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 한 번 응답 후 사라짐.) |
session |
sessionScope |
session |
하나의 파일에서 등록시킨 객체를 다른 파일에서도 접근할 수 있는 영역(하나의 사용자에게 여러 번 응답해도 계속 기억.) |
application |
applicationScope |
application |
여러 사용자가 요청하고 응답해도 기억하는 영역 (호스트 이름을 기억하는 용도로 주로 쓰임) |
Core태그
<c(Core태그):태그의 속성태그명 var="" value="" [scope=""]/>
set태그
- 객체를 공유공간에 등록시키기 위한 태그.
- 이름, 값이 필요
1값을 가지는 변수 cnt를 공유영역(page)에 등록<br>
<c:set var="cnt" value="1"/>
공유영역에 등록된 변수 cnt출력<br>
cnt : ${ cnt }
<hr>
cnt변수에 1 더하고, cnt값 출력<br>
<c:set var="cnt" value="${ cnt + 1 }" scope="request"/>
<%-- request에 선언된 변수이므로 cnt+1값이 나오지 않음 --%>
cnt : ${ cnt }<br>
request cnt : ${ requestScope.cnt }<br>
remove태그
request공유영역에 등록된 cnt변수 삭제<br>
<c:remove var="cnt" scope="request"/>
cnt삭제 후<br>
page cnt : ${ cnt }<br>
request cnt : ${ requestScope.cnt }<br>
- request영역의 cnt를 삭제했기 때문에 page영역의 cnt는 남아있지만, request영역의 cnt는 empty상태가 된다.
out태그
- 출력전용 태그
- 악성 코드가 삽입될 수 있어서 out태그 사용 클릭했을 때 이상한 링크로 넘어갈 수 있어서 텍스트를 텍스트로 인식하게한다.(최소한의 안전장치)
- 속성
- default=”” : EL내장객체에 없고, 공유영역에도 없을 때 출력할 값 지정
- escapeXml=”true”/”false” : html태그 해석여부 설정 (true :문자로해석, false :html태그로해석)
value속성에 태그가 들어있는 경우(escapeXml = true)<br>
<c:out value="<h1>Hello</h2>" escapeXml="true"/><br>
<hr>
value 속성에 태그가 들어있는 경우(escapeXml = false)<br>
<c:out value="<h1>Hello</h2>" escapeXml="false"/><br>
value속성에 태그가 들어있는 경우(escapeXml = true)
<h1>Hello</h1>
value 속성에 태그가 들어있는 경우(escapeXml = false)
Hello
if태그
- test=”조건”이 참일 경우에만 실행! (else는 없음)
- type이 S인 경우 관리자님 환영합니다. U일때 회원님 환영합니다. 가 나오게 하고싶다면?
<c:if test="${ param.type == 'S' }">
<h2>관리자님 환영합니다.</h2>
</c:if>
<c:if test="${ param.type == 'U' }">
<h2>회원님 환영합니다.</h2>
</c:if>
- 모두 조건을 걸어줘야 하는 단점 (속도측면에서 좋지않음)
- 해결방법 : choose
choose태그
- 다중 선택 태그
- n개중에 하나 만족시 나머지를 확인하지 않음.
- when : 조건이 참일 경우 실행할 내용
- otherwise : when절이 모두 거짓일 경우 실행.
<c:choose>
<c:when test="${ empty param.type }">
<h3>파라미터가 잘못되었습니다.</h3>
</c:when>
<c:when test="${ param.type == 'U' }">
<h3>회원님 환영합니다!</h3>
</c:when>
<c:otherwise>
<h3>관리자님 환영합니다.</h3>
</c:otherwise>
</c:choose>
forEach태그
- 반복문
- 속성
- var : 사용할 변수명 (i = 자바에서 for(int i)역할)
- items : 반복시킬 대상 객체 지정
- begin : 시작값
- end : 마지막 값
- varStatus : 반복문의 상태를 알려줌
년도선택 :
<select>
<option>2000</option>
<option>2001</option>
<option>2002</option>
<option>2003</option>
</select>
- select태그에 년도 값을 넣고자 할 때 이전에는 하나하나 직접 작성해야했다면 아래와 같이 forEach태그를 이용해서 코드를 간결하게 만들 수 있다.
년도선택 : <select>
<c:forEach begin="1921" end="2021" var="year" step="5">
<option>${ year }</option>
</c:forEach>
</select>
- step속성은 커지는 크기를 조절할 수 있다.(ex . 5씩 커지게)
- ,를 찍는 다양한 방법
<%
String[] names = {"홍","강","윤","박"};
pageContext.setAttribute("names", names);
pageContext.setAttribute("nameslgth", names.length);
%>
<c:forEach begin="0" end="${ nameslgth-1 }" var="n">
<c:if test="${ n != 0 }">
,
</c:if>
${ names[n] }
</c:forEach>
<br>
<c:forEach begin="0" end="3" var="n">
${ names[n] }
<c:if test="${ n < 3 }">
,
</c:if>
</c:forEach>
<br>
<c:set var="cnt" value="0"/>
<c:forEach items="${ names }" var="n">
<c:if test="${ cnt != 0 }">
,
</c:if>
${ n }
<c:set var="cnt" value="${ cnt+1 }" />
</c:forEach>
<c:remove var="cnt" scope="page" />
<br>
- 모두 같은 결과를 보여줌.
- varStatus
- first : 반복문의 처음인지 판단. 참/거짓 반환
- last : 반복문의 마지막인지 판단. 참/거짓 반환
- index : 반복의 처음에 0을 반환 ( 반복 진행시 1씩 증가 )
- count : 반복의 처음에 1을 반환 ( 반복 진행시 1씩 증가 )
- 사용법
<c:forEach items="${ names }" var="n" varStatus="loop">
${ loop.first } : ${ loop.index } : ${ loop.count } : ${ loop.last }<br>
</c:forEach>
<br>