jstl - api
jstl-impl: 구현체
core 라이브러리 : 제어구문, 반복문 등
fmt 라이브러리 : 형식화, 숫자 형식, 날짜 형식, 시간대, 다국어
functions 라이브러리 : 문자열 가공 등
sql 라이브러리
https://jakarta.ee/specifications/tags/3.0/tagdocs/
uri="jakarta.tags.core"
참고)
javaee 9 -> JSTL 1.2
uri="http://java.sun.com/jsp/jstl/core"
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
💟1) <c:set>
<c:set var="속성명" value="값"/>
${속성명}
<c:set var="sum" value="${num1+num2}" /> // value 애트리뷰트 값으로 EL 식을 쓸 수도 있습니다.
<% int num1 = 10, num2 = 20; %>
<c:set var="sum" value="<%=num1+num2%>" />
<c:set>액션을 이용하면 page 데이터 영역뿐만 아니라 request, session, application 데이터 영역에 애트리뷰트를 저장하는 것도 가능함
<c:set> 태그에 scope라는 애트리뷰트를 추가하고, page, request, session, application 중 하나를 애트리뷰트 값으로 지정하면 된다.
🔸속성의 범위 바꾸기 ~.~
scope="page|request|session|application"
- page: 기본값
<c:set var="PRICE" value="15000" scope="request" />
<%--scope="request" : 변수가 저장될 데이터 영역
scope 애트리뷰트에 request라는 값을 지정하고 나서
forward 메서드를 통해 다른 JSP 페이지를 호출하면 그 JSP 페이지 안에서도 선언된 변수를 사용할 수 있습니다.
--%>

💟2) <c:remove>

💟3) <c:if>
<c:if test="${w조건식}">
조건식이 참일때 출력 되는 부분
</c:if>

EL식으로 삼항조건 작성

💟4) <c:choose>
<c:choose>
<c:when test="${조건식1}">
//조건식1이 참일때 출력
</c:when>
<c:when test="${조건식2}">
//조건식1이 거짓, 조건식2가 참일때 출력
</c:when>
...
<c:otherwise>
//모든 조건이 거짓일때 출력
</c:otherwise>
</c:choose>


💟5) ⭐ </c:forEach> ⭐
반복문
횟수 (begin = 시작 숫자, end = 종료 숫자, step = 증감단위/기본값1, var="카운트 변수")


items="${배열, 컬렉션 속성}" var="요소1개")게시판 목록 뽑아보기.. MVC이용

varStatus="status"
반복상태에 대한 값
{status.count}: 반복 순서번호(1부터 시작)
{status.last}: 마지막 행인지
${status.current}: 현재 반복 요소


콤마(,) 문자열
<c:forEach>액션의 items 애트리뷰트를 이용해서 처리할 수 있는 데이터
💟6) <c:forTokens>
java.util.StringTokenizer
var="문자" items="문자열" delim="구분 패턴 문자"

💟7) <c:catch>

🔼위와 같은 에러를 잡을때 사용하는 catch!


💟8) <c:redirect>
JSP 페이지를 호출하는 <jsp:forward> 표준 액션 -> RequestDispatcher 인터페이스의 forward 메서드와 동일한 방법으로 JSP 페이지를 호출한다.
<c:redirect> 커스텀 액션도 이와 비슷한 일을 함. 하지만 이 메서드는 forward 메서드가 아니라 sendRedirect 메서드와 동일한 방법으로 작동합니다. => 주소변경
그렇기 때문에 이 액션을 이용하면 JSP 페이지가 아닌 웹 자원과 다른 웹 서버에 있는 웹 자원도 호출할 수 있다.
<c:redirect url="http://www.yonggyo.com:3001" />


때로는 다른 웹 자원을 호출하면서 데이터를 넘겨주어야 할 경우도 있다. 자바 코드에서는 이런 일을 하기 위해 해당 데이터를 쿼리 스트링 형태로 만들어서 URL 뒤에 덧붙여야 하지만 <c:redirect> 커스텀 액션을 이용하면 훨씬 더 간편하고 구조적인 방법으로 이런 일을 할 수 있다.
다음과 같이 <c:redirect>의 시작 태그와 끝 태그 사이에 <c:param> 이라는 커스텀 액션을 쓰고 name(이름)과 value(값)라는 애트리뷰트를 이용해서 데이터 이름과 데이터 값을 각각 지정하면 된다..
<c:redirect url="Buy.jsp">
<c:param name="code" value="75458" />: 쿼리스트링 형태로 url에 추가
<c:param name="num" value="2" />
</c:redirect>

🔼ex02.jsp경로에서 엔터! 누르고 이동할때 지정한 데이터 이름과 값이 자동으로 들어가져있다.
💟9) <c:import>
<jsp:include> 표준 액션과 비슷한 일을 한다. 다시 말해서 현재의 JSP 페이지에 다른 페이지의 결과를 포함시키는 일을 합니다.
다른 점은 이 액션을 이용하면 다른 웹 서버에 있는 JSP 페이지도 불러올 수 있고, JSP 페이지가 아닌 다른 종류의 웹 자원도 불러올 수 있다는 점이다.
: 서버쪽 자원 외에도 외부 자원도 버퍼에 추가 가능
url: 호출할 웹 자원의 URL(버퍼에 추가할 자원 주소)


🔼변수에 담겨있는 값을 EL식으로 여러번 불러올수도있다.
#ex04.jsp
<c:import url="inc.jsp">
<c:param name="num1" value="100"/>
<c:param name="num2" value="200"/>
</c:import>
param값이 inc.jsp쪽 url로 넘어갔다!

👩🏫참고)
<jsp:include ... />: 서버쪽 자원만 버퍼에 추가 가능
-> <jsp:param name="이름" value="값" />: 요청 데이터 추가
💟10) <c:url>
참고)
HttpServletRequest
:String getContextPath()

서버에 맞는 contextPath가 자동으로 붙은것을 확인할 수 있다.
<c:url var="myUrl" value="Add.jsp" />
#var: 주소값을 담을 EL식 속성명

<c:url var="myUrl" value="Add.jsp">
<c:param name="NUM1" value="999" />
: 주소에 쿼리 스트링이 추가
ex) ?이름=값
<c:param name="NUM2" value="1" />
</c:url>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url var="next" value="Divide.jsp">
<c:param name="NUM1" value="100" />
<c:param name="NUM2" value="25" />
</c:url>
<c:redirect url="${next}" />
💟11) <c:out>
<c:out> 커스텀 액션은 데이터를 출력할 때 사용하는 커스텀 액션이다.
웹 브라우저에 의해 특수문자로 해석될 가능성이 있는 <,>,&,'," 문자를 포함한 데이터는 이 액션을 이용해서 출력하는 것이 좋다.
<h1>제목</h1> -> lt;h1gt;제목lt;/h1gt;
c:out에서 보안적으로 스크립트가 실행 안되게 막음🔽🔽🔽

<c:out value="<INPUT>은<FORM>의 서브엘리먼트 입니다." />
default: 기본값

escapeXml
: true - 기본값(HTML -> 문자)
: false -> HTML로 인식

uri="jakarta.tags.fmt" // JSTL 3.0
prefix="fmt"
JSTL 1.2
uri="http://java.sun.com/jsp/jstl/fmt"
Date 객체를 기준으로함
java.text.SimpleDateFormat
type

dateStyle: full, long, medium, short
timeStyle: full, long, medium, short
pattern: SimpleDateFormat에 정의된 날짜, 시간 형식화 패턴


groupingUsed:

type: percent(소수점 표기 -> 퍼센트 표기) | currency(지역화에 맞는 통화 표기법)
currencySymbol="기호"

pattern
참고)
DecimalFormat
패턴 설정 유형

0 패턴은 남은자리 0으로 채워넣는다.
3) fmt:setLocale: 지역화 설정


4) fmt:timeZone과 fmt:setTimeZone
시간대
value: Asia/Seoul
fmt:setTimeZone: 태그가 적용된 후, 하위 태그에 반영

fmt:timeZone: 여는 태그, 닫는 태그, 태그 안쪽에 내용이 반영

5) fmt:setBundle과 fmt:bundle
<fmt:message key="메시지키" /> 함께 사용
메시지 관리, 문구 관리
properties 파일 형태로 관리 / 클래스 path(클래스 파일을 인식할 수 있는 경로)에 위치 ex) src/main/java
src/main/resources: 메시지 파일(properties)
webapp/WEB-INF, sebapp/WEB-INF/classes...
키 = 값
키 = 값
properties파일의 주석
#설명 ...
<fmt:bundle basename="messages.commons">
</fmt:bundle>

<fmt:setBundle .../>: 태그 적용 시점 이후 모두 반영


{순서}<fmt:param>값</fmt:param>
한국어/ English
언어감지순위
1. 요청헤더 Accept-Language 헤더 정보: Locale 객체
2. <fmt:setLocale /> 설정


🔼수동변경
6) fmt:requestEncoding
<fmt:requestEncoding value="UTF-8"/>
👩🏫참고)
서블릿 4버전까지 적용
request.setCharacterEncoding("...");
uri="jakarta.tags.functions"
prefix="fn"