JSP/JSP 정리

[JSP] JSP JSTL뜻과 사용방법

h0-0cat 2023. 6. 9. 10:11
728x90

태그 라이브러리 선언

자바에서 import문을 선언하듯 JSP에서도 JSTL 확장 태그를 사용하려면 taglib 지시자로 라이버리를 선언해야 한다.

JSP 지시자 태그 <%@ taglib %>를 사용해서 다음과 같이 선언한다.

 

<%@ taglib prefix="접두사" uri="URI" %>

 

uri : 태그 라이브러리의 네임 스페이스 URI 식별자

prefix : JSTL 태그를 사용할때 태그 이름 앞에 붙일 접두사

 

태그 라이브러리 별 표준 선언문

태그 라이브러리 선언문
Core <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
XML <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
I18N <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
Database <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
Functions <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

url (자바9까지만 저렇게 쓰고, 10부터는 jakarta)

prefix를 꼭 저렇게 지정해야하는건 아니지만 JSTL에서 제안하는 표준 접두사이므로 똑같이 사용하는게 좋다.

 

태그 라이브러리 별 태그 정리

태그 라이브러리 기능 태그 - 부모태그(자식태그)
Core(기본) 변수 remove, set
흐름 제어 choose(when, otherwise)
forEach
forTokens
if
URL 관리 import(param)
redirect(param)
url(param)
기타 catch, out
XML 기본 out, parse, set
흐름 제어 choose(when, otherwise)
forEach
if
변환 transform(param)
I18N(국제화) 로케일 setLocale, requestEncoding
메시지 포맷 bundle
message(param)
setBundle
Database 데이터 소스 설정 setDataSource
SQL query(dateParam, param)
transaction
update(dateParam, param)
Functions(기타 함수) 집합의 원소 개수 length
문자열 처리 toUpperCase
toLowerCase
substring
substringAfter
substringBefore
trim
replace
indexOf
startsWith
endsWith
contains
containsIgnoreCase
split
join
escapeXml

 

<c:out> 태그

출력문을 만드는 태그이다.

 

<c:out value="출력값" default="기본값" />
<c:out value="출력값">기본값</c:out>

 

value에 EL 표현식을 쓸 수 있다.

value 값이 null이면 기본값이 출력되고 기본값이 없으면 빈 문자열이 출력된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
                                                                                                                                    긁지않은개발자
<%
@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:out value="Hello World" /><br>
<c:out value="${null}">JSTL</c:out><br>
<c:out value="Hello">World</c:out><br>
<c:out value="${null}" />
</body>
</html>
                                                                                                                                                               
 
 

실행 결과

Hellp World

JSTL

Hello

 

 

<c:set> 태그

변수를 다룰때 사용한다.

이 태그로 생성한 변수는 JSP의 로컬 변수가 아니라 서블릿 보관소(JspContext, ServletRequest, HttpSession, ServletContext)에 저장된다.

 

<c:set var="변수명" value="값" scope="page(기본값)|request|session|application" />
<c:set var="변수명" scope="page(기본값)|request|session|application">값</c:set>
 

 

scope의 기본값은 page이다. 따라서 scope를 생략하면 JspContext에 저장된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                                                                                                                                    긁지않은개발자
<%
--<c:set> 기본 사용 방법 --%>
<c:set var="name1" value="긁지않은개발자" />
<c:set var="name2">환영합니다.</c:set>
${name1}<br>
${name2}<br>
${pageScope.name1}<br>
${pageScope.name2}<br>
<p></p>
 
<%--보관소 지정(ServletRequest)--%>
<c:set var="name3" scope="request">안녕하세요</c:set>
${pageScope.name3}<br>
${requestScope.name3}<br>
<p></p>
 
<%--덮어쓰기--%>
<% pageContext.setAttribute("name4""고양이"); %>
수정 전 name4 : ${name4}<br>
<c:set var="name4" value="야옹" />
수정 후 name4 : ${name4}<br>

실행 결과

긁지않은개발자

환영합니다.

긁지않은개발자

환영합니다.

 

안녕하세요

 

수정 전 name4 : 고양이

수정 후 name4 :  야옹

 

 

scope를 생략하면 기본적으로 JspContext(page)에 저장됨을 알 수 있다.

scope="request"와 같이 scope를 명시적으로 지정할수도 있다.

<c:set>으로 이미 존재하는 변수에 값을 할당할 경우 기존 값을 덮어쓴다.

 

<c:set>을 이용한 객체의 프로퍼티 값 설정

<c:set target="대상 객체" property="설정할 프로퍼티" value="프로퍼티 값" />

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
                                                                긁지않은개발자
<%
!
    public static class Hcat {
        int no;
        String name;
 
        public int getNo() {
            return no;
        }
 
        public void setNo(int no) {
            this.no = no;
        }
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
    }
%>
<%
    Hcat member = newHcat();
    member.setNo(100);
    member.setName("고양이");
    pageContext.setAttribute("member", member);
%>
${member.name}<br>
<c:set target="${member}" property="name" value="강아지" />
${member.name}<br>
 

실행 결과

고양이

강아지

 

 

 

Innter class Hcat의 인스턴스 member를 생성하고

member의 name을 <c:set> 태그를 사용해서 변경하는 코드이다.

<c:set>으로 객체의 프로퍼티 값을 설정할때는 setter()의 리턴 타입이 반드시 void여야 한다.

그렇지 않으면 다음과 같은 예외가 발생한다. (error 500)

 

 

<c:remove> 태그

보관소에 저장된 값을 제거한다.

 

<c:remove var="변수명" scope="page(기본값) | request | session | application" />

 

<c:set>과 마찬가지로 scope 속성으로 보관소를 명시할 수 있고 보관소의 기본값은 page이다.

 

1
2
3
4
                                                                긁지않은개발자
<%
 pageContext.setAttribute("name1""긁지않은개발자"); %>
${name1}<br>
<c:remove var="name1" />
${name1}<br>
 

실행 결과

name1 : 긁지않은개발자

name1 : 

 

<c:remove> 사용 후 JspContext에서 name1의 값을 삭제해서 값이 출력되지 않는다.

 

<c:if> 태그

<c:if test="조건식" var="변수명" scope="page(기본값) | request | session | application">내용</c:if>

test의 조건식이 true이면 '내용'이 실행된다.

var, scope 속성은 test 결과를 저장할때 사용한다.

 

1
2
3
4
5
6
7
8
9
                                                                긁지않은개발자
<
c:if test="${10 > 20}" var="result1">
    10은 20보다 크다.<br>
</c:if>
result1 : ${result1}<br>
 
<c:if test="${10 < 20}" var="result2">
    20은 10보다 크다.<br>
</c:if>
result2 : ${result2}

실행 결과

result1 : false

20은 10보다 크다.

result2 : true

 

${10 > 20}은 false이므로 '10은 20보다 크다'는 출력되지 않는다.

${10 < 20}은 true이므로 '20은 10보다 크다'가 출력되었다.

 

<c:if> - List가 empty(비어있는지) 체크

<c:if test="${empty myList}">
    <div>
        <!-- myList가 비어있으면 -->
    </div>
</c:if>

<c:if test="${not empty myList}">
    <div>
        <!-- myList가 비어있지 않으면 -->
    </div>
</c:if>

List의 empty 여부는 empty operator를 사용하여 test할 수 있다.

 

<c:choose> 태그

자바의 switch-case와 같은 기능을 수행한다.

여러 조건에 따라 다른 작업을 할 필요가 있을때 사용한다.

 

<c:choose>
    <c:when test="조건식"></c:when>
    <c:when test="조건식"></c:when>
    ...
    <c:otherwise></c:when>
</c:choose>

<c:when> 태그는 한 개 이상 존재해야하며 <c:otherwise> 태그는 0개 혹은 1개가 올 수 있다.

<c:when>의 조건에 일치하지 않으면 <c:otherwise>가 실행된다.

 

1
2
3
4
5
6
7
8
9
                                                                긁지않은개발자
<
c:set var="userid" value="h0-0cat.tistory.com" />
<c:choose>
    <c:when test="${userid == 'admin'}">
        관리자 페이지
    </c:when>
    <c:otherwise>
        ${userid}님 반갑습니다.
    </c:otherwise>
</c:choose>

실행 결과

h0-0cat.tistory.com님 반갑습니다.

 

 

<c:forEach> 태그

반복 작업에 사용한다. 특히 목록에서 값을 꺼내서 처리할때 사용한다.

 

<c:forEach var="변수명" items="목록 데이터" begin="시작 인덱스" end="종료 인덱스">콘텐츠</c:forEach>

 

items에는 다음을 지정할 수 있다.

  • 배열
  • java.util.Collection 구현체(ArrayList, LinkedList, EnumSet, ...)
  • java.util.Iterator 구현체
  • java.util.Enumeration 구현체
  • java.util.Map 구현체
  • 콤마(,) 구분자로 나열된 문자열

 

var는 반복문을 돌면서 items에서 꺼낸 항목 값을 가리키는 참조 변수이다.

 

<c:forEach> - 배열

다음은 items에 배열을 지정한 forEach 예이다.

 

1
2
3
4
5
6
                                                                                                 긁지않은개발자
<%
 pageContext.setAttribute("numList"new String[]{"1""2""3""4""5"}); %>
<ul>
    <c:forEach var="num" items="${numList}">
        <li>${num}</li>
    </c:forEach>
</ul>
 

실행 결과

  • 1
  • 2
  • 3
  • 4
  • 5

 

 

시작 인덱스와 종료 인덱스를 지정

1
2
3
4
5
6
                                                                                                                               긁지않은개발자
<%
 pageContext.setAttribute("numList"new String[]{"1""2""3""4""5"}); %>
<ul>
    <c:forEach var="num" items="${numList}" begin="2" end="4">
        <li>${num}</li>
    </c:forEach>
</ul>
 

실행 결과

  • 3
  • 4
  • 5

 

 

<c:forEach> - ArrayList

다음은 items에 ArrayList를 지정한 forEach 예이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                                                                긁지않은개발자
<%
    List<String> alphabet = new ArrayList<>();
    alphabet.add("A");
    alphabet.add("B");
    alphabet.add("C");
    alphabet.add("D");
    pageContext.setAttribute("alphabet", alphabet);
%>
<ul>
    <c:forEach var="alphabet" items="${alphabet}">
        <li>${alphabet}</li>
    </c:forEach>
</ul>
 

실행 결과

  • A
  • B
  • C
  • D

 

 

<c:forEach> - 문자열

다음은 콤마(,)로 연결된 문자열에 대한 forEach 예제이다.

 

1
2
3
4
5
6
                                                                                                                         긁지않은개발자
<%
 pageContext.setAttribute("Hcat""한식,중식,일식,양식"); %>
<ul>
    <c:forEach var="name" items="${Hcat}">
        <li>${name}</li>
    </c:forEach>
</ul>
 

실행 결과

  • 한식
  • 중식
  • 일식
  • 양식

 

<c:forEach> - 횟수 반복

items 지정 없이 begin과 end 속성을 사용해서 일정 횟수 반복할 수 있다.

 

1
2
3
4
5
                                                                             긁지않은개발자
<
ul>
    <c:forEach var="no" begin="1" end="5">
        <li>forEach 예제 ${no}</li>
    </c:forEach>
</ul>
 
  • forEach 예제 1
  • forEach 예제 2
  • forEach 예제 3
  • forEach 예제 4
  • forEach 예제 5

 

 

<c:forTokens> 태그

문자열을 delimiter(구분자)로 분리해서 반복문을 돌리는데 사용한다.

 

<c:forTokens var="변수명" items="문자열" delims="구분자">콘텐츠</c:forTokens>

 

1
2
3
4
5
6
                                                                                 긁지않은개발자
<%
 pageContext.setAttribute("hcat""v1=20&v2=20&op=+"); %>
<ul>
    <c:forTokens var="item" items="${hcat}" delims="&">
        <li>${item}</li>
    </c:forTokens>
</ul>
 

실행 결과

  • v1=20
  • v2=20
  • op=+

 

 

<c:url> 태그

URL을 만들때 사용한다.

이 태그를 사용하면 매개변수를 포함한 URL을 쉽게 만들 수 있다.

 

<c:url var="변수명" value="url">
    <c:param name="파라미터명" value="값" />
    <c:param name="파라미터명" value="값" />
    <c:param name="파라미터명" value="값" />
</c:url>

 

1
2
3
4
5
6
                                                                긁지않은개발자
<
c:url var="calcUrl" value="http://localhost:8080/calc">
    <c:param name="v1" value="10" />
    <c:param name="v2" value="20" />
    <c:param name="op" value="+" />
</c:url>
${calcUrl}
 

 

실행 결과

 

<c:import> 태그

url 속성에 콘텐츠가 있는 주소를 지정하면 해당 주소로 요청하고 응답 결과를 받아서 반환한다.

 

<c:import url="url" var="변수명" scope="page(기본값) | request | session | application" />
 

 

다음은 url에 구글검색) 긁지않은개발자 JSON으로 반환받은 결과를 출력하는 예제이다.

1
2
3
                                                                긁지않은개발자
<
textarea rows="10" cols="80">
    <c:import url="https://www.google.co.kr/search?q=%EA%B8%81%EC%A7%80%EC%95%8A%EC%9D%80%EA%B0%9C%EB%B0%9C%EC%9E%90&hl=ko" />
</textarea>
 

 

 

var, scope 속성을 사용해서 보관소에 저장했다가 출력할 수 있다.

 

1
2
3
4
                                                                                                                          긁지않은개발자
<
c:import var="lottoResult" url="https://www.nlotto.co.kr/common.do?method=getLottoNumber&drwNo=800https://www.google.co.kr/search?q=%EA%B8%81%EC%A7%80%EC%95%8A%EC%9D%80%EA%B0%9C%EB%B0%9C%EC%9E%90&hl=ko" />
<textarea rows="10" cols="80">
    ${lottoResult}
</textarea>
 
 

 

실행 결과는 위와 동일하다.

이렇게 보관소에 저장해두면 필요할때마다 가져와서 쓰거나 결과 데이터를 변환하는 등의 작업을 할 수 있다.

 

<c:redirect> 태그

리다이렉트 처리를 할때 사용한다. 내부적으로 HttpServletResponse의 sendRedirect()를 호출한다.

 

<c:redirect url="url" />

 

<fmt:parseDate> 태그

날짜 형식으로 작성된 문자열로 java.util.Date 객체를 생성한다.

그리고 지정된 보관소에 저장한다.

 

<fmt:parseDate var="변수명" value="날짜 형식 문자열" pattern="패턴" scope="page(기본값) | request | session | application" />

 

1
<fmt:parseDate var="date1" value="2023-06-07" pattern="yyyy-MM-dd" />
                                                                긁지않은개발자

 

<fmt:formatDate> 태그

날짜 객체로부터 원하는 형식으로 날짜를 표현하고자 할때 사용한다.

 

<fmt:formatDate value="java.util.Date 객체 지정" pattern="패턴" />

 

1
2
<fmt:parseDate var="date1" value="2023-06-07" pattern="yyyy-MM-dd" />
<fmt:formatDate value="${date1}" pattern="MM/dd/yy" />
                                                                긁지않은개발자

실행 결과

06/07/23

 

 

728x90