JSTL
<%@ taglib prefix="별칭" uri="태그라이브러리식별자" %>
<별칭:태그명 value="${EL표현식}" />
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function" %>
<c:out> 태그
<c:out value="${표현식}" />
<c:out value="${book.title}" />
<c:if> 태그
<c:if test="${표현식}">
HTML 컨텐츠
</c:if>
<!-- test에서 제시한 조건이 true면 HTML 컨텐츠가 화면에 출력된다. --->
<c:choose> <c:when> <c:otherwise> 태그
<c:choose>
<c:when test="${조건식1}">
HTML 컨텐츠
<!-- test에서 제시한 조건식1이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:when test="${조건식2}">
HTML 컨텐츠
<!-- test에서 제시한 조건식2이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:when test="${조건식3}">
HTML 컨텐츠
<!-- test에서 제시한 조건식3이 true면 HTML 컨텐츠가 화면에 출력된다. --->
</c:when>
<c:otherwise>
HTML 컨텐츠
<!-- test에서 제시한 조건식1, 조건식2, 조건식3이 전부 false면 HTML 컨텐츠가 화면에 출력된다. --->
</c:otherwise>
</c:choose>
<c:forEach> 태그
<c:forEach var="변수명" items="${표현식}">
<p>${변수명}<p>
</c:forEach>
<c:forEach var="변수명1" items="${표현식}" varStatus="변수명2">
<p>${변수명2.count} ${변수명1}<p>
</c:forEach>
<c:forEach var="변수명" begin="${표현식}" end="${표현식}">
<a href="list.hta?pageno=${변수명}">${변수명}</a>
</c:forEach>
<c:set> 태그
<c:set var="변수명" value="${표현식}" />
<c:set var="변수명" value="값" />
<c:set var="변수명" value="<%=값 %>" />
var 지정된 이름으로 값이 저장된다.
${변수명}으로 저장된 값을 표현할 수 있다.
scope는 값이 저장될 객체를 지정한다.
<c:set var="a" value="길동" />
<%-- pageContext.setAttribute("a", "길동"); --%>
<p>${a}</p>
<c:set var="b" value="길동" scope="page"/>
<%-- pageContext.setAttribute("b", "길동"); --%>
<p>${b}</p>
<c:set var="c" value="유신" scope="request"/>
<%-- request.setAttribute("c", "유신"); --%>
<p>${c}</p>
<c:set var="d" value="감찬" scope="session"/>
<%-- session.setAttribute("d", "감찬"); --%>
<p>${d}</p>
<c:set var="e" value="순신" scope="application"/>
<%-- application.setAttribute("e", "순신"); --%>
<p>${e}</p>
<c:remove> 태그
<c:remove var="변수명" />
<c:remove var="a" />
<%-- pageContext.removeAttribute("a"); --%>
<c:remove var="b" scope="page"/>
<%-- pageContext.removeAttribute("b"); --%>
<c:remove var="c" scope="request"/>
<%-- request.removeAttribute("c"); --%>
<c:remove var="d" scope="session"/>
<%-- session.removeAttribute("d"); --%>
<c:remove var="e" scope="application" />
<%-- application.removeAttribute("e"); --%>
<c:url> 태그
<c:url var="변수명" value="경로">
<c:param name="이름1" value="값1" />
<c:param name="이름2" value="값2" />
<c:param name="이름3" value="값3" />
</c:url>
<a href="${변수명}">링크</a>
<%-- <a href="경로?이름1=값1&이름2=값2&이름3=값3">링크</a> --%>
<c:import> 태그
<c:import url="포함시킬파일의 경로" />
<fmt:formatNumber> 태그
<fmt:formatNumber value="${표현식}" />
<fmt:formatNumber value="${표현식}" pattern="패턴문자열" />
<fmt:formatDate> 태그
<fmt:formatDate value="${표현식}" />
<fmt:formatDate value="${표현식}" pattern="패턴문자열" />
<fmt:bundle>, <fmt:message> 태그
<fmt:bundle basename="패키지경로.기본메세지번들파일명"></fmt:bundle>
<fmt:message var="별칭" key="번들파일에 정의한 키" />
<h1><fmt:message key="label.home.title"/></h1>
<fmt:message var="submit_message" key="label.home.btn.submit"/>
<input type="submit" value="${submit_message}" />
국제화처리 절차
<fmt:bundle basename="패키지경로.기본메세지번들파일명" />
<fmt:message key="번들파일에 정의한 키" />
package com.sample.web;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.sample.vo.Score;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/core")
public class CoreTagSampleServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// <c:out /> 태그 연습
String text1 = "택배 배송이 너무 지연됩니다. 확인부탁드려요";
String text2 = "<script>function a() {alert('해피해킹')}</script><button onclick='a()'>클릭</button>";
request.setAttribute("text1", text1);
request.setAttribute("text2", text2);
// <c:if test="${조건식}"> 컨텐츠 </if> 태그 연습
// <c:choose />, <c:when test="${조건식}"/>, <c:otehrwise /> 태그 연습
request.setAttribute("score", 85);
ArrayList<String> names = new ArrayList<String>();
names.add("홍길동");
names.add("김유신");
request.setAttribute("names", names);
Map<String, Integer> condition = new HashMap<String, Integer>();
condition.put("year", 3); // 자동차 사용기간 3년
condition.put("distance", 100000); // 운행거리 10만 km
request.setAttribute("car", condition);
// <c:forEach var="변수명" items="${조건식}">컨텐츠</forEach>
List<String> members = new ArrayList<String>();
members.add("김유신");
members.add("강감찬");
members.add("이순신");
members.add("홍길동");
members.add("유관순");
request.setAttribute("members", members);
List<Score> scoreList = new ArrayList<Score>();
scoreList.add(new Score("홍", "길동", 70, 100, 90));
scoreList.add(new Score("김", "유신", 70, 70, 100));
scoreList.add(new Score("강", "감찬", 70, 80, 85));
scoreList.add(new Score("이", "순신", 100, 100, 100));
scoreList.add(new Score("유", "관순", 50, 60, 50));
request.setAttribute("scores", scoreList);
// <c:set /> 태그 연습
request.setAttribute("king", new Score("세종", "대왕", 100, 90, 100));
// core.jsp로 내부이동 시키기
request.getRequestDispatcher("/jstl/core.jsp").forward(request, response);
}
}
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%--
JSTL 태그 라이브러리 중 core 태그 라이브러리를 JSP페이지에 포함시키기
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<title>JSTL 연습</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row mb-3">
<div class="col-12">
<h3>out 태그</h3>
<div>EL 표현식으로 출력 : ${text1 }</div>
<div>out 태그로 출력 : <c:out value="${text1 }"/></div>
<div>EL 표현식으로 출력 : ${text2 }</div>
<div>out 태그로 출력 : <c:out value="${text2 }" escapeXml="false" /></div>
<div>out 태그로 출력 : <c:out value="${text2 }" /></div>
</div>
</div>
<div class="row mb-3">
<div class="col-12">
<h3>if 태그</h3>
<h4>조건식에서 비교연산자 사용해보기</h4>
<c:if test="${score >= 60}">
<p>점수가 60점 이상이면 합격입니다.</p>
</c:if>
<c:if test="${score < 60}">
<p>점수가 60점 미만이면 불합격입니다.</p>
</c:if>
<c:if test="${score ge 60}">
<p>점수가 60점 이상이면 합격입니다.</p>
</c:if>
<c:if test="${score lt 60}">
<p>점수가 60점 미만이면 불합격입니다.</p>
</c:if>
<h4>조건식에서 empty 연산자 사용해보기</h4>
<c:if test="${not empty names}">
<p>names로 찾은 ArrayList는 비어있지 않다.</p>
</c:if>
<c:if test="${empty names}">
<p>names로 찾은 ArrayList는 비어있다.</p>
</c:if>
<h4>조건식에서 비교연산자, 논리연산자 사용해보기</h4>
<c:if test="${car.year ge 5 or car.distance ge 100000}">
<p>유상처리 대상 차량입니다.</p>
</c:if>
<c:if test="${car.year lt 5 and car.distance lt 100000}">
<p>무상처리 대상 차량입니다.</p>
</c:if>
</div>
</div>
<div class="row mb-3">
<div class="col-12">
<h3>choose, when 태그 사용해보기</h3>
<c:choose>
<c:when test="${score ge 60 }">
<p>점수가 60점 이상이면 합격입니다.</p>
</c:when>
<c:otherwise>
<p>점수가 60점 미만이면 불합격입니다.</p>
</c:otherwise>
</c:choose>
<h4>여러 개의 조건을 제시해보기</h4>
<c:choose>
<c:when test="${score ge 90 }">
<p>A</p>
</c:when>
<c:when test="${score ge 80 }">
<p>B</p>
</c:when>
<c:when test="${score ge 70 }">
<p>C</p>
</c:when>
<c:when test="${score ge 60 }">
<p>D</p>
</c:when>
<c:otherwise>
<p>F</p>
</c:otherwise>
</c:choose>
<h4>논리연산자 사용해보기</h4>
<c:choose>
<c:when test="${car.year ge 5 and car.distance ge 100000 }">
<p>유상처리 대상 차량입니다.</p>
</c:when>
<c:otherwise>
<p>무상처리 대상 차량입니다.</p>
</c:otherwise>
</c:choose>
</div>
</div>
<div class="row mb-3">
<div class="col-6">
<h3>forEach 태그연습</h3>
<h4>String이 여러 개 저장된 List객체의 값 표현</h4>
<ul>
<c:forEach var="member" items="${members}">
<li>${member}</li>
</c:forEach>
</ul>
<h4>varStatus로 현재 반복상태 출력하기</h4>
<table class="table">
<thead>
<tr>
<th>index</th>
<th>count</th>
<th>first</th>
<th>last</th>
<th>값출력</th>
</tr>
</thead>
<tbody>
<c:forEach var="name" items="${members}" varStatus="loop">
<tr>
<td>${loop.index}</td>
<td>${loop.count}</td>
<td>${loop.first}</td>
<td>${loop.last}</td>
<td>${name}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="col-6">
<h4>Score 객체가 여러 개 저장된 List객체의 값 표현</h4>
<table class="table">
<thead>
<tr>
<th>순번</th>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>총점</th>
<th>평균</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${empty scores}">
<tr>
<td colspan="7" class="text-center">등록된 데이터가 존재하지 않습니다.</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach var="score" items="${scores}" varStatus="loop">
<tr>
<td>${loop.count}</td>
<td>${score.fullName}</td>
<td>${score.kor}</td>
<td>${score.eng}</td>
<td>${score.math}</td>
<td>${score.total}</td>
<td>${score.average}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</tbody>
</table>
<h4>forEach태그 안에서 if 태그</h4>
<table class="table">
<thead>
<tr>
<th>이름</th>
<th>국어</th>
<th>영어</th>
<th>수학</th>
<th>총점</th>
<th>평균</th>
</tr>
</thead>
<tbody>
<c:forEach var="score" items="${scores}">
<c:if test="${score.average le 60}">
<tr>
<td>${score.fullName}</td>
<td>${score.kor}</td>
<td>${score.eng}</td>
<td>${score.math}</td>
<td>${score.total}</td>
<td>${score.average}</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
<h4>forEach의 var, begin, end로 페이징처리의 페이지번호 출력</h4>
<ul class="pagination">
<c:forEach var="num" begin="1" end="10">
<li class="page-item ${param.page eq num ? 'active' : '' }"><a href="core?page=${num}" class="page-link">${num }</a></li>
</c:forEach>
</ul>
</div>
</div>
<div class="row mb-3">
<div class="col-12">
<h3>set태그와 remove태그 사용해보기</h3>
<h4>set태그를 이용해서 최고점수와 최저점수 출력하기</h4>
<c:set var="min" value="300"/>
<c:set var="max" value="0"/>
<c:forEach var="score" items="${scores}">
<c:if test="${score.total gt max }">
<c:set var="max" value="${score.total}" />
</c:if>
<c:if test="${score.total lt min}">
<c:set var="min" value="${score.total}" />
</c:if>
</c:forEach>
<p>최고점수 : ${max}</p>
<p>최저점수 : ${min}</p>
<h4>set태그를 이용해서 pageContext, HttpServletRequest, HttpSession, ServletContext에
속성으로 저장된 객체의 프로퍼티값을 변경하기</h4>
<h5>변경전 값 출력하기</h5>
<p>${king.firstName} ${king.lastName } ${king.kor } ${king.eng } ${king.math }</p>
<c:set target="${king }" property="kor" value="90" />
<c:set target="${king }" property="eng" value="90" />
<c:set target="${king }" property="math" value="90" />
<h5>변경후 값 출력하기</h5>
<p>${king.firstName} ${king.lastName } ${king.kor } ${king.eng } ${king.math }</p>
</div>
</div>
<div class="row mb-3">
<div class="col-6">
<h3>URL 태그</h3>
<c:url var="bookDetailLink" value="book/detail">
<c:param name="no" value="100"></c:param>
<c:param name="page" value="3"></c:param>
<c:param name="category" value="소설"></c:param>
<c:param name="subCategory" value="외국소설"></c:param>
</c:url>
<p>링크 : <a href="${bookDetailLink}">상세보기</a></p>
</div>
</div>
</div>
</body>
</html>