01. JSTL구성 라이브러리 개념
JSTL(Java Standard Tag Library)
- JSP 문서에서 많이 사용되는 EL 함수와 커스텀 태그를 제공하기 위한 라이브러리
- JSP 2.0 에 포함되어있음
- 일반적으로 필요한 기능의 태그라이브러리를 미리 구현함
- JSP 문서에서 JSTL이 제공하는 EL 함수 또는 커스텀 태그를 사용하기 위해서는 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리 : https://tomcat.apache.org 사이트 참조
JSTL 다운받고 프로젝트에 빌드처리
step1. 아파치톰캣 사이트 접속
Apache Tomcat® - Welcome!
The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the Jakarta
tomcat.apache.org
step2. Download >> Taglibs 메뉴 클릭
step3. taglibs-standard-impl-1.2.5.jar , taglibs-standard-spec-1.2.5.jartaglibs-standard-jstlel-1.2.5.jar , taglibs-standard-compat-1.2.5.jar 파일 다운로드 (4개의 Jar파일 : 버전은 모두 1.2 )
step4. /WEB-INF/lib 폴더에 jar 파일 붙여넣기 : 프로젝트에 라이브러리 빌드 처리
- 자동으로 빌드처리됨!
02. JSTL 구성 라이브러리 종류
1) Core 태그라이브러리
- 가장 많이 사용하는 태그라이브러리
- 중요하니 Core태그라이브러리 다 알고 있기!!
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
종류
- EL 지원 태그 : 변수 선언 기능
- set태그, remove태그 , out태그
- catch태그
- 프로그램 흐름 제어 태그 : 제어문 기능
- 조건문 : if태그 , choose태그 , when태그 , otherwise태그
- 반복문 : forEach태그 , forTokens태그
- URL 주소 관리하는 태그 : JSP 페이지 이동 기능
- import태그 , param태그 (include 액션태그를 사용하면 되니 사실상 많이 사용 안함)
- redirect태그 , param태그
- url태그 , param태그
2) Formatter 태그라이브러리
- 숫자 또는 날짜와 시간의 형식을 변경 태그 , 국제화 태그, 다국어 지원 태그등을 제공
<%@taglib prefix="fmt" uri="<http://java.sun.com/jsp/jstl/fmt>" %>
종류
- 숫자 또는 날짜와 시간의 형식 변경 태그
- 기존의 DecimalFormat클래스.. 등을 사용하지 않고 원하는 패턴으로 만들 수 있음
- 가장 많이 사용
- formatDate태그, timeZone태그, formatNumber태그
- 국제화태그
- 국제적인 사이트 만들 때 사용 ( 삼성사이트, 엘지사이트.. 등등)
- 브라우저에 접속하는 클라이언트가 사용하는 운영체제의 언어가 무엇이냐에 따라 거기에 맞는 단위로 표현 가능하게해줌
- ex) 한국 - 몸무게단위 kg 날씨단위 섭씨 ~도
- 다양한 언어의 사이트 만들 때 이용함
- 다국어 지원태그
- 국제적인 사이트 만들 때 사용 ( 삼성사이트, 엘지사이트.. 등등)
- 클라이언트의 지원 종류에 따라 한글로 출력될지 영어로 출력될지 결정해줌
3) SQL 태그라이브러리
- 테이블에 대한 행 삽입,변경,삭제,검색 기능의 태그 제공
- 자바는 이 태그 대신 DAO를 만들어 사용하기 때문에 거의 사용하지 않음
- 그리고 너무 단순한 것들만 제공해줌ㅠ
<%@taglib prefix="sql" uri="<http://java.sun.com/jsp/jstl/sql>" %>
4) XML 태그라이브러리
- XML 문서에 대한 처리 기능의 태그 제공
- JSP에서 XML을 다루기 보다는 자바나 자바스크립트로 XML문서를 처리하기 때문에 거의 사용하지 않음
<%@taglib prefix="x" uri="<http://java.sun.com/jsp/jstl/xml>" %>
5) Functions 태그라이브러리
<%@taglib prefix="fn" uri="<http://java.sun.com/jsp/jstl/functions>" %>
- 문자열 처리 기능의 EL 함수 제공 : 대부분 String클래스의 메소드와 유사
- ex) 문자열 조작 함수 : substring(), replace() 등등의 함수 제공
- 생각보다 많이 사용
- split함수, substring함수, replace함수, escapeXml 함수
03. Core 태그라이브러리
1) <c:set> <c:remove>
core_set.jsp
<%@page import="xyz.itwill.el.Student"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
//<%-- taglib Directive를 이용하여 JSTL의 Core 태그 라이브러리를 JSP 문서에 포함해야만
//커스텀 태그를 제공받아 사용 가능 - prefix 속성값은 [c]로 설정 --%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Core - EL 지원 태그</h1>
<hr>
set태그의 역할 1 : 스코프에 속성값 저장
//<%--태그 내용 없을 시 종료태그 생략 가능! --%>
//<%-- set 태그 : 객체를 스코프 속성값으로 저장(변경)하기 위한 태그 --%>
//<%-- setAttribute() 메소드 호출과 동일한 효과 ---%>
//<%-- var속성 : 스코프 속성명을 속성값으로 설정 --%>
//<%-- value속성 : 스코프 속성값을 속성값으로 설정 (값이나 객체로)--%>
//<%-- scope속성 : page, request, session, application 중 하나를 속성값으로 설정--%>
//<%-- page스코프니? request스코프니? session스코프니? application스코프니? --%>
//<%-- =>scope속성을 생략한 경우 [page]속성값을 기본값으로 사용 --%>
//<%-- <% pageContext.setAttribute("su", 10); %>와 동일한 역할 --%>
<c:set var="su" value="10" scope="page"/> //<%--page스코프에 su이름으로 저장된 10이라는 값 --%>
<p>su = ${su }</p>
//<%-- 스코프 속성명이 같은 경우 스코프 속성값 변경 처리 --%>
//<%-- value 속성 대신 태그내용으로 스코프 속성값 처리 가능 --%>
<c:set var="su">20</c:set> //<%-- su 저장값 20으로 변경--%>
<p>su = ${su }</p>
//<%-- value 속성값으로 EL 사용 가능 - EL 표현식에서는 EL 연산자 사용 가능 --%>
<c:set var="tot" value="${su+10 }"/>
<p>tot = ${tot }</p>
<c:set var="name" value="홍길동"/>
<p>tot = ${name }</p>
//<%--주의) 객체는 자바 명령으로만 만들 수 있으므로 EL표현식 사용 불가능 --%>
<c:set var="now" value="<%=new Date() %>"/>
//<%-- EL 표현식에 의해 제공받은 스코프 속성값이 Java 객체인 경우 자동으로 toString() 메소드 호출 --%>
<p>now = ${now }</p>
<p>now.getTime() = ${now.getTime() }</p> //<%--타임스탬프값 반환 --%>
<p>now.time = ${now.time }</p> //<%-- EL 표현식으로 필드명을 사용하면 Getter 메소드 자동 호출 --%>
<c:set var="student" value="<%=new Student() %>"></c:set>
//<%--Student 클래스에 toString()메소드가 오버라이드 선언되지 않아
//Object 클래스의 toString() 클래스의 메모리 주소 반환 --%>
<p>student = ${student }</p>
<p>학번 = ${student.num }, 이름= ${student.name }</p> //<%--null은 EL에서는 출력안됨! --%>
set태그의 역할 2 : 스코프 속성값에 저장된 객체의 필드값을 변경
//<%-- set 태그를 이용하여 스코프 속성값으로 제공된 객체의 필드값 변경 가능 - Setter 메소드 기능 --%>
//<%-- target속성: 필드값을 변경할 객체(스코프 속성값 - EL)를 속성값으로 설정 --%>
//<%-- property속성: 필드값을 변경할 객체의 필드명을 속성값으로 설정 --%>
//<%-- <% ((Student)pageContext.getAttribute("student")).setNum(1000); %>와 동일한 역할 --%>
<c:set target="${student }" property="num" value="1000"/>
<c:set target="${student }" property="name" value="홍길동"/>
<p>학번 = ${student.num }, 이름= ${student.name }</p>
remove태그 : 스코프 속성값을 속성명을 이용해 삭제
//<%--remove태그 : 스코프 속성값을 속성명을 이용하여 삭제하는 태그 : removeAttribute()와 동일한 역할 --%>
//<%-- <% pageContext.removeAttribute("student"); %>와 동일한 역할 --%>
<c:remove var="student"/>
<p>student = ${student }</p>
</body>
</html>
2) <c:out>
core_out.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>MVC</title>
</head>
<body>
<h1>Core - EL 지원 태그</h1>
<hr>
out태그 : XXS공격을 방지하기 위해 사용
- 우리가 전에 만들었던 Utility클래스의
- stripTag()메소드 : 문자열을 전달받아 태그 관련 문자열을 모두 제거하여 반환하는 메소드
- escapeTag()메소드 : 문자열을 전달받아 태그 관련 문자를 회피문자로 변경하여 반환하는 메소드
- 필요없음!!
<c:set var="num" value="100"/>
<p>정수값 = ${num }</p>
//<%--out태그 : 값(EL - 스코프 속성값)을 클라이언트에게 전달하기 위한 출력 태그 --%>
<p>정수값 = <c:out value="${ num}"/></p> //<%--num이라는 scope속성값을 가져다 클라이언트에게 전달해 출력해주세요! --%>
<hr />
//<%-- 스코프 속성값으로 HTML 태그가 포함된 문자열(String 객체) 저장 --%>
<c:set var="html" value="<font size='7' color='red'>안녕하세요</font>"/> //<%--html이라는 속성명으로 폰트태그와 태그내용을 저장해주세요! --%>
//<%-- EL을 사용하여 HTML 태그가 포함된 속성값을 제공받아 출력할 경우 HMTL 태그로 처리되어 출력 --%>
//<%--즉, value값이 문자열이 아닌 태그로 인식된다는 것! --%>
<p>html = ${html }</p>
//<%-- out 태그를 사용하여 HTML 태그가 포함된 속성값을 문자열로 제공받아 출력할 경우
//HMTL 태그도 문자열로 처리되어 출력 --%>
//<%-- 예전에, html태그가 포함된 것들은 엔티티로 변경하여 작성하였지만, 이제는 out태그를 이용하면 그럴 필요 없음 --%>
<c:out value="${html }"/>
</body>
</html>
3) <c:if>
core_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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
//<%--if 태그 : 조건에 대한 결과에 따라 태그내용의 포함 여부를 선택하는 태그 --%>
//<%--test 속성: false 또는 true 중 하나를 속성값으로 설정 --%>
//<%-- => test 속성값이 [false]인 경우 태그내용을 포함하지 않고 [true]인 경우에만 태그내용 포함 --%>
//<%-- => test 속성값으로 EL 연산자를 사용하여 false 또는 true 중 하나를 제공받아 사용 가능 --%>
<c:if test="true">
<p>test 속성값이 [true]인 경우 태그 내용 출력-1</p>
</c:if>
<c:if test="false">
<p>test 속성값이 [true]인 경우 태그 내용 출력-2</p>
</c:if>
<c:set var="sw" value="true"/>
//<%-- test 속성값으로 EL로 제공받은 스코프 속성값 사용 가능 --%>
<c:if test="${sw}">
<p>test 속성값이 [true]인 경우 태그 내용 출력-3</p>
</c:if>
<hr>
<c:set var="num" value="10"/>
//<%-- => test 속성값으로 EL 표현식에서 EL 연산자를 사용하여 false 또는 true 중
//하나를 제공받아 사용 가능 --%>
//<%-- 주의) else문은 따로 없으므로, if문을 두번 작성해야함 --%>
<c:if test="${test%2!=0 }">${num }=홀수</c:if>
<c:if test="${test%2==0 }">${num }=짝수</c:if>
<hr>
<c:set var="num" value="11"/>
<c:if test="${num mod 2 ne 0 }">${num }=홀수</c:if>
<c:if test="${num mod 2 eq 0 }">${num }=짝수</c:if>
<hr>
<c:set var="score" value="80"/>
<c:if test="${score <= 100 && score >= 0 }">${score }점은 정상적인 점수입니다.</c:if>
<c:if test="${score > 100 || score < 0 }">${score }점은 비정상적인 점수입니다.</c:if>
<hr>
<c:set var="score" value="800"/>
<c:if test="${score le 100 and score ge 0 }">${score }점은 정상적인 점수입니다.</c:if>
<c:if test="${score gt 100 or score lt 0 }">${score }점은 비정상적인 점수입니다.</c:if>
<hr>
<c:set var="name" value="홍길동"/>
<c:if test="${empty(name) }"> //<%--name으로 저장된 속성값이 없다면 아래 내용 출력해주세요--%>
<p>name 속성명으로 저장된 속성값은 없습니다.</p>
</c:if>
<c:if test="${!empty(name) }"> //<%--name으로 저장된 속성값이 있다면 아래 내용 출력해주세요--%>
<p>name 속성명으로 저장된 속성값은 [${name }]입니다.</p>
</c:if>
</body>
</html>
4) <c:choose> <c:when> <c:otherwise>
core_choose.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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
if-else-if문과 동일 : choose-when-otherwise
<c:set var="choice" value="4"/>
//<%--choose 태그 : 조건에 대한 결과에 따라 태그내용의 포함 여부를 선택하기 위한 상위 태그 (반드시 하위태그 필요) --%>
//<%-- => 하위태그를 이용하여 태그내용의 포함 여부 선택 --%>
//<%-- => 하위태그 : when태그(1개 이상), otherwise태그(0개 또는 1개 : 즉, 안써도 된다는 뜻) --%>
//<%-- if-else-if문과 비슷 (조건이 일치할 경우에만 태그가 하위 태그(명령)가 포함됨 --%>
//<%-- => 주의) choose 태그에는 하위태그 외 다른 코드가 존재할 경우 에러 발생 - JSP 주석은 작성 가능 --%>
<c:choose>
//<%-- when태그 : 조건에 대한 결과에 따라 태그내용의 포함 여부를 선택하기 위한 태그 --%>
//<%--test 속성: false 또는 true 중 하나를 속성값으로 설정 --%>
//<%-- => test 속성값이 [false]인 경우 태그내용을 포함하지 않고 [true]인 경우에만 태그내용 포함 --%>
//<%-- => test 속성값이 [true]인 경우 태그내용을 포함 후 choose 태그가 종료됨 --%>
<c:when test="${choice == 1 }">
<p>수성으로 이동합니다.</p>
</c:when>
<c:when test="${choice == 2 }">
<p>금성으로 이동합니다.</p>
</c:when>
<c:when test="${choice == 3 }">
<p>화성으로 이동합니다.</p>
</c:when>
//<%--otherwise태그 : when태그의 모든 조건이 거짓(false)인 경우 태그내용을 무조건 포함하기 위한 태그 --%>
<c:otherwise>
<p>지구로 이동합니다.</p>
</c:otherwise>
</c:choose>
<hr>
if-else문과 동일: choose-when-otherwise
//<%-- if-else문 처럼 사용해보기 --%>
<c:set var="num" value="10"/>
<c:choose>
<c:when test="${num % 2 != 0 }">${num } = 홀수</c:when>
<c:otherwise>${num } = 짝수</c:otherwise>
</c:choose>
</body>
</html>
core_choose_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
<form action="core_choose_action.jsp" method="post">
점수입력: <input type="text" name="score">
<button type="submit">전송</button>
</form>
</body>
</html>
core_choose_action.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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
<c:choose>
<!--EL 내장객체인 param객체 이용해 전달값 얻어옴 -->
<c:when test="${!empty(param.score) }"> <!--전달값이 있다면 출력해주세요 -->
<p>입력점수 = ${param.score }</p>
<c:choose> <!--점수에 따른 학점을 grade에 저장 -->
<c:when test="${param.score<=100 && param.score>=90 }">
<c:set var="grade" value="A"/>
</c:when>
<c:when test="${param.score<=89 && param.score>=80 }">
<c:set var="grade" value="B"/>
</c:when>
<c:when test="${param.score<=79 && param.score>=70 }">
<c:set var="grade" value="C"/>
</c:when>
<c:when test="${param.score<=69 && param.score>=60 }">
<c:set var="grade" value="D"/>
</c:when>
<c:otherwise>
<c:set var="grade" value="F"/>
</c:otherwise>
</c:choose>
<p>${param.score }점은 ${grade }학점 입니다.</p>
</c:when>
<c:otherwise> <!--전달값이 없다면 출력해주세요 -->
<p style="color:red">입력페이지에서 점수를 반드시 입력해 주세요.</p>
<a href="core_choose_form.jsp">입력페이지 이동</a>
</c:otherwise>
</c:choose>
</body>
</html>
5) <c:forEach>
core_forEach.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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
for문과 동일
//<%-- forEach 태그 : 태그내용을 반복적으로 포함하기 위한 태그 --%>
//<%-- var속성 : 스코프 속성명을 속성값으로 설정 --%>
//<%-- begin속성 : 스코프 속성값으로 저장된 시작값(Integer)을 속성값으로 설정 --%>
//<%-- end속성 : 스코프 속성값으로 저장된 종료값(Integer)을 속성값으로 설정 --%>
//<%-- step속성 : 스코프 속성값의 증가값(Integer)을 속성값으로 설정 주의(감소값은 없음) --%>
//<%-- => for(i=1; i<=5; i++){}과 같음 --%>
<c:forEach var="i" begin="1" end="5" step="1">
<p>${i }번째 출력되는 내용입니다.</p>
</c:forEach>
<hr />
//<%-- 1~100범위의 정수들의 합계를 계산하여 출력 --%>
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var="tot" value="${tot+i }"/>
</c:forEach>
<p>1~100범위의 정수들의 합계= ${tot }</p>
<hr />
중첩 for문과 동일
//<%-- 구구단을 표(table) 형식으로 출력 --%>
<table>
<c:forEach var="i" begin="1" end="9" step="1">
<tr>
<c:forEach var="j" begin="2" end="9" step="1">
<td width="100">${i } * ${j } = ${i*j}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
core_forEach_one.jsp - model역할
<%@page import="java.util.ArrayList"%>
<%@page import="xyz.itwill.el.Student"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//배열의 요소로 문자열 저장
String[] nameArray={"홍길동","임꺽정","전우치","일지매","장길산"};
request.setAttribute("nameArray", nameArray);
//List객체의 요소로 Student객체 저장
List<Student> studentList = new ArrayList<Student>();
studentList.add(new Student(1000,"홍길동"));
studentList.add(new Student(2000,"임꺽정"));
studentList.add(new Student(3000,"전우치"));
studentList.add(new Student(4000,"일지매"));
studentList.add(new Student(5000,"장길산"));
request.setAttribute("studentList", studentList);
request.getRequestDispatcher("core_forEach_two.jsp").forward(request, response);
%>
core_forEach_two.jsp - view역할
<%@ 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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
<ul>
<li>${nameArray }</li>
</ul>
<hr>
<ul>
<li>${nameArray[0] }</li>
<li>${nameArray[1] }</li>
<li>${nameArray[2] }</li>
<li>${nameArray[3] }</li>
<li>${nameArray[4] }</li>
</ul>
<hr>
일괄처리
//<%-- forEach태그를 이용해 배열 일괄처리 --%>
<ul>
<c:forEach var="i" begin="0" end="4" step="1">
<li>${nameArray[i] }</li>
</c:forEach>
</ul>
<hr>
일괄처리 - 권장
<ul>
//<%-- forEach 태그를 사용하여 스코프 속성값으로 제공된 배열 또는 콜렉션 객체의 요소를
//하나씩 얻어와 반복처리하는 기능을 제공 : 향상된 for 구문과 비슷 - 권장 --%>
//<%-- var 속성: 배열 또는 콜렉션 객체의 요소값을 제공받아 저장하기 위한 스코프 속성명을 속성값으로 설정 --%>
//<%-- items 속성 : 반복처리할 배열 또는 콜렉션 객체를 속성값으로 설정 - EL 사용 --%>
<c:forEach var="name" items="${nameArray }">
<li>${name}</li>
</c:forEach>
</ul>
<hr>
일괄처리 - 권장
//<%-- forEach태그를 이용해 List 일괄처리 --%>
<c:forEach var="student" items="${studentList }">
<div>학번 = ${student.num }, 이름 = ${student.name }</div>
</c:forEach>
</body>
</html>
6) <c:forTokens>
core_forTokens.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>MVC</title>
</head>
<body>
<h1>Core - 흐름 제어 태그</h1>
<hr>
<c:set var="phone" value="010-1234-5678"/>
<p>전화번호 = ${phone }</p>
<hr>
//<%-- forTokens 태그 : 스코프 속성값으로 저장된 문자열(String 객체)을 특정 문자열로
//분리하여 반복 처리하는 태그 --%>
//<%-- items속성 : 분리 차리히기 위한 문자열을 속성값으로 설정 - EL 사용 가능 --%>
//<%-- delims속성 : 문자열을 분리하기 위한 구분자를 속성값으로 설정 --%>
//<%-- var속성 : 분리된 문자열을 하나씩 얻어와 스코프 속성값으로 저장하기 위한 속성명을 속성값으로 설정 --%>
<c:forTokens items="${phone }" delims="-" var="num">
<div>${num }</div>
</c:forTokens>
</body>
</html>
7) <c:import>
- include 액션태그를 쓰면되니 <c:import> 많이 사용은 안함
core_import_source.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>MVC</title>
</head>
<body>
<h1>Core - URL 관리 태그</h1>
<hr>
//<%-- import태그 : 다른 웹프로그램을 요청하여 결과를 응답받아 포함하는 태그 --%>
//<%-- JSP의 include 액션 태그와 유사한 기능 --%>
//<%-- url속성 : 요청 웹프로그램의 URL 주소를 속성값으로 설정 --%>
//<%-- --%>
//<%-- JSP의 include 액션태그는 스레드를 이동시켜 현재서버의 웹프로그램만 요청하여 실행결과를 응답받아 포함하지만,
//JSTL의 import태그는 스레드를 이동시켜 다른 서버의 웹프로그램을 요청하여 실행결과를 응답받아 포함 가능--%>
//<%-- 가상의 브라우저 없이 현재 브라우저에서만 처리결과를 포함시킴 --%>
//<%-- => HTML의 iframe 태그와 유사항 기능을 제공 (브라우저 안 가상의 브라우저를 만들어 요청해서 처리결과를 포함시키는 것) --%>
//<%-- --%>
//<%-- URL 관리 태그에서는 param 태그를 하위태그로 사용하여 값 전달 가능 --%>
//<%--해석) core_import_target.jsp에게 name=홍길동 전달할게요! --%>
<c:import url="core_import_target.jsp">
//<%-- param태그 : 요청 웹프로그램에게 값을 전달하기 위한 태그 --%>
//<%-- => URL 관리 태그의 종속 태그 --%>
//<%-- => URL 관리 태그에 param 태그를 제외한 코드가 존재할 경우 에러 발생 - 단 JSP 주석은 예외 --%>
<c:param name="name" value="홍길동"/>
</c:import>
</body>
</html>
core_import_target.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>MVC</title>
</head>
<body>
<p>core_import_target.jsp 문서의 응답 결과입니다.</p>
<p>${param.name }님, 안녕하세요</p>
</body>
</html>
8) <c:redirect>
- 리다이렉트 이동하는 태그
core_redirect_form.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>MVC</title>
</head>
<body>
<h1>Core - URL 관리 태그</h1>
<hr>
<form action="core_redirect_action.jsp" method="post">
이름 : <input type="text" name="name">
<button type="submit">전송</button>
</form>
</body>
</html>
core_redirect_action.jsp - 출력
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Core - URL 관리 태그</h1>
<hr>
<c:choose>
<c:when test="${!empty(param.name) }"> <%-- param.name의 값이 있다면 --%>
<p>${param.name }님, 안녕하세요.</p>
</c:when>
<c:otherwise>
//<%-- param.name의 값이 없다면 --%>
//<%--redirect태그 : 클라이언트에게 URL 주소를 전달하여 재요청하도록 응답 처리하는 태그 --%>
//<%-- url속성 : 클라이언트에게 전달하여 재요청하기 위한 URL 주소를 속성값으로 설정 --%>
<c:redirect url="core_redirect_form.jsp"/>
</c:otherwise>
</c:choose>
</body>
</html>
9) <c:url>
- 뒤에서는 JSP(뷰)를 WEB-INF폴더에 넣어 클라이언트에서 절대로 요청할 수 없도록 만들 것임
- 즉, 서블릿만 요청하여 서버가 JSP를 찾아 응답할 수 있도록 할 것임
- 그래서 컨트롤러와 뷰를 상대경로를 지정할 경우 요청경로와 응답경로가 달라질 수 있으므로 반대시 절대경로로 표현해야함!!!!
core_url.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>MVC</title>
</head>
<body>
<h1>Core - URL 관리 태그</h1>
<hr>
상대경로
//<%-- 웹 자원을 상대경로로 표현하여 제공 --%>
//<%-- 상대경로 : 현재 요청 웹프로그램의 경로를 기준으로 웹자원의 경로를 표현하는 방법 --%>
//<%-- => [.] : 현재 요청 웹프로그램(생략가능) => [./]현재디렉토리 밑에 [/images]폴더 밑에 [Koala.jpg파일] --%>
//<%-- 문제점) MVC 디자인 패턴을 이용한 JSP Model-2 방식으로 웹프로그램 작성 시
//요청 웹프로그램(컨트롤러)의 경로와 응답 웹프로그램(뷰)의 경로가 다른 경우 404 에러 발생(NotFound-웹자원찾을수없음) --%>
//<%-- 해결법) 웹자원의 경로를 절대경로로 표현하여 제공 --%>
<img src="images/Koala.jpg" width="200">
절대경로
//<%-- 절대경로 : 최상위 디렉토리를 기준으로 웹자원의 경로를 표현하는 방법 --%>
//<%-- CSL(HMTL, CSS, JavaScript 등)에서는 서버의 디렉토리를 최상위 디렉토리로 처리--%>
//<%-- 문제점) 컨텍스트 이름이 변경될 경우 컨텍스트 경로가 변경되어 404 에러 발생 --%>
//<%-- [/mvc] : 컨텍스트경로 - 보통 프로젝트명과 동일한데, 배포 시 컨텍스트 이름을 변경하게되면 컨텍스트 경로도 변경됨 --%>
//<%-- 해결법) request 객체의 메소드를 호출하여 컨텍스트 경로를 반환받아 사용 --%>
//<%-- 같은서버에서 요청할 경우 서버명 생략 가능 --%>
<img src="<http://localhost:8000/mvc/jstl/images/Koala.jpg>" width="200">
<img src="/mvc/jstl/images/Koala.jpg" width="200">
Java코드 - request내장객체 이용
//<%--request.getContextPath() 메소드를 호출하여 컨텍스트 경로를 반환받아 절대경로로 표현 --%>
<img src="<%=request.getContextPath() %>/jstl/images/Koala.jpg" width="200">
EL 표현식 - pageContext내장객체 이용
//<%-- EL 표현식에서 pageContext 내장객체를 사용하여 컨텍스트 경로를 제공받아 절대경로로 표현 --%>
<img src="${pageContext.request.contextPath }/jstl/images/Koala.jpg" width="200">
JSTL - (core태그라이브러리)의 url태그 이용
//<%-- url 태그 : 컨텍스트 경로가 포함된 웹자원의 절대경로를 제공하는 태그 --%>
//<%-- value속성 : 컨텍스트 경로를 제외한 웹자원의 절대경로를 속성값으로 설정 --%>
//<%-- 주의) 자바스크립트와 함께 사용할 경우 가끔 안될 때 있음 그럴 때는 EL태그 이용하기 --%>
<img src="<c:url value="/jstl/images/Koala.jpg"/>" width="200">
</body>
</html>
04. Formatter 태그라이브러리
1) 날짜변환태그
fmt_formatDate.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
//<%-- taglib Directive를 이용하여 JSTL의 Formatter 태그 라이브러리를 JSP 문서에 포함해야만
//커스텀 태그를 제공받아 사용 가능 - prefix 속성값은 [fmt]로 설정 --%>
<%@taglib prefix="fmt" uri="<http://java.sun.com/jsp/jstl/fmt>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Formatter - 날짜와 시간 변환 태그</h1>
<hr>
//<%-- 서버 시스템의 현재 날짜와 시간이 저장된 Date 객체를 생성하여 스코프 속성값으로 저장 --%>
<c:set var="now" value="<%=new Date() %>"></c:set>
//<%-- Date 객체의 toString() 메소드를 호출하여 Date 객체에 저장된 날짜와 시간을 문자열로 제공받아 출력 --%>
<p>now = ${now }</p>
formatDate태그
//<%-- formatDate태그 : Date 객체에 저장된 날짜와 시간을 원하는 형식의 문자열로 변환하여 제공하는 태그 --%>
//<%-- => simpleDateFormat 클래스의 패턴문자 참조 --%>
//<%-- value 속성 : Date 객체를 속성값으로 설정 - EL 사용 가능 --%>
//<%-- type속성 : date(날짜) , time(시간) , both(날짜와 시간) 중 하나를 속성값으로 설정 --%>
//<%-- => 속성값이 [date]인 경우 기본적인 날짜 패턴은 [yyyy.M.d.] 형식의 문자열로 변환되어 제공 --%>
<p>now(날짜) = <fmt:formatDate value="${now}" type="date"/></p>
//<%-- dateStyle속성 : full 또는 short 중 하나를 속성값으로 설정 --%>
//<%-- dateStyle 속성값이 [full]인 경우 [yyyy년 M월 d일 E요일] 형식의 문자열로 변환되어 제공 --%>
//<%-- dateStyle 속성값이 [short]인 경우 [yy.M.d] 형식의 문자열로 변환되어 제공 --%>
<p>now(날짜) = <fmt:formatDate value="${now}" type="date" dateStyle="full"/></p>
<p>now(날짜) = <fmt:formatDate value="${now}" type="date" dateStyle="short"/></p>
//<%-- type속성 : date(날짜) , time(시간) , both(날짜와 시간) 중 하나를 속성값으로 설정 --%>
//<%-- => 속성값이 [time]인 경우 기본적인 날짜 패턴은 [a h:mm:ss] 형식의 문자열로 변환되어 제공 --%>
<p>now(시간) = <fmt:formatDate value="${now}" type="time"/></p>
//<%-- timeStyle속성 : full 또는 short 중 하나를 속성값으로 설정 --%>
//<%-- timeStyle 속성값이 [full]인 경우 [a h시 mm분 ss초 z] 형식의 문자열로 변환되어 제공 --%>
//<%-- timeStyle 속성값이 [short]인 경우 [a h:mm] 형식의 문자열로 변환되어 제공 --%>
<p>now(시간) = <fmt:formatDate value="${now}" type="time" timeStyle="full"/></p>
<p>now(시간) = <fmt:formatDate value="${now}" type="time" timeStyle="short"/></p>
//<%-- type속성 : date(날짜) , time(시간) , both(날짜와 시간) 중 하나를 속성값으로 설정 --%>
//<%-- => 속성값이 [both]인 경우 기본적인 날짜 패턴은 [yyyy.M.d. a h:mm:ss] 형식의 문자열로 변환되어 제공 --%>
<p>now(날짜와 시간) = <fmt:formatDate value="${now}" type="both"/></p>
<p>now(날짜와 시간) = <fmt:formatDate value="${now}" type="both" timeStyle="full" dateStyle="full"/></p>
<p>now(날짜와 시간) = <fmt:formatDate value="${now}" type="both" timeStyle="short" dateStyle="short"/></p>
//<%--pattern속성 : 날짜와 시간을 변환하기 위한 패턴문자가 포함된 문자열을 속성값으로 설정 --%>
//<%-- 참고) simpleDateFormat클래스 패턴문자를 참조해서 만들었으므로 함께 보기 --%>
<p>now(패턴) = <fmt:formatDate value="${now }" pattern="yyyy-MM-dd HH:mm:ss"/>
timeZone태그
//<%-- timeZone태그 : 타임존(TimeZone)을 변경하는 태그 --%>
//<%-- value속성 : 변경할 타임존(대륙/도시)을 속성값으로 설정 --%>
<fmt:timeZone value="Asia/HongHong-">
<p>홍콩의 현재 날짜와 시간 = <fmt:formatDate value="${now }" pattern="yyyy-MM-dd HH:mm:ss"/>
</fmt:timeZone>
</body>
</html>
2) 숫자 변환 태그
fmt_formatNumber.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@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>MVC</title>
</head>
<body>
<h1>Formatter - 숫자 변환 태그</h1>
<hr>
<c:set var="price" value="100000000"/>
<p>가격 = ${price }원</p>
formatNumber태그
//<%-- formatNumber태그 : 숫자값을 원하는 형식의 문자열로 변환하여 제공하는 태그 --%>
//<%-- => DecimalFormat 클래스의 패턴문자 참조 --%>
//<%-- value 속성 : 변환할 숫자값을 속성값으로 설정 - EL 사용 가능 --%>
//<%-- => 속성값으로 숫자가 아닌 문자가 포함된 경우 NumberFormatException 발생 --%>
//<%-- type 속성 : number(숫자) 또는 currency(화폐) 중 하나를 속성값으로 설정 --%>
//<%-- => type 속성을 생략한 경우 [number] 속성값을 기본값으로 사용하여 처리 --%>
//<%-- => type 속성값이 [number]인 경우 숫자 3자리마다 [,]기호를 삽입된 문자열로 변환되어 제공 --%>
<p>가격 =<fmt:formatNumber value="${price }" type="number"/>원</p>
//<%-- => type 속성값이 [currency]인 경우 앞부분에 화폐 단위가 포함되고 숫자 3자리마다 [,]기호를 삽입된 문자열로 변환되어 제공 --%>
//<%-- => 서버 시스템이 한글 윈도우이므로 화폐의 기본단위가 원으로 나오는 것 --%>
<p>가격 =<fmt:formatNumber value="${price }" type="currency"/></p>
//<%-- pattern 속성 : 숫자값을 변환하기 위한 패턴문자가 포함된 문자열을 속성값으로 설정 --%>
<p>가격 =<fmt:formatNumber value="${price }" pattern="$##,###,###,##0.00"/></p>
</body>
</html>
05. Functions 태그라이브러리
- Functions라이브러리는 태그가 아닌 EL 함수로 제공해줌
- 특히 문자열을 조작하는 함수들을 많이 제공해줌
functions.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="<http://java.sun.com/jsp/jstl/core>" %>
//<%-- taglib Directive를 이용하여 JSTL의 Functions 태그 라이브러리를 JSP 문서에 포함해야만
//커스텀 태그를 제공받아 사용 가능 - prefix 속성값은 [fn]로 설정 --%>
<%@taglib prefix="fn" uri="<http://java.sun.com/jsp/jstl/functions>" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MVC</title>
</head>
<body>
<h1>Functions - EL 함수</h1>
<p>(대부분 String클래스의 메소드와 유사)</p>
<hr>
split함수
<c:set var="phone" value="010-1234-5678"/>
<p>전화번호 = ${phone }</p>
<hr>
//<%-- split함수 : 문자열을 구분자로 분리하여 배열로 반환하는 함수 --%>
//<%-- core태그 라이브러리의 forTokens태그와 같은 역할로 출력됨!! --%>
<c:set var="array" value="${fn:split(phone,'-')}"/>
<c:forEach var="num" items="${array }">
<div>${num }</div>
</c:forEach>
<hr>
substring함수
//<%-- substring함수 : 문자열을 시작첨자(포함)와 종료첨자(미포함)를 사용해 분리하여 반환하는 함수 --%>
<div>${fn:substring(phone,0,3) }</div>
<div>${fn:substring(phone,4,8) }</div>
<div>${fn:substring(phone,9,13) }</div>
<hr>
replace함수
//<%-- replace함수 : 원하는 문자열을 검색하여 치환 문자열로 변환하여 반환하는 함수 --%>
<c:set var="content" value="안녕하세요\\n반갑습니다."/>
<div>${content }</div>
<div>${fn:replace(content,'\\\\n','<br>') }</div> //<%-- 역슬래쉬를 문자열로 표현하기 위해서는 반드시 2번 작성 --%>
<hr>
escapeXml함수
- core태그라이브러리의 out태그와 동일한 역할 제공
- 하지만 out태그가 더 좋기 때문에 권장
<c:set var="html" value="<font size='7' color='red'>안녕하세요.</font>"/>
//<%-- HTML 태그가 포함된 문자열이 저장된 속성값을 EL로 제공받아 출력할 경우 HTML 태그가 적용된 문자열로 출력 --%>
<div>${html }</div>
//<%-- HTML 태그가 포함된 문자열이 저장된 속성값을 out태그로 제공받아 출력할 경우 HTML 태그도 문자열로 적용되어 출력 --%>
<div><c:out value="${html }"/></div>
//<%-- escapeXml 함수 : 속성값으로 제공된 문자열에 태그 관련 문자가 있는 경우 회피문자로 변환하여 반환하는 함수 --%>
//<%-- HTML 태그가 포함된 문자열이 저장된 속성값을 escapeXml 함수로 제공받아 출력할 경우
//HTML 태그도 문자열로 적용되어 출력 --%>
<div>${fn:escapeXml(html) }</div>
</body>
</html>
'jsp' 카테고리의 다른 글
[jsp] 30. JSP model2 (MVC패턴) (0) | 2024.07.18 |
---|---|
[jsp] 29. 회원정보 관리 프로그램(MVC) (0) | 2024.07.18 |
[jsp] 27. EL 커스텀태그 @taglib (0) | 2024.07.17 |
[jsp] 26. filter클래스 만드는법 (context-param VS init-param) (0) | 2024.07.16 |
[jsp] 25. EL의 내장객체 (0) | 2024.07.16 |