core 라이브러리 : 제어구문, 반복문 등
fmt 라이브러리 : 형식화, 숫자 형식, 날짜 형식, 시간대, 다국어
functions 라이브러리 : 문자열 가공 등
sql 라이브러리
https://jakarta.ee/specifications/tags/3.0/tagdocs/
URI
uri="jakarta.tags.core"
참고)
javaee 9 -> JSTL 1.2
uri="http://java.sun.com/jsp/jstl/core"
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
:속성 정의
<c:set var="속성명" value="값" />
${속성명}
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:set var="num1" value="100" />
<c:set var="num2" value="200" />
${num1 + num2}
scope = "page|request|session|application"
-page : 기본값
:속성값 제거
<c:remove var="속성명" />
※ scope가 존재하나 설정하지 않을경우 모든 범위의 속성을 제거
:조건문 (else가 없음)
<c:if test="${조건식}">
//조건식이 참일때 출력 되는 부분
</c:if>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:set var="num1" value="11" />
<c:if test="${num1 % 2 == 1}">
홀수
</c:if>
else 필요할땐 부정 연산문으로 다시 한번 정의
:다중 조건문 / 다중 선택문
<c:choose>
<c:when test="${조건식1}">
//조건식 1이 참일때 출력
</c:when>
<c:when test="${조건식2}">
//조건식 1이 거짓, 조건식 2가 참일때 출력
</c:when>
..
<c:otherwise>
//조건식이 모두 거짓일때
</c:otherwise>
</c:choose>
예제)
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:choose>
<c:when test="${param.age < 8}">
유치원생
</c:when>
<c:when test="${param.age < 14}">
초등학생
</c:when>
<c:when test="${param.age < 17}">
중학생
</c:when>
<c:when test="${param.age < 20}">
고등학생
</c:when>
<c:otherwise>
성인
</c:otherwise>
</c:choose>
-반복문
-횟수 (begin = 시작 숫자, end = 종료 숫자, step = 증감단위 / 기본값1, var="카운트 변수")
-배열, 컬랙션(Collection - List, Set), Iterator, Enumeration (items="${배열,컬렉션 속성}" var="요소1개")
//향상된 for 문
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:forEach var="cnt" begin="1" end="10" step="1">
<div>${cnt} 반복</div>
</c:forEach>
-콤마 문자열
나눠서 출력해줌
- java.util.StringTokenizer
var="문자" items="문자열..." delim="구분 패턴 문자"
- 자바 코드 없이 태그 방식으로 예외 처리
- var : 예외가 발생하면 생성될 예외객체 변수명
- 예외가 없으면 null
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:catch var="e">
<%
String str = null;
str.toUpperCase();
%>
</c:catch>
<c:if test="${e !=null}">
<%-- 에러 메세지 : ${e.getMessage()}--%>
에러 메세지 : ${e.message}
</c:if>
: 주소변경 -> 이동 (실제 이동, 상태:302)
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<h1>ex02.jsp</h1>
<c:redirect url="ex03.jsp" />
-location : ex03.jsp
참고)
HttpServletRequest
-sendRedirect(String location) 와 동일
->
http://localhost:3000/day05/exam06/ex03.jsp?key1=value1&key2=value2
쿼리스트링 형태로 추가됨
: 서버 쪽 자원 외에도 외부 자원도 버퍼에 추가 가능
-url: 버퍼에 추가할 자원 주소
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<h1>ex04.jsp - 상단</h1>
<c:import url="inc.jsp" />
<h1>ex04.jsp - 하단</h1>
참고)
<jsp:include ... />
: 서버쪽 자원만 버퍼에 추가 가능
: <jsp:param name="이름" value="값" /> : 요청 데이터 추가
<h1>ex04.jsp - 상단</h1>
<c:import var="html" url="inc.jsp" />
${html}
<h1>ex04.jsp - 하단</h1>
inc.jsp 에 param 데이터가 넘어감
<c:import url="inc.jsp">
<c:param name="num1" value="100" />
<c:param name="num2" value="200" />
</c:import>
//inc.jsp
<h1>inc.jsp</h1>
num1: ${param.num1}<br>
num2: ${param.num2}<br>
합계: ${param.num1 + param.num2}<br>
:contextPath를 URL에 자동 붙여주는 태그
-var : 주소 값을 담을 EL식 속성명
-<c:param name="이름" value="값" /> : 주소에 쿼리스트링이 추가 예) ?이름=값
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:url var="loginUrl" value="/member/login" />
<a href="${loginUrl}" />">로그인</a>
<a href="<c:url value="/member/join" />">회원가입</a>
<form method="POST" action="${loginUrl}" />">
이메일 : <input type="text" name="email"> <br>
비밀번호 : <input type="password" name="password"> <br>
<button type="submit">로그인</button>
</form>
//로그인 버튼 클릭시
참고)
HttpServletRequest
String hetContextPath()
:Escape된 문자열로 출력
:Escape된 상태 : HTML 태그를 문자열로 변경해서 출력
<h1> 제목 </h1> -> lt;h1gt;제목lt;h1gt;
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<c:set var="html" value="<script>alert('알림!');</script>" />
<%-- ${html}--%>
<c:out value="${html}" />
<c:out value="${html}" default="값 없음"/>
${html}이 존재하지 않을 경우 default 출력
<c:out value="<h1>제목</h1>" escapeXml="true" />
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:
date(기본값) - 날짜만 표기
time - 시간만 표기
both - 날짜와 시간을 함께 표기
-dateStyle : full, long, medium, short
-timeStyle : full, long, medium, short
-pattern : SimpleDateFormat에 정의된 날짜, 시간 형식화 패턴
-java.text.DecimalFormat ...
-groupingUsed : true(기본값)
false : ,로 숫자 3자리 마다 나누지 않는다.
-type : percent (소수점 표기 -> 퍼센트 표기) | currency (지역화에 맞는 통화 표기법)
-currencySymbol="기호"
-pattern
참고)
DecimalFormat
패턴 설정 유형
#,###.##### : <fmt:formatNumber value="${num}" pattern="#,###.#####" /> <br>
0,000.00000 : <fmt:formatNumber value="${num}" pattern="0,000.00000" /> <br>
: 지역화 설정
-value : 언어코드(en, ko, ja, zn)
언어코드_국가코드(en_us, ko_kr, ja_jp ...)
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<h1>대한민국</h1>
<fmt:setLocale value="ko_KR" />
일시 : <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
금액 : <fmt:formatNumber value="100000000" type="currency" /><br>
<h1>미국</h1>
<fmt:setLocale value="en_US" />
일시 : <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
금액 : <fmt:formatNumber value="100000000" type="currency" /><br>
<h1>일본</h1>
<fmt:setLocale value="ja_JP" />
일시 : <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
금액 : <fmt:formatNumber value="100000000" type="currency" /><br>
-시간대
-value: Asia/Seoul
-fmt:setTimeZone: 태그가 적용된 후, 하위 태그에 반영
-fmt:timeZone: 여는 태그, 닫는 태그, 태그 안쪽에 내용이 반영
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%=new Date()%>" />
서울 : <fmt:formatDate value="${date}" type="both" /> <br>
<fmt:timeZone value="America/New_York">
뉴욕 : <fmt:formatDate value="${date}" type="both" /> <br>
</fmt:timeZone>
<fmt:setTimeZone value="Europe/London" />
런던 : <fmt:formatDate value="${date}" type="both" /> <br>
런던 쪽 태그는 아래로 쭉 해당 타임이 적용된다.
<fmt:message key="메세지키" /> 함께 사용
-메세지 관리, 문구 관리
-properties 파일 형태로 관리 / 클래스 패스에 위치
키=값
키=값
# 설명...
<fmt:bundle basename="messages.commons">
...
/fmt:bundle>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:bundle basename="messages.commons">
<form>
<fmt:message key="EMAIL" />
<input type="text" name="email"> <br>
<fmt:message key="PASSWORD" />
<input type="password" name="PASSWORD"> <br>
<button type="submit">
<fmt:message key="LOGIN" />
</button>
</form>
</fmt:bundle>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:setBundle basename="messages.commons" />
<form>
<fmt:message key="EMAIL" />
<input type="text" name="email"> <br>
<fmt:message key="PASSWORD" />
<input type="password" name="PASSWORD"> <br>
<button type="submit">
<fmt:message key="LOGIN" />
</button>
</form>
클래스 패스 : 클래스 파일을 인식할 수 있는 경로
src/main/java
src/main/resources : 메세지 파일(properties 파일)
webapp/WEB-INF/lib, webapp/WEB-INF/classes ...
-메세지 치환 기능
-메세지 작성시 {0}...{1}...{2}
{순서}
<fmt:param>값</fmt:param>
-다국어 설정
파일명_언어코드.properties
언어 감지 순위
1. 요청 헤더 Accept-Language 헤더 정보 : Locale 객체
2.<fmt:setLocale /> 설정
<c:if test="${!empty param.lang}">
<fmt:setLocale value="${param.lang}" />
</c:if>
<fmt:setBundle basename="messages.commons" />
<a href="?lang=ko">한국어</a>
<a href="?lang=en">English</a>
<fmt:requestEncoding value="UTF-8">
참고)
서블릿 4버전까지 적용
request.setCharacterEncoding("...");
-문자열 가공 편의 함수
-EL식 내에서 적용 가능 ${fn:concat(..)}
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="fn" uri="jakarta.tags.functions" %>
<c:set var="str" value="Apple,Melon,Orange,Grape" />
<c:set var="fruits" value="${fn:split(str, ',')}" />
str : ${str}<br>
fruits : ${fruits}<br>
<c:forEach var="fruit" items="${fruits}">
${fruit} <br>
</c:forEach>