Back/JSTL

JSTL 문법 - 2

잘잔디 2023. 4. 14. 11:58

<c:forTokens> 커스텀 액션의 사용 방법

  • 자바의 for문과 java.util.StringTokenizer 클래스의 기능을 합친 것 같은 기능을 제공한다.
  • 이 액션에는 items, delims, var라는 3개의 어트리뷰트를 사용해야 한다.
  • items에는 토큰을 포함하는 문자열을, delims 에는 토큰 분리에 사용할 구획 문자를 , var에는 분리된 토큰을 대입한 변수의 이름을 써야 한다.
<c:forTokens var = "pet"items = "햄스터 이구아나 소라게" delims = ""> 
    ${pet} <br>
</c:forTokens>
  • 토큰의 구획 문자 delims에 한 종류 이상의 문자를 지정할 수 있다.
EX) delims = "*/-"

forTokens 사용 예시

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동물의 왕국</title>
</head>
<body>
    사자의 생일잔치에 누가 왔을까요?<br><br>
    <c:set var="guests" value="토끼^^거북이~사슴" />
    ${guests }<br><br>
    <c:forTokens var="animal" items="${guests}" delims="^~">
        ${animal}<br>
    </c:forTokens>
</body>
</html>

<c:catch> 커스텀 액션의 사용 방법

  • 자바의 try 문과 비슷한 기능을 한다.
  • <c:catch> 커스텀 액션의 시작 태그와 끝 태그 사이에서 에러가 발생하면 실행의 흐름이 곧바로 <c:catch> 액션 다음에 있는 코드로 넘어간다.
  • <c:catch> 커스텀 액션은 자바의 try 블록에 해당하는 일만 하기 때문에 catch 블록에 해당하는 일은 별도로 코딩해야 한다.
<c:catch var = "e"> //e = exception 객체를 저장할 변수
    <% int result = num1/ num2 %>
    나눗셈의 결과는? <%= result %>
</c:catch>
  • var에서 지정한 변수는 catch 액션의 범위 밖에서도 EL 식을 통해 사용 가능하다.
  • 이를 사용해 에러 처리를 하면 된다.
<c:if test = "${e != null}">
    에러 메시지 : ${e.message}
</c:if>

에러 발생 예시 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
    String str1 = request.getParameter("NUM1");
    String str2 = request.getParameter("NUM2");
    int num1 = Integer.parseInt(str1);
    int num2 = Integer.parseInt(str2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>나눗셈 프로그램</title>
</head>
<body>
    <c:catch var="e">
        <% int result = num1 / num2; %>
        나눗셈의 결과는?<%= result %>
    </c:catch>
    <c:if test="${e != null}">
        에러 메시지:${e.message}
    </c:if>
</body>

<c:redirec> 커스텀 액션의 사용 방법

  • sendRedirect 메서드를 통해 달느 웹 자원을 호출하는 일을 한다
  • 호출할 웹 자원의 URL은 url 어트리뷰트를 이용해서 지정하면 된다.
<c:redirect url = "http://www.hanb.co.kr">

<c:import>

  • jsp:include 표준 액션과 유사하지만 다른 JSP 페이지 뿐만 아니라 다른 종류의 웹 자원도 호출할 수 있다는 점이 다르다
  • 호출할 웹 자원의 URL은 url 어트리뷰트를 이용해서 지정하면 된다.
<c:import url = "http://www.hanb.co.kr/binfo/BrainSeries.jsp" />
  • 호출할 웹 자원에 데이터를 넘겨주려면 <c:import> 커스텀 액션의 시작 태그와 끝 태그 사이에 <c:param> 커스텀 액션을 쓰면 된다.
<c:import url = "http://www.hanb.co.kr/binfo/BrainSeries.jsp" />
    <c:param name = "product" value = "TV" />
    <c:param name = "ad_index" value = "007" />
</c:import>

<c:url>

  • c:set 커스텀 액션과 마찬가지로 변수의 선언에 사용되지만, URL을 쉽게 다룰 수 있는 방법을 제공한다는 점이 다르다.
  • var 어트리뷰트에 변수 이름을 지정하고, value 어트리뷰트에 변수의 초기값을 지정하면 된다.
  • <c:url>의 시작 태그와 끝 태그 사이에 <c:param> 커스텀 액션을 쓰면, URL 뒤에 쿼리 스트링 형태로 덧붙는 데이터를 지정할 수 있다.
<c:url var = "myUrl" value = "http://localhost:9090/bran09/Add.jsp">
    <c:param name = "NUM1" value = "999" />
    <c:param name = "NUM2" value = "1" />
</c:url>

사용 예시

<%@ 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}" />

  • next에 저장된 값을 value에 저장된 주소로 redirect 해줌을 볼 수 있다.

<c:out>

  • 데이터를 출력할 때 사용하는 커스텀 액션이다.
  • 웹 브라우저에 의해 특수한 문자로 해석되는 < , > , & , ‘ , “를 포함하는 데이터를 출력할 때 편리하다.
  • 출력할 데이터는 value 어트리뷰트에 지정하면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>문법 설명</title>
</head>
<body>
    <h3>FONT 태그에 대하여</h3>
    <c:out value="<FONT size=7>커다란 글씨</FONT>는 다음과 같은 출력을 합니다." /><br><br>
    <c:out value="<FONT size=7>커다란 글씨</FONT>" escapeXml="false" />
</body>
</html>

  • default 어트리뷰트를 이용하면 출력할 데이터의 디폴트 값을 지정할 수 있다.
  • 이 방법은 EL 식의 결과를 출력할 때 유용하다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>간단한 인사</title>
</head>
<body>
    안녕하세요, <c:out value="${param.ID}" default="guest" />님
</body>
</html>

날짜와 시각을 포맷하는 fmt:formatDate 커스텀 액션

  • 날짜와 시각을 포맷하는 커스텀 액션이다.
  • 이 액션에는 출력할 날짜와 시각을 java.util.Date 타입의 객체로 넘겨줘야 하므로 먼저 이 클래스의 객체를 만들어야 한다.
  • value 어트리뷰트에 Date 객체를 지정하면 그 객체가 포함하고 있는 날짜가 YYYY.MM.DD 포맷으로 출력된다.
  • type 어트리뷰트를 “time” 으로 지정하면 시간을 출력하는 용도로 사용 가능하다.
  • value 어트리뷰트에 date 객체, type 어트리뷰트에 “both”를 넘겨주면 날짜와 시간을 둘 다 출력해 준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>현재의 시각</title>
</head>
<body>
    [오늘의 날짜] <fmt:formatDate value="${date}" /><br>
    [현재의 시각] <fmt:formatDate value="${date}" type="time" />
</body>
</html>

  • dateStyle 어트리뷰트에 넣는 값에 따라 날짜를 다른 포맷으로 출력 가능하다.
    • full , long , medium, short 중 하나 입력 가능.
  • timeStyle 어트리뷰트에 넣는 값에 따라 시각도 다른 포맷으로 출력 가능하다.
      • full, long, medium, short 중 하나 입력 가능.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>현재의 시각</title>
</head>
<body>
    [S] <fmt:formatDate value="${date}" type="both" dateStyle="short" timeStyle="short" /><br>
    [M] <fmt:formatDate value="${date}" type="both" dateStyle="medium" timeStyle="short" /><br>
    [L] <fmt:formatDate value="${date}" type="both" dateStyle="long" timeStyle="short" /><br>
    [F] <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="short" /><br>
</body>
</html>

  • pattern 어트리뷰트로 포맷 지정이 가능하다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>현재의 시각</title>
</head>
<body>
    [오늘의 날짜] <fmt:formatDate value="${date}" type="date" pattern="yyyy/MM/dd (E)" /><br>
    [현재의 시각] <fmt:formatDate value="${date}" type="time" pattern="(a) hh:mm:ss" />
</body>
</html>

수치를 포맷하는 fmt:formatNumber 커스텀 액션

  • 출력할 수치 값은 value 어트리뷰트에 지정
  • 세 자리마다 쉼표를 찍은 포맷으로 출력하려면 groupingUsed 어트리뷰트를 true로 지정하면 된다.
  • pattern 어트리뷰트를 사용하여 소수점 아래의 숫자를 원하는 만큼 끊거나 눌러서 표시할 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>숫자 포맷</title>
</head>
<body>
    첫번째 수 : <fmt:formatNumber value = "1234500" groupingUsed = "true" /> <br>
    두번째 수 : <fmt:formatNumber value = "3.141592" pattern = "#.##" /><br>
    세번째 수 : <fmt:formatNumber value = "10.5" pattern = "#.00" /><br>

</body>
</html>

  • type 어트리뷰트에 percent라는 값을 지정하면 주어진 수치를 퍼센트 단위로 표시할 수 있다.
  • type 어트리뷰트에 currency라는 값을 지정해 주면 주어진 수치가 금액에 적합한 포맷으로 만들어져서 출력된다.
  • 화폐 단위를 표시하기 위해서는 currencySymbol이라는 어트리뷰트를 이용하면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>숫자 포맷</title>
</head>
<body>
    금액: <fmt:formatNumber value="1000000" type="currency" currencySymbol="₩" /><br>
    퍼센트: <fmt:formatNumber value="0.99" type="percent" />
</body>
</html>

지역을 설정하는 fmt:setLocale 커스텀 액션

  • 출력할 데이터의 포맷을 특정 지역에 맞게 설정하고자 할 때 사용하는 액션이다.
  • 특정 지역을 설정하기 위해서는 value 어트리뷰트에 언어 코드 또는 국가코드_언어코드를 지정하면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>나라마다 다른 포맷</title>
</head>
<body>
    <h3>우리나라의 포맷</h3>
    <fmt:setLocale value="ko_kr" />
    금액: <fmt:formatNumber value="10000000" type="currency" /><br>
    일시: <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
    <h3>미국의 포맷</h3>
    <fmt:setLocale value="en_us" />
    금액: <fmt:formatNumber value="10000000" type="currency" /><br>
    일시: <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
    <h3>일본의 포맷</h3>
    <fmt:setLocale value="ja_jp" />
    금액: <fmt:formatNumber value="10000000" type="currency" /><br>
    일시: <fmt:formatDate value="${date}" type="both" dateStyle="full" timeStyle="full" /><br>
</body>
</html>

시간대를 설정하는 fmt:timeZonefmt:setTimeZone 커스텀 액션

  • 시간대마다 다른 날짜와 시각을 자동으로 계산해서 표시하기 위해 필요한 커스텀 액션이다.
  • 커스텀 액션의 시작 태그에 value 어트리뷰트를 쓰고 거기에 특정 시간대에 해당하는 지역 이름을 지정하면, 이 액션의 시작 태그와 끝 태그 사이에서 출력되는 날짜와 시각은 그 시간대에 맞게 표시된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="date" value="<%= new Date() %>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>세계시 프로그램</title>
</head>
<body>
    서울: <fmt:formatDate value="${date}" type="both" /><br>
    <fmt:timeZone value="Asia/Hong_Kong">
        홍콩: <fmt:formatDate value="${date}" type="both" /><br>
    </fmt:timeZone>
    <fmt:timeZone value="Europe/London">
        런던: <fmt:formatDate value="${date}" type="both" /><br>
    </fmt:timeZone>
    <fmt:timeZone value="America/New_York">
        뉴욕: <fmt:formatDate value="${date}" type="both" /><br>
    </fmt:timeZone>
</body>
</html>

  • timeZone과 setTimeZone 커스텀 액션은 시작 태그와 끝 태그 사이에만 영향을 미치는 것이 아니라, 이 액션 다음의 모든 코드에 영향을 미친다.