c태그
JSP에서 java 코드를 쓸 때 <% · · · %> 태그를 사용하는데
불편하기도 하고 가독성도 떨어지기 때문에 JSTL을 사용합니다.
C Tag는 JSTL의 태그 라이브러리중 하나로 변수 지정, 제어문, 페이징 처리 등을 할 수 있는 기능을 제공합니다.
C Tag를 사용하기 전에 먼저 JSP 상단에 아래 코드를 기입해 선언해줍니다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
종류에는 <c:choose>, <c:forEach>, <c:if>, <c:set>, <c:out>, <c:forTokens>, <c:url>, <c:redirect>가 있습니다.
<c:choose>
- 분기처리할 때 주로 쓰이는 태그
- if, else문과 같이 when 조건에 해당되면 when의 안의 로직을 실행하고 when에 해당되는 조건이 없다면 otherwise안의 로직을 실행
로그인했을 때 프로필 사진 보이게 하기, 로그인 버튼이 로그아웃 버튼으로 바뀌기, 내가 쓴 글에만 수정, 삭제 버튼 보이게 하기 등등의 기능을 구현할 때에도 사용됩니다.
<c:choose>
<c:when test="조건">
실행문
</c:when>
<c:otherwise>
실행문
</c:otherwise>
</c:choose>
<c:forEach>
- 반복문 for와 동일한 기능의 태그
- items 속성은 반복할 값들이 있는 배열이나 리스트, var속성은 forEach문 안에서 반복될 변수명
<c:forEach items="배열 or 리스트" var="변수명" varStatus="상태용 변수">
${변수명}
</c:forEach>
이때, 상태용 변수를 status라고 지정했다면 아래와 같이 활용할 수 있습니다.
- ${status.current} 현재 for문의 해당하는 번호
- ${status.index} 0부터의 순서
- ${status.count} 1부터의 순서
- ${status.first} 첫번째인지 여부
- ${status.last} 마지막인지 여부
- ${status.begin} for문의 시작 번호
- ${status.end} for문의 끝 번호
- ${status.step} for문의 증가값
<c:forEach items="${fruits}" var="fruit" varStatus="status">
<span> ${status.index} : ${fruit} </span>
</c:forEach>
인덱스값 나타내기
<c:forEach var="gen" items="${genreList}" varStatus="status">
${gen.genName}
<c:if test="${!status.last}">, </c:if>
</c:forEach>
리스트 안의 요소들 나열할 때 콤마로 구분하기 (마지막은 콤마 제외)
<c:if>
- 조건문 설정하는 태그 (else 조건이 존재하지 않음)
- test 속성에 조건을 선언
<c:if test = "판별할 조건" var = "변수명" scope="조건의 범위"/>
<c:set var="result" value="Y"/>
<c:if test="${result eq 'Y'}">
<c:out value="${result}"></c:out>
</c:if>
== : eq(equal)
!= : ne(not equal)
< : lt(less than)
> : gt(greater than)
<= : le(less equal)
>= : ge(greater equal)
<c:set>
- 변수 선언할 때 초기값 설정하는 태그
<c:set var="변수명" value="초기값" scope="변수의 범위"/>
<c:set var="result" value="Y"></c:set>
${result}
아래 코드는 contextPath 설정할 때
<c:set var="contextPath" value="${pageContext.request.contextPath }"></c:set>
<c:out>
- 데이터를 출력하기 위한 태그
<c:out value="출력할 데이터" default="출력할 데이터 기본값"/>
<c:set var="result" value="Y"/>
<c:if test"${result eq 'Y'}">
<c:out value="${result}"></c:out>
</c:if>
c:set처럼 c:out을 사용하지 않아도 데이터를 출력할 수 있는데 굳이 c:out을 사용하는 이유는?
웹 사이트에 스크립트 코드를 주입하는 공격을 대비하기 위해 html 코드를 해석하지 못하게 하기 위해
<c:remove>
- 변수 삭제하기 위한 태그
<c:set var="travel" value="부산"/>
<h3>전: ${travel }</h3>
<p>travel 변수값을 제거해보자 </p>
<c:remove var="travel"/>
<h3>후: ${travel }</h3>