JSTL (JSP Standard Tag Library)
JSP Standard Tag Library - 널리 사용되는 커스텀 태그를 표준으로 만든 태그 라이브러리
JSTL 태그 종류
코어(c) : 변수지원, 흐름제어, URL처리 (http://java.sun.com/jsp/jstl/core)
XML(x) : XML 코어, 흐름제어, XML 변환 (http://java.sun.com/jsp/jstl/xml)
국제화(fmt) : 지역, 메시지 형식, 숫자 및 날씨 형식 (http://java.sun.com/jsp/jstl/fmt)
데이터베이스(sql) : SQL (http://java.sun.com/jsp/jstl/sql)
함수(fn) : 콜렉션 처리, String 처리 (http://java.sun.com/jsp/jstl/functions)
JSTL 1.2 관련 jar 파일 필요
1) 아래 사이트에서 jstl-1.2.jar 파일 다운로드
https://search.maven.org/#browse%7C-658715035
2) jstl-1.2.jar 파일을 WEB-INF/lib에 복사
1. 코어 태그 라이브러리 종류
1) 변수지원
set : JSP에서 사용될 변수를 설정한다.
remove : 설정한 변수를 제거한다.
2) 흐름제어
if : 조건에 따라 내부 코드를 수행한다.
choose : 다중 조건을 처리할 때 사용된다.
forEach : 콜렉션이나 Map의 각 항목을 처리할 때 사용된다.
forTokens : 구분자로 분리된 각각의 토큰을 처리할 때 사용된다.
3) URL 처리
import : URL을 사용하여 다른 자원의 결과를 삽입한다.
redirect : 지정한 경로로 리다이렉트 한다.
url : URL을 재작성 한다.
4) 기타 태그
catch : 예외 처리에 사용된다.
out : JspWriter에 내용을 알맞게 처리한 후 출력한다.
2. 변수 지원 태그 (set, remove)
변수 설정 : EL 변수 값 설정 (생성 또는 변경)
<c:set var="변수명" value="값" [scope="영역"] />
<c:set var="변수명" [scope="영역"]>값</c:set>
특정 EL 변수의 프로퍼티 값 설정
<c:set target="대상" property="프로퍼티이름" value="값" />
<c:set target="대상" property="프로퍼티이름">값</c:set>
변수 삭제
<c:remove var="varName" [scope="영역"] />
scope 미지정시 모든 영역의 변수 삭제
예제) JSTL 코어 태그 (c:set )테스트
1) 자바빈 생성 Member.java
package com.model;
public class Member {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2) 자바빈을 코어태그로 불러오는 jsp 파일 use_c_set.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "com.model.Member" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
Member member = new Member();
// member.setName("홍길동");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>코어 태그 테스트</title>
</head>
<body>
<c:set var="member" value="<%=member %>"></c:set>
<c:set target="${member}" property="name" value="홍길동" /> // 주석처리한 부분과 동일한 부분
이름 : ${member.name}<br />
이름 : <%= member.getName() %>
</body>
</html>
이름 : 홍길동
이름 : 홍길동
코어태그 ${member.name} 로 불러온 것과 jsp 표현식<%= member.getName() %>으로 불러온 것이 동일하게 출력된다.
3. 흐름 제어 (if, choose, forEach, forTokens)
1) if - 조건이 true일 경우 몸체 내용 실행
<%@ 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>JSTL - if</title>
</head>
<body>
<c:if test="${param.name == 'hkd'}">
name 파라미터의 값 : ${param.name}
</c:if>
<br />
<c:if test="${20 < param.age}">
당신의 나이는 20세 이상입니다.
</c:if>
</body>
</html>
실행 후 브라우저 URL창에서 "http://localhost:8095/chap12/use_c_if.jsp?name=hkd&age=30" 이렇게 값을 넘겨주면
name 파라미터의 값 : hkd
당신의 나이는 20세 이상압니다.
이런 식으로 if에 대한 결과값이 출력된다.
2) choose - when - otherwise
switch - case - default와 동일
<%@ 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>JSTL - choose</title>
</head>
<body>
<ul>
<c:choose>
<c:when test="${param.name == 'hkd'}">
<li>당신의 이름은 ${param.name}입니다.</li>
</c:when>
<c:when test="${param.name == 'lsh'}">
<li>당신의 이름은 ${param.name}입니다.</li>
</c:when>
<c:when test="${param.name == 'khd'}">
<li>당신의 이름은 ${param.name}입니다.</li>
</c:when>
<c:otherwise> <!-- 위의 것이 모두 거짓일 때 수행됨 -->
<li>당신의 이름은 ${param.name}입니다.</li>
</c:otherwise>
</c:choose>
</ul>
</body>
</html>
3) 반복 처리 forEach
집합이나 컬렉션 데이터 사용
<c:forEach var="변수" items="아이템">
… ${변수사용} ...
</c:forEach>
특정 횟수 반복
<c:forEach var="i" begin="1" end="10" [step="값"]>
${i} 사용
</c:forEach>
varStatus 속성
<c:forEach var="item" items="<%= someItemList %>" varStatus="status">
${status.index + 1} 번째 항목 : ${item.name}
</c:forEach>
index - 루프 실행에서 현재 인덱스, count - 루프 실행 횟수
begin - begin 속성 값, end - end 속성 값, step - step 속성 값
first - 현재 실행이 첫 번째 실행인 경우 true
last - 현재 실행이 루프의 마지막 실행인 경우 true
current - 콜렉션 중 현재 루프에서 사용할 객체
예제) forEach를 이용하여 1부터 100까지의 합 구하기
<%@ 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>JSTL = forEach</title>
</head>
<body>
<h3>1~100까지의 합</h3>
<%--
<%
int sum = 0;
for(int i=1; i<=100; i++) {
sum += i;
}
%>
1~100까지의 합: <%= sum %>
--%>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var="sum" value="${sum+i}" />
</c:forEach>
1~100까지의 합: ${sum}
</body>
</html>
1~100까지의 합
1~100까지의 합: 5050
c:forEach를 이용하여 주석처리한 부분과 동일한 결과를 낼 수 있다.
예제) 구구단 9단 출력하기
<%@ 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>JSTL = forEach</title>
</head>
<body>
<h3>구구단 9단</h3>
<ul>
<c:forEach var="i" begin="1" end="9" step="1">
<li>9 * ${i} = ${9 * i}</li>
</c:forEach>
<ul>
</body>
</html>
구구단 9단
- 9 * 1 = 9
- 9 * 2 = 18
- 9 * 3 = 27
- 9 * 4 = 36
- 9 * 5 = 45
- 9 * 6 = 54
- 9 * 7 = 63
- 9 * 8 = 72
- 9 * 9 = 81
예제) c:forEach로 배열(Array) 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="intArray" value="<%= new int[] {5,6,7,8,9}%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL = forEach</title>
</head>
<body>
<h3>int형 배열</h3>
<ul>
<c:forEach var="i" items="${intArray}" begin="2" end="4" step="1" varStatus="status">
<li>status.index는 ${status.index}, status.count는 ${status.count}, 실제 데이터 i는 ${i}</li>
<!-- begin과 end는 index를 지정 -->
</c:forEach>
</ul>
</body>
</html>
int형 배열
- status.index는 2, status.count는 1, 실제 데이터 i는 7
- status.index는 3, status.count는 2, 실제 데이터 i는 8
- status.index는 4, status.count는 3, 실제 데이터 i는 9
예제) c:forEach로 배열(HashMap) 출력하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
HashMap<String, Object> mapData = new HashMap<String, Object>();
mapData.put("name", "홍길동");
mapData.put("today", new java.util.Date());
%>
<c:set var="map" value="<%= mapData%>" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL = forEach</title>
</head>
<body>
<h3>Map</h3>
<c:forEach var="i" items="${map}">
${i.key} : ${i.value} <br />
</c:forEach>
</body>
</html>
Map
today : Wed Mar 16 12:29:21 KST 2016
name : 홍길동
4) 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>JSTL - forTokens</title>
</head>
<body>
구분자를 통한 데이터 가져오기: <br />
<c:forTokens items="빨강, 주황, 노랑, 초록, 파랑, 남, 보라" delims="," var="tokens">
${tokens}
</c:forTokens>
</body>
</html>
구분자를 통한 데이터 가져오기:
빨강 주황 노랑 초록 파랑 남 보라
3. URL 관련 태그
1) import : 외부/내부 페이지를 현재 위치에 삽입
<c:import url="URL" [var="변수명"] [scope="영역"] [charEncoding="캐릭터셋"]>
<c:param name="파라미터이름" value="값" />
...
</c:import>
상대 URL import 시 <jsp:include>와 동일하게 동작
2) url : 절대 URL과 상대 URL을 알맞게 생성
<c:url value="URL" [var="varName"] [scope="영역"]>
<c:param name="이름" value="값" />
</c:url>
웹 컨텍스트 내에서 절대 경로 사용시 컨텍스트 경로 자동 추가
3) redirect : 지정한 페이지로 리다이렉트
<c:redirect url="URL" [context="콘텍스트경로"]>
<c:param name="이름" value="값" />
</c:redirect>
예제) import
<%@ 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>JSTL</title>
</head>
<body>
<h1>선택하세요</h1>
<c:choose>
<c:when test="${param.type=='youtube'}">
<c:import url="https://www.youtube.com/results/">
<c:param name="search_query" value="건담"></c:param>
</c:import>
</c:when>
<c:when test="">
</c:when>
<c:otherwise>
<c:import url="use_c_forEach.jsp">
</c:import>
</c:otherwise>
</c:choose>
</body>
</html>
실행 후 브라우저에서 url 끝에 ?type=youtube를 입력하면 해당 사이트, 해당 검색어로 이동한다.
예제) url
<%@ 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>JSTL url</title>
</head>
<body>
<c:url value="http://search.daum.net/search">
<c:param name="w" value="blog" />
<c:param name="q" value="공원" />
</c:url>
<br />
<c:url value="/use_c_if.jsp" /> <br />
<c:url value="use_c_if.jsp" /> <br />
<c:url value="./use_c_if.jsp" /> <br />
</body>
</html>
http://search.daum.net/search?w=blog&q=%ea%b3%b5%ec%9b%90
/chap12/use_c_if.jsp
use_c_if.jsp
./use_c_if.jsp
예제) redirect
<%@ 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>JSTL url</title>
</head>
<body>
<c:redirect url="http://search.daum.net/search">
<c:param name="w" value="blog" />
<c:param name="q" value="공원" />
</c:redirect>
</body>
</html>
실행하면 해당 사이트가 열리며 해당 검색어로 검색이 된다.
<c:redirect url="use_c_if.jsp" />는 <% response.sendRedirect("use_c_if.jsp"); %>와 결과가 같음.
<%@ 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>JSTL - if</title> </head> <body> <c:if test="${param.name == 'hkd'}"> name 파라미터의 값 : ${param.name} </c:if> <br /> <c:if test="${20 < param.age}"> 당신의 나이는 20세 이상압니다. </c:if> </body> </html>
- 숫자: 10,000
- 통화: $10,000
- 패턴: 00010000.00
- 확률: 1,000,000%
- 2016년 3월 17일 목요일
- 16. 3. 17
- 오전 11:44:31
- 2016년 3월 17일 목요일 오전 11시 44분 31초 KST
- KST 오전 11:44
- 현재시간: 2016년 3월 17일 목요일 오후 12시 11분 28초 KST
- 홍콩시간: 2016년 3월 17일 목요일 오전 11시 11분 28초 HKT
fmt:timeZone의 value에 넣을 수 있는 각 나라의 입력값:
- Africa/Abidjan
- Africa/Accra
- Africa/Addis_Ababa
- Africa/Algiers
- Africa/Asmara
'JSP' 카테고리의 다른 글
커스텀 태그 (0) | 2016.03.17 |
---|---|
실습: 자바빈을 코어태그로 불러오기 (0) | 2016.03.16 |
표현 언어 (Expression Language) (0) | 2016.03.14 |
MVC 패턴으로 데이터베이스와 연동되는 게시판 (완성) (0) | 2016.03.14 |
JSP에서 입력받은 값을 데이터베이스에 저장 (0) | 2016.03.10 |