01. JSTL구성 라이브러리 개념
JSTL(Java Standard Tag Library)
- JSP 문서에서 많이 사용되는 EL 함수와 커스텀 태그를 제공하기 위한 라이브러리
- JSP 2.0 에 포함되어있음
- 일반적으로 필요한 기능의 태그라이브러리를 미리 구현함
- JSP 문서에서 JSTL이 제공하는 EL 함수 또는 커스텀 태그를 사용하기 위해서는 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리 : https://tomcat.apache.org 사이트 참조
JSTL 다운받고 프로젝트에 빌드처리
step1. 아파치톰캣 사이트 접속
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 |