[Servlet_JSP] JSTL

1. JSTL이란?

  • JSP Standard Tag Library
  • JSP 페이지 내에서 자바 코드를 사용하지 않고 로직을 내장하는 효율적인 방법 제시.
  • 표준화된 태그로 자바 코드를 대체하여 코드의 유지보수가 용이해짐.

2. JSTL 환경 설정

JSP에서 JSTL을 사용하기 위해서는 라이브러리를 설치해야 한다.

Maven Repository: jakarta.servlet.jsp.jstl » jakarta.servlet.jsp.jstl-api

Maven에서 Jakarta Standard Tag Library API와 Jakarta Standard Tag Library Implementation을 검색한다.

...
<dependencies>    
    <!-- https://mvnrepository.com/artifact/jakarta.servlet.jsp.jstl/jakarta.servlet.jsp.jstl-api -->
    <dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.glassfish.web/jakarta.servlet.jsp.jstl -->
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>3.0.1</version>
    </dependency>
</dependencies>
Code language: HTML, XML (xml)

pom.xml에 추가한다.

JSP 상단에 <%@ taglib prefix="c" uri="jakarta.tags.core" %>를 추가한다.


3. JSTL Tag

<%@ taglib prefix="prefix" uri="uri" %>
Code language: HTML, XML (xml)

JSTL을 사용하기 위해서 JSP에 추가한다.

JSTL 태그의 종류prefix설명URI
Corec조건문, 반복문, 변수 지원, 흐름 제어 등을 위한 태그 제공jakarta.tags.core
XMLxXML 문서를 처리하기 위한 태그 제공jakarta.tags.xml
Internationalization (I18N) & Formattingfmt다국어 지원 및 날짜, 숫자 등의 포맷팅을 위한 태그 제공jakarta.tags.fmt
DatabasesqlSQL 문을 실행하기 위한 태그 제공jakarta.tags.sql
FunctionsfnEL 내에서 사용될 수 있는 함수 제공 (Collection, String 처리)jakarta.tags.functions

일단은 core만 알고 있자.


4. core tag

<%@ taglib prefix="c" uri="jakarta.tags.core" %>
Code language: HTML, XML (xml)
tag설명
setjsp page에서 사용할 변수 선언
if조건문
choose, when, otherwise다중 조건문 (if ~ else if ~ else)
forEachArray나 Collection의 각 항목을 처리할 때 사용.

set, if, choose-when-otherwise, forEach를 많이 쓴다.

이외에도 remove, forTokens, import, redirect, url, catch, out을 tag들도 존재한다.


가. set

    ${pageContext.request.contextPath}    

    <c:set var="root1" value="${pageContext.request.contextPath}" />
    ${root1}

    <c:set var="root2" >${pageContext.request.contextPath}</c:set>
    ${root2}

    <c:set scope="session" var="root1" value="${pageContext.request.contextPath}" />
    ${root1}
Code language: HTML, XML (xml)

Jsp page에서 사용할 변수 선언.

변수가 저장될 scope도 지정할 수 있다.


나. c:if

<c:if test="${name eq 'park'}"> ... </c:if>
<c:if test="${name eq 'kim'}" var="varName" scope="session" > ... </c:if>
Code language: HTML, XML (xml)
  • test : 필수 속성으로 속성값으로 EL 비교식을 가집니다.
  • var : 조건 결과를 저장할 변수를 지정합니다.
  • scope : 조건 결과를 저장할 변수의 저장 scope을 지정합니다.
비교연산자설명
eq 또는 ==동일
ne 또는 !=동일하지 않음
empty비어 있거나 null.
not empty비어 있지 않거나 not null
lt 또는 <작다
gt 또는 >크다
le 또는 <=작거나 같다.
ge 또는 >=크거나 같다.

and, or, not(또는 &&, ||, !) 같은 논리 연산자도 지원한다.


다. c:choose, c:when, c:otherwise

<c:choose>
<c:when test="${name eq 'kim'}"> ... </c:when>
<c:when test="${name eq 'park'}"> ... </c:when>
<c:otherwise> ... </c:otherwise>
</c:choose>
Code language: HTML, XML (xml)

if-elseif-else문은 choose-when-otherwise를 사용한다.


라. c:forEach

<c:forEach var=”varName” items=”${}” ></c:forEach>

<c:forEach var=”varName” items=”${}” varStatus="varStatus"> 
    ${vaStatus.count}
</c:forEach>
Code language: HTML, XML (xml)

Array, Collection, Map 등의 개별 항목들에 대하여 반복적인 작업을 수행한다.

varStatus 속성으로 현재 반복의 상태를 알 수 있다.

package com.company.board;

public class Data {
    int age;
    String name;

    public Data(int age, String name) {
        super();
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Data [age=" + age + ", name=" + name + "]";
    }
}
Code language: JavaScript (javascript)

실습을 위한 간단한 DTO 생성.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@page import="com.company.board.Data"%>
<%@page import="java.util.List"%>
<%
    List<Data>  list = new ArrayList<Data>();
    list.add(new Data(25, "홍길동1"));
    list.add(new Data(85, "홍길동2"));
    list.add(new Data(60, "홍길동3"));
    list.add(new Data(65, "홍길동4"));
    list.add(new Data(15, "홍길동5"));
    list.add(new Data(29, "홍길동6"));
    list.add(new Data(45, "홍길동7"));

    session.setAttribute("list", list);
    response.sendRedirect("i2.jsp");
%>
Code language: PHP (php)

sessionlist 저장.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="jakarta.tags.core" %> 

<c:forEach var="dto" items="${sessionScope.list}" >
이름 : ${dto.name}
나이 : ${dto.age}    
<br>
</c:forEach>
Code language: HTML, XML (xml)

list에 대하여 각각의 item의 정보를 출력.


EL과 JSTL을 잘 사용하면 JSP에서 <%가 사라진다.

 

댓글 남기기