본문 바로가기

[JSP] JSTL : JSP Standard Tag Library

인포꿀팁 발행일 : 2020-10-26

JSTL 이란?

JSP에서 사용자 태그를 정의해서 사용하는 것이 가능하며, 이런 사용자 정의 태그를 커스텀 태그라고 하는데 이를 자주 사용하는 것을 표준으로 만들어 놓은 것이 JSTL이다.

 

JSTL 특징

  • JSTL은 JSP의 공통적인 핵심 기능을 캡슐화 한 태그 모음이다.
  • JSTL은 반복 및 조건문 XML 문서 조작을 위한 태그, 국제화 태그 및 SQL 태그와 같은 일반적인 구조 작업을 지원한다.
  • JSTL과 커스텀 태그및 JSP 액션태그는 XML 기반에서 작성되었기 때문에 모든 태그는 시작 태그와 종료 태그의  쌍으로 이루어져야 한다.
  • JSTL은 EL를 사용하여 표현한다.

 

JSTL은 커스텀 태그의 일종으로 자바로 작성된 tag이므로 다음의 라이브러리가 필요하다.

jstl-1.2jar

 

JSTL 사용법

사용자 정의 태그나 JSTL 사용을 위한 태그 라이브러리를 지정한다.

taglib 지시어는 사용자 정의 태그 , JSTL의 라이브러리 위치를 식별한다.

형식

예시

<%@ taglib prefix= "c" uri="http://java.sun.com/jsp/jstl/core"%>

uri : 태그 라이브러리 URI 또는 태그 라이브러리 디스크립터 파일의 URI

prefix : 사용자 정의 태그 접두사(태그를 식별하기 위한 이름)

 

자주 쓰이는 JSTL 태그 종류

태그 이름 기능 접두어 참조 구문
Core tags 변수 지원, 흐름 제어, URL처리 c <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Formatting tags 지역, 메세지형식, 숫자 및 날짜 형식 fmt <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
SQL tags 오라클,mysql 와 같은 DBMS와 상호 작용 하기 위한 태그 sql <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
JSTL function 컬렉션처리, String 처리 fn <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
XML tags XML 코어, 흐름제어, XML 변환 x <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>

1) JSTL Core 태그

일반 프로그램 언어에서 제공하는 변수선언, 조건, 제어 ,반복문 등의 기능 제공

core 태그 종류

태그 설명
<c:out> 수식의 결과 출력  /  <%= %>과 유사하다
<c:set> JSP에서 사용할 변수 설정
<c:remove> 설정한 변수를 제거
<c:catch> 예외처리
<c:if> 조건에 따라 내부 코드 실행
<c:choose> 여러 조건 처리시 사용
<c:when> <c:choose>태그의 하위 태그, 조건에따라 코드 실행
<c:otherwise> <c:choose>태그의 하위 태그, 조건 만족안할시 실행
<c:import> URL를 사용하여 다른 자원 결과 삽입
<c:forEach> 고정된 횟수 또는 컬렉션, map의 각 항목 처리시 사용하는 반복문
<c:forTokens> 제공된 구분자로 구분된 토큰을 반복한다, 문자열을 토큰으로 분리하고 각 토큰을 반복 출력 생성한다.
<c:param> 주로<c:url><c:redirect><c:import>와 사용하며 매개변수를 추가한다.
<c:url> url형식 또는 url인코딩에 사용

<c:if> 태그 

조건문 태그로 else 구문이 따로 없다.

필수 속성 : test (본문 내용의 실행 여부를 결정하는 조건식)

속성:

var : 테스트 조건 결과 저장할 변수

scope : 조건 결과를 저장할 변수의 scope 

 

<c:if> 태그 예시

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
32
33
34
35
36
37
38
39
40
41
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
    request.setCharacterEncoding("utf-8");
 
%>
 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<div>
    <form action="ex7_cif.jsp">
        <input type="text" name="num1" value="${param.num1 }">
        <select name="oper">
            <option value="+" ${param.oper=="+"?"selected='selected' ":"" }>덧셈</option> 
            <option value="-" ${param.oper=="-"?"selected='selected' ":"" }>뺄셈</option> 
            <option value="/" ${param.oper=="/"?"selected='selected' ":"" }>나눗셈</option> 
            <option value="*" ${param.oper=="*"?"selected='selected' ":"" }>곱셈</option> 
        </select>
        <input type="text" name="num2" value="${param.num2 }">
        <button> = </button>
        <span>
            <!-- c:if 안에 test 에 들어가는건 조건식으로 true를 만족해야 안의 식이 수행됨 -->
                <c:if test="${not empty param.num1 and not empty param.num2 }">
                    <c:if test="${ param.oper == '+'}">${param.num1+param.num2 }</c:if>
                    <c:if test="${ param.oper == '-'}">${param.num1-param.num2 }</c:if>
                    <c:if test="${ param.oper == '/'}">${param.num1/param.num2 }</c:if>
                    <c:if test="${ param.oper == '*'}">${param.num1*param.num2 }</c:if>
                </c:if>
        </span>
    </form>
</div>
</body>
</html>
cs

<c:choose>, <c:when>, <c:otherwise>태그

여러 조건 중 하나의 조건을 선택하여 실행

<c:when> 조건에 만족하는 것이 없으면, <c:otherwise> 태그 내면 본문을 실행한다.

필수 속성 : 

test : true 이면 실행

<c:choose>, <c:when>, <c:otherwise>태그 예시

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
32
33
34
35
36
37
38
39
40
41
42
43
44
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
    request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<h3>JSTL : core - choose </h3>
 
<!-- action 을 지정하지 않으면 동일한 uri -->
<form method="post">
    <p> 수 : <input type="text" name="num"> </p>
    <button type="submit">확인</button>
</form>
<p>
    <c:if test="${not empty param.num} ">
        <c:choose>
            <c:when test="${param.num%3==0 && param.num%4==0 }">
                ${param.num } 은 3과 4의 배수입니다.
            </c:when>
            <c:when test="${param.num%3==0}">
                ${param.num } 은 3의 배수입니다.
            </c:when>
            <c:when test="${param.num%4==0}">
                ${param.num } 은4의 배수입니다.
            </c:when>
            <c:otherwise>
                ${param.num } 은 3또는 4의 배수가 아닙니다.
            </c:otherwise>
        </c:choose>
        
    </c:if>
 
</p>
</body>
</html>
cs

<c:forEach> 태그

고정된 횟수 또는 컬렉션에 대해 중첩 본문 콘텐츠를 반복하는 데 사용하는 반복 태그

 

 

(1) 예시 : var 속성을 사용하여 begin end step 사용 (일반 for문과 유사)

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
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<h3>JSTL -core : forEach 형식 1</h3>
<!-- for문과 유사함 -->
<table style="width: 500px;" border="1">
    <c:forEach var ="a" begin="1" end="5" step="1">
        <tr height="30" align="center">
            <c:forEach var="b" begin="1" end="10">
                <td width="50">
                    <c:set var ="n" value="${n+1 }"/>
                    <!-- c:set 은 page.setAttribute("변수",값) 과 유사  -->
                    ${n }
                </td>
            </c:forEach>
        </tr>
    </c:forEach>
</table>
</body>
</html>
cs

 

(2) 예시 : items 속성에 list를 불러와 출력(향상된 for문과 유사)

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
32
33
34
35
<%@page import="com.user.UserDTO"%>
<%@page import="java.util.List"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
    request.setCharacterEncoding("utf-8");
 
    List<UserDTO> list = (List<UserDTO>)request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
 
<h3>forEach를 사용한 경우: JSTL, EL에서 list 접근 방법</h3>
 
<c:forEach var="dto" items="${list }">
<p>${dto.num } : ${dto.name } : ${dto.content }</p>
</c:forEach>
 
<hr>
<!-- 향상된 for문과 유사 -->
<c:forEach var="dto" items="${list }" varStatus="s">
<p>
    ${s.index } : ${s.count } : ${s.first } : ${s.last }:
    ${dto.num } :${dto.name } : ${dto.content }
</p>
</c:forEach>
</body>
</html>
cs

 

<c:out> 태그

<%=%> 과 비슷한 표현식의 결과를 표시한다.

기본적으로 XML 태그를 이스케이프 한다.

필수 속성:

value : 출력할 값

default : 변수가 null일시 출력되는 대체 값

escapeXml : < > & 와같은 문자 사용 여부 제어 true로 설정시 자동으로 변환(기본값 true)

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
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
    String msg = "안녕하세요, <b>스프링</b> 님을 환영합니다.";
    //request.setAttribute("msg", msg); // 현 jsp 또는 포워딩한 페이지에서도 사용 가능
    pageContext.setAttribute("msg", msg); //현 jsp 페이지에서만 사용 가능
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3> c : cut</h3>
<!-- escapeXml 기본이 true : 태그는 태그가 실행된 결과가 아닌 태그 자체로 인식-->
<p> <c:out value="${msg}"/></p>
<p> <c:out value="${msg}" escapeXml="false" /></p>
<p> <c:out value="${msg}" escapeXml="true"/></p>
<p> <c:out value="<b> 태그 : 글자를 진하게" /></p>
 
<hr>
<h3> c:set : pageContext.setAtrribute()</h3>
<c:set var="s" value="반가워 <b>홍길동</b>님"/>
<p><c:out value="${s}"/> </p>
<p><c:out value="${s}" escapeXml="false"/> </p>
 
</body>
</html>
cs

'Web > JSP&SERVLET' 카테고리의 다른 글

[Servlet] 서블릿 이란?  (0) 2020.11.06
[WEB] URL과 URI  (0) 2020.10.28
[WEB] HTTP 와 HTTPS  (0) 2020.10.28
[WEB] 웹 어플리케이션 이란?  (0) 2020.10.28
[JSP] EL : Expression Language  (1) 2020.10.26

댓글