JSTL

예지성준·2024년 6월 14일

JSTL - JSP Standard Tag Library

1. 설치하기

jstl - api
jstl-impl: 구현체

core 라이브러리 : 제어구문, 반복문 등

fmt 라이브러리 : 형식화, 숫자 형식, 날짜 형식, 시간대, 다국어

functions 라이브러리 : 문자열 가공 등

sql 라이브러리

https://jakarta.ee/specifications/tags/3.0/tagdocs/

URI

2. 코어(core) 라이브러리

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>은 변수를 선언하고 나서 그 변수에 초기값을 대입하는 기능의 커스텀 액션이다.
<c:set var="속성명" value=""/>
  • 이렇게 선언한 변수는 익스프레션 언어의 EL 식 안에서 사용할 수 있습니다. ❌하지만 JSP 스트립팅 요소 안에서 사용할 수는 없다.

${속성명}

  • <c:set> 커스텀 액션의 value 애트리뷰트 값에는 EL 식을 쓸 수도 있다. 이런 특성을 활용하면 <c:set>액션을 이용해서 선언한 변수의 값을 또 다른 변수의 초기값으로 사용할 수도 있다.
<c:set var="sum" value="${num1+num2}" />  // value 애트리뷰트 값으로 EL 식을 쓸 수도 있습니다.
  • <c:set> 액션을 이용해서 선언한 변수를 스크립팅 요소 안에서 사용하는 것은 불가능하지만, 스크립팅 요소 안에서 선언한 변수를 <c:set> 액션의 value 애트리뷰트에 사용하는 것은 가능하다.
    • 하지만 이런 코드는 가독성이 떨어지므로 별로임!!
<% 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>

  • 속성 값 제거
  • scope값이 없으면 모든 범위의 속성을 제거

💟3) <c:if>

  • <c:if> 커스텀 액션은 자바 프로그램의 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="카운트 변수")

  • 배열, 컬랙션(Collection - List, Set), Iterator, Enumeration (items="${배열, 컬렉션 속성}" var="요소1개")
    //향상된 for문

게시판 목록 뽑아보기.. MVC이용


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


  • 콤마(,) 문자열

  • <c:forEach>액션의 items 애트리뷰트를 이용해서 처리할 수 있는 데이터

💟6) <c:forTokens>

  • java.util.StringTokenizer

    var="문자" items="문자열" delim="구분 패턴 문자"

💟7) <c:catch>

  • 자바 코드 없이 태그 방식으로 예외 처리
  • try 문의 try 블록과 마찬가지의 일을 한다.
  • 이 액션의 시작 태그와 끝 태그 사이에서 에러가 발생하면 실행의 흐름이 곧바로 <c:catch>액션 다음에 있는 코드로 넘어간다.
  • var : 예외가 발생하면 생성될 예외객체 변수명
    • 예외가 없으면 null

🔼위와 같은 에러를 잡을때 사용하는 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식 속성으로 추가할 수 있는 속성 var
    var="변수": 변수에 출력 결과물이 담긴다.

🔼변수에 담겨있는 값을 EL식으로 여러번 불러올수도있다.

  • <c:param name="이름" value="값" />: 요청 데이터에 추가(호출하는 웹 자원에 데이터를 넘겨주어야 할 경우)
#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()

  • <c:set> 커스텀 액션과 마찬가지로 변수 선언에 사용되는 액션이지만, URL을 저장하기 위한 변수의 선언에 사용 된다.
    • contextPath를 URL에 자동으로 붙여주는 태그

서버에 맞는 contextPath가 자동으로 붙은것을 확인할 수 있다.

<c:url var="myUrl" value="Add.jsp" />
#var: 주소값을 담을 EL식 속성명

  • URL 뒤에 때로는 스트링 형태로 데이터를 덧붙여야 할 필요가 있다. 그럴 때는 이 액션의 시작 태그와 끝 태그 사이에 <c:param> 커스텀 액션을 쓰고, name과 value 애트리뷰트 값으로 각각 데이터 이름과 데이터 값을 지정하면 된다.
<c:url var="myUrl" value="Add.jsp">
	<c:param name="NUM1" value="999" />
    : 주소에 쿼리 스트링이 추가
    ex) ?이름=값
	<c:param name="NUM2" value="1" />
</c:url>
  • <c:url> 커스텀 액션은 바로 앞에서 배운 <c:redirect>, <c:import> 커스텀 액션과 함께 유용하게 사용될 수도 있다.
<%@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> 커스텀 액션은 데이터를 출력할 때 사용하는 커스텀 액션이다.

  • 웹 브라우저에 의해 특수문자로 해석될 가능성이 있는 <,>,&,'," 문자를 포함한 데이터는 이 액션을 이용해서 출력하는 것이 좋다.

    • 왜냐하면 이 액션은 이런 특수 문자를 자동으로 이스케이프 시퀀스(escape sequence)로 바꿔주는 기능이 있기 때문
    • Escape된 문자열로 출력
    • Escape된 상태: HTML태그를 문자열로 변경해서 출력 (HTML해석 X 문자열로 바꿔줌)
      <h1>제목</h1> -> lt;h1gt;제목lt;/h1gt;

c:out에서 보안적으로 스크립트가 실행 안되게 막음🔽🔽🔽

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

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

3. 포매팅(fmt) 라이브러리

  • 날짜를 '2010년 1월 3일'이라고 표시해야 할 때도 있고 '2009/1/3'이라고 표시해야 할 때도 있습니다. 숫자의 경우에도 12500이라는 수를 12,500이라고 표시해야 할 때도 있고, 12500.00이라고 표시해야 할 때도 있습니다.
  • JSTL의 포매팅 라이브러리(formatting library)를 이용하면 이런 다양한 포맷 요구 사항을 충족시킬 수 있습니다.
  • 이 라이브러리에는 국제화를 지원하는 커스텀 액션도 다수 포함되어 있습니다. 그 중에는 지구상의 여러 시간대에 따라 다른 시각을 계산해서 표시하는 커스텀 액션도 있고, 하나의 JSP 페이지를 가지고 여러 나라의 언어로 구성된 웹페이지를 생성할 수 있도록 만드는 커스텀 액션도 있습니다.

fmt:formatDate 커스텀 액션

uri="jakarta.tags.fmt" // JSTL 3.0
prefix="fmt"

JSTL 1.2
uri="http://java.sun.com/jsp/jstl/fmt"

1) fmt:formatDate: 날짜 형식화

  • Date 객체를 기준으로함

  • java.text.SimpleDateFormat

  • type

    • date(기본값) - 날짜만 표기
    • time - 시간만 표기
    • both - 날짜와 시간을 함께 표기
  • dateStyle: full, long, medium, short

  • timeStyle: full, long, medium, short

  • pattern: SimpleDateFormat에 정의된 날짜, 시간 형식화 패턴

2) fmt:formatNumber: 숫자 형식화

  • java.text.DecimalFormat

  • groupingUsed:

    • true(기본값)
    • false: , 로 숫자 3자리마다 나누지 않는다.
  • type: percent(소수점 표기 -> 퍼센트 표기) | currency(지역화에 맞는 통화 표기법)

  • currencySymbol="기호"

  • pattern

참고)
DecimalFormat
패턴 설정 유형

0 패턴은 남은자리 0으로 채워넣는다.

3) fmt:setLocale: 지역화 설정

  • value
    • 언어코드(en, ko, ja, zn)
    • 언어코드_국가코드(en_us, ko_kr, ja_jp ...)

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 .../>: 태그 적용 시점 이후 모두 반영

  • 메시지 치환기능
  • 메시지 작성시 {0}, {1}, {2}
    {순서}

<fmt:param>값</fmt:param>

  • 다국어 설정
    파일명_언어코드.properties

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

🔼수동변경

6) fmt:requestEncoding
<fmt:requestEncoding value="UTF-8"/>

👩‍🏫참고)
서블릿 4버전까지 적용
request.setCharacterEncoding("...");

4. 함수(functions) 라이브러리

  • 문자열 가공 편의 함수
  • EL식 내에서 적용 가능 ${fn:concat()}

uri="jakarta.tags.functions"

prefix="fn"

profile
꽁꽁 얼어붙은 한강 위로 😺

0개의 댓글