(Java(S)erver(P)age Standard Tag Library)은 표준 태그 라이브러리. JSP의 기본 태그가 아닌 JSP 확장 태그
요청으로 전달받은 데이터(파라미터)를 서버에서 받을때는 request 객체를 사용(메소드: getParameter())
사이에 들어가는 글이 없으면 <c:out value="" />처럼 한문장안에서 끝낼 수 있음
태그 라이브러리는 맨 위 지시자에서 정의하고 사용. EL 기호는 애트리뷰트 값만 출력 가능
코드

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
1. pageContext 영역에 '애트리뷰트' 이름 age, 값 23을 저장
<c:set var="age" value="13"/>
2. 저장된 애트리뷰트 값 출력
age: <c:out value="${age }"></c:out></h5> -> age는 애트리뷰트 이름
name: <c:out value="${name }"></c:out> ->name은 자바변수. 출력 안됨
3. 자바의 if 태그 대신 사용
<h5>c:if테스트</h5>
<!-- 조건식을 test 속성에 작성. EL 기호 안에 사용 -->
<c:if test ="${age<20 }">
<div style ="color:green">청소년입니다. </div>
</c:if>
<c:if test ="${age>=20 }">
<div style ="color:red">성인입니다. </div>
</c:if>
4. if~else 형식
<c:set var="age" value="23"/> <!-- 애트리뷰트 age값 변경 -->
<c:choose>
<c:when test="${age <20 }">
<div style ="color:green">청소년입니다. </div>
</c:when>
<c:otherwise>
<div style ="color:red">성인입니다. </div>
</c:otherwise>
</c:choose>
5. for문
<c:forEach var="i" begin="1" end="10" varStatus="status" step="2">
<div>
<c:out value="${i }"/>
<c:out value="${i*11}"/>
<!-- varstatus 속성은 for 반복 상태를 알 수 있는 값을 제공 -->
<c:out value="${status.count}"/>
<c:out value="${status.step}"/>
</div>
</c:forEach>
6. 자바 객체 활용하기
<%CustomerVo vo= new CustomerVo("momo","강모모"[,"momo22@daum.net](mailto:,%22momo22@daum.net)",29,null);
//만들어진 객체를 pageContext scope의 애트리뷰트로 저장
pageContext.setAttribute("customer",vo); %>
<c:out value="${customer }"/>
<ul>
<li>${customer.customId}</li>
<li>${[customer.name](http://customer.name/)}</li>
<li>${customer.email}</li>
<li>${customer.age}</li>
</ul>
7. 자바 객체의 컬렉션(list) 활용하기 -> jdbc로 sql 조회한 결과 List인 경우 활용 가능
List<CustomerVo> list = List.of(new CustomerVo("momo12","강모모","momo12@daum.net",25,null),
new CustomerVo("momo13","강모모","momo13@daum.net",26,null);
pageContext.setAttribute("list",list);%>
<!-- 컬렉션 list에서 값을 하나씩 가져와 애트리뷰트 이름 vo에 저장 -->
<c:forEach items="${list }" var="vo" varStatus="status">
<c:out value="${status.index }"/>, <c:out value="${vo }"/>
<!--varStatus 속성 index는 지금처럼 items 로 컬렉션 다룰 때 사용 -->
<!--vo에 저장된 객체 속성을 각각 출력하기 -->
<ul>
<li><c:out value="${vo.customId }"/></li>
<li><c:out value="${vo.name }"/></li>
<li><c:out value="${vo.email }"/></li>
<li><c:out value="${vo.age }"/></li>
</ul>
</c:forEach><!-- formatNumber는 서식(기본: 3자리마다 ,) 있는 출력과 저장 동작 , value에는 값을 직접 또는 el -->
<fmt:formatNumber value="9999999"/> <br>
<!-- fmt:parseNumber는 변수에 저장만 (출력별개). -->
<fmt:parseNumber var="test" value="8888888"/>
test :<c:out value=" ${test }"/><br> <!-- 서식 없는 출력 -->
<!-- 현재 locale : ko_kr 표기는 언어_국가 형식 :화폐단위 -₩ ->화폐, 날짜는 locale에 영향을 받음-->
<fmt:formatNumber value="9999999" type="currency"/><br>
<!-- locale 변경 : en_us :화폐단위 - $ -->
<fmt:setLocale value="en_us"/>
<fmt:formatNumber value="9999999" type="currency"/><br>
<!-- type: 화폐단위 , 퍼센트(percent) 등 표시 ,
pattern : 직접 소수점 이하, 전체 자리수 지정-->
<hr>
<!-- 789,789.123 기본패턴:소수점 최대 3자리 -->
<fmt:formatNumber value="789789.12345" /><br>
<!-- 789,789.12 -->
<fmt:formatNumber value="789789.12345" pattern="#,###.##"/><br>
<fmt:formatNumber value="789789.12345" pattern="#,###.#####"/><br>
<fmt:formatNumber value="789789.123" pattern="0000,000,000.00000"/><br>
<!-- 자릿수를 맞추기 위해 빈자리에 0을 넣음
fmt:formatXXX: 출력과 변수에 저장
fmt:parseXXX: 저장만 함 -->
<hr>
<!-- 날짜 패턴에 대소문자 유의 : 일 dd, 월 MM , 분 mm , 시(12) hh , 시(24) HH -->
<!-- Jan 20, 2023 *formatDate 도 var 로 변수 저장 -->
<!--now 애트리뷰트 값 : 테스트 위해 자바객체로 생성 -->
<fmt:setLocale value="ko_kr"/>
<c:set var="now" value="<%= new java.util.Date()%>"/>
현재시간과 날짜 : ${datetime1 }<br> <!-- 출력결과 : Thu Nov 03 20:14:00 KST 2022 -->
<fmt:formatDate value="${now }" /><br>
<!-- parseDate의 pattern은 value 값의 형식을 알려줍니다. pattern이 없으면 날짜 타입으로 변환을 못함..(문자열을 날짜 타입으로 캐스팅)-->
<fmt:parseDate value="2022-11-03 20:14" var="datetime1" pattern="yyyy-MM-dd HH:mm"/>
지정된 시간과 날짜 : <c:out value="${datetime1 }"/>
<hr>
<fmt:formatDate value="${datetime1 }" type="date"/><br> <!-- Jan 20, 2023 -->
<fmt:formatDate value="${datetime1 }" type="time"/><br> <!-- 10:35:29 AM -->
<fmt:formatDate value="${datetime1 }" type="both"/><br> <!-- Jan 20, 2023, 10:35:29 AM -->
<hr>
<fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd HH:mm:ss"/><br>
<!-- 2022-11-03 20:14:00 시간이 24시 기준(HH)-->
<fmt:formatDate value="${datetime1 }" pattern="yyyy-MM-dd a hh:mm:ss"/><br>
<!-- 2022-11-03 PM 08:14:00 시간이 12시 기준(hh). a는 오전/오후 표시--><ul>
<li><c:out value="${fn:length(msg)}"/></li>
<li><c:out value="${fn:indexOf(msg,'am')}"/></li>
<li><c:out value="${fn:toUpperCase(msg)}"/></li>
<li><c:out value="${fn:substring(msg,3,6)}"/></li>
<li><c:out value="${fn:contains(msg,'am')}"/></li>
<li><c:out value="${fn:contains(msg,'are')}"/></li>
<li><c:out value="${fn:replace(msg,'Twice','Viviz')}"/></li>
<c:set value="he llo !" var="temp"/>
<li><c:out value="${temp }"/>공백 하나만 출력되는 이유: html 문서에는 공백이 하나만 반영됨, 연속적으로 출력하고 싶은 경우 사용해야함 </li>
<li><c:out value="${fn:replace(temp,' ',' ')}"/></li>
<li>${fn:replace(temp,' ',' ')}</li>
<!-- 리턴이 발생하는 split은 c:set 으로 실행, 리턴받을 var 정의 -->
<c:set value="${fn:split(msg,' ')}" var="temps"/>
</ul>
<h4>msgArr 배열 애트리뷰트값을 하나씩 출력</h4>
<ul>
<c:forEach items ="${msgArr }" var="arr" varStatus="status">
<li><c:out value="${arr }"/></li>
</c:forEach>
</ul>