2020년 12월 23일
업데이트:
첫 시작 화면
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL / JSTL</title>
</head>
<body>
<h3>EL</h3>
<ul>
<li><a href="01_el/el.do">01.EL이란?</a>
<li><a href="views/01_el/02_elParam.jsp">02.EL - param</a>
<li><a href="01_el/elObject.do">03.EL - Object</a>
<li><a href="views/01_el/04_elOperation.jsp">04.el - operation</a>
</ul>
<hr>
<h3>JSP Action Tag</h3>
<ul>
<li><a href="views/02_action/01_action.jsp">JSP Action Tag - include</a></li>
</ul>
<hr>
<h3>JSTL</h3>
<ul>
<li><a href="views/03_jstl/01_jstl.jsp">01.JSTL - core(기초)</a></li>
<li><a href="views/03_jstl/02_jstl_core_if.jsp">02.JSTL - core(if)</a></li>
<li><a href="views/03_jstl/03_jstl_core_choose.jsp">03.JSTL - core(choose)</a></li>
<li><a href="views/03_jstl/04_jstl_core_forEach.jsp">04.JSTL - core(forEach-1)</a></li>
<li><a href="views/03_jstl/05_jstl_core_forEach2.jsp">05.JSTL - core(forEach-2)</a></li>
<li><a href="views/03_jstl/06_jstl_core_forTokens.jsp">06.JSTL - core(forTokens)</a></li>
<li><a href="views/03_jstl/07_jstl_core_url.jsp">07.JSTL - core(url)</a></li>
<li><a href="views/03_jstl/08_jstl_core_redirect.jsp">08.JSTL - core(redirect)</a></li>
<li><a href="views/03_jstl/09_jstl_fmt.jsp">09.JSTL - fmt</a></li>
<li><a href="views/03_jstl/10_jstl_fn.jsp">10.JSTL - fn</a></li>
</ul>
</body>
</html>
JSP Action Tag 란?
기존의 JSP 문법을 확장하는 메커니즘을 제공하는 태그로,
웹 브라우저에서 실행되는 것이 아니라,
웹 컨테이너에서 실행되고 결과만 브라우저로 보냄.
JSP 페이지에서 바로 사용 가능하고
태그 앞에 jsp: 접두어가 붙음
03_actionInclude.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>정적, 동적 include</title>
</head>
<body>
<a href ="02_scriptingInclude.jsp">
1) Scripting 방식의 include (정적 include)
</a>
<br>
<a href="03_actionInclude.jsp">
1) JSP Action Tag 방식의 include (동적 include)
</a>
</body>
</html>
정적 include 방식
현재 페이지에 포함되어지는 jsp 파일이 컴파일 전에 지정된 위치에 삽입되어 하나의 거대한 jsp 파일로 컴파일 됨.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>정적 include 방식</h1>
<pre>
현재 페이지에 포함되어지는 jsp 파일이 컴파일 전에 지정된 위치에 삽입되어
하나의 거대한 jsp 파일로 컴파일 됨.
특징 : 추가된 페이지에 선언된 변수를 그대로 사용할 수 있음.
문제점 : 현재 페이지와 추가된 페이지가 동일한 이름의 변수를 가질 수 없다.(변수명 충돌)
인터넷이 느리면 정적 include이 더 좋음.
</pre>
<%@include file="test.jsp" %><br><br>
현재 년도 : <%=year %>
<%-- <% String year = "2021"; %>
Duplicate local variable year
== 변수명 중복 에러
--%>
</body>
</html>
동적 include
현재 페이지에 삽입되는 페이지가 컴파일 이전이 아닌, 현재 페이지가 요청되어 출력되는 시점에 하나로 합쳐지는 방식.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>동적 Include</title>
</head>
<body>
<h3>JSP Action Tag란?</h3>
<pre>
JSP Action 태그는 XML 기술을 이용하여
기존의 JSP 문법을 확장하는 메커니즘을 제공하는 태그로,
웹 브라우저에서 실행되는 것이 아니라,
웹 컨테이너에서 실행되고 결과만 브라우저로 보냄.
JSP 페이지에서 바로 사용 가능하고
태그 앞에 jsp: 접두어가 붙음
<%--
<jsp:include page="jsp파일 경로"></jsp:include>
--%>
</pre>
<h3>동적 include</h3>
<pre>
현재 페이지에 삽입되는 페이지가 컴파일 이전이 아닌,
현재 페이지가 요청되어 출력되는 시점에 하나로 합쳐지는 방식.
특징 : 정적 include에서의 문제점인 변수명 중복이 발생하지 않는다.
(변수명 중복 검사는 컴파일 시에 수행됨.)
+ 현재 페이지에서 삽입되는 페이지로 데이터 전달이 가능함.
</pre>
<%-- 전달하고자 하는 값을 작성할 수 있음. --%>
<jsp:include page="test.jsp">
<jsp:param name="age" value="30"/>
</jsp:include>
</body>
</html>
test.jsp
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String year = String.format("%tY",new Date());
%>
<p>
2005 - <%=year %> 이 웹페이지의 저작권은 데브보령에게 있습니다.
</p>
<h1>age:${param.age }</h1>
JSTL이란?
Jsp Standard Tag Library
JSP에서 사용하는 커스텀 태그로,
공통으로 사용하는 코드의 집합을 사용하기 쉽게
태그화하여 표준으로 제공한 것을 말한다.
Library 등록 방법
1) https://tomcat.apache.org/download-taglibs.cgi 접속
2) Standard-1.2.5 -> jar files -> Impl,Spec,El 다운로드
3) WebContent/WEB-INF/lib 에 추가
jstl.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
<h2>JSTL이란?</h2>
Jsp Standard Tag Library<br>
JSP에서 사용하는 커스텀 태그로, <br>
공통으로 사용하는 코드의 집합을 사용하기 쉽게<br>
태그화하여 표준으로 제공한 것을 말한다.
<form action="01_jstl_core_basic.jsp">
첫번째 수 : <input type="text" name="num1" /><br/>
두번째 수 : <input type="text" name="num2" /><br/>
<button type="submit">확인</button>
</form>
</body>
</html>
1. 변수의 선언 - <c:set>
<%@ 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 - core tag</title>
</head>
<body>
<h3>라이브러리 등록 방법</h3>
1) https://tomcat.apache.org/download-taglibs.cgi 접속<br>
2) Standard-1.2.5 -> jar files -> 4개 다 다운로드<br>
3) WebContent/WEB-INF/lib 에 추가<br>
<hr>
<h3>JSTL 선언 방법</h3>
<pre>
JSTL을 사용 하고자하는 JSP 페이지의 상단 page 지시자 아래에 taglib 지시자를 사용.
<%@ taglib prefix="사용하고자 하는 접두사" uri="tld 파일상의 uri" %>
prefix : 접두사. 다른 태그와 구별할 수 있는 namespace를 제공함.
uri : 실제 웹상주소가 아니라, 태그라이브러리를 나타내는 식별자임.
tlb파일상의 uri값을 가리키며, 이 지시자를 통해 작성한 태그이름과 매칭되는 자바코드를 찾음.
* tld(Tag Library Descriptor) 파일 : 커스텀 태그 정보를 갖고 있는 라이브러리 파일.
* uri : (Uniform Resource Identifier) : 자원을 나타내는 유일한 주소
</pre>
<hr>
<h3>JSTL core Library</h3>
<p>
<h4>1. 변수의 선언 - <c:set> </h4>
<pre>
- 변수를 선언하고 초기값을 대입하는 기능을 가진 태그
- 변수를 선언할 때 scope를 지정할 수 있음. (기본값 page)
- 사용법
1) 변수 타입을 별도로 선언하지 않는다.
2) c:set 태그로 선언한 변수를 사용할 경우 EL로 사용해야 한다.
3) c:set으로 선언된 변수는 EL 구문에서는 사용할 수 있지만 scriptlet 내에서는 사용할 수 없다.
</pre>
<c:set var="car" value="람보르기니" />
<h3>${car }</h3>
<!-- 전달된 파라미터 두개를 c:set을 이용하여 변수에 저장 -->
<c:set var="n1" value="${param.num1 }"/>
<c:set var="n2" value="${param.num2 }" scope="request"/>
<c:set var="result" value="${n1*n2}" scope="session"/>
${n1 }*${n2 }=${result }<br>
<!-- 정확하게 작성하는 법 -->
${pageScope.n1 }*${requestScope.n2}=${sessionScope.result }<br>
</p>
<hr>
2. 변수의 삭제 - <c:remove>
<p>
<h4> 2. 변수의 삭제 - <c:remove> </h4>
<c:set var="result" value="9999" scope="request"/>
[삭제전]<br>
request : ${requestScope.result }<br>
session : ${sessionScope.result }<br>
1)모든 스코프에서 삭제<br>
<%-- <c:remove var="result"/> --%>
2) 특정 스코프에서 삭제 <br>
<c:remove var="result" scope="request"/>
[삭제후]<br>
request : ${requestScope.result }<br>
session : ${sessionScope.result }<br>
</p>
<hr>
3. 변수의 출력 - <c:out>
<p>
<h4> 3. 변수의 출력 - <c:out> </h4>
<c:out> 태그는 데이터를 출력할 때 사용하는 태그<br>
<, >, & 특수 문자를 자동으로 이스케이프 시퀀스(escape sequance)로 바꿔줌.<br>
<pre>
* 특수 문자 이스케이프 시퀀스(escape sequance)
< <
> >
& &
</pre>
<c:out value="<h3>c:out 테스트 중 입니다.</h4>"/>
<c:out value="<h3>c:out 테스트 중 입니다.</h4>" escapeXml="false"/>
</p>
</body>
</html>
4. <c:if> 태그
- Java의 if 문과 비슷한 역할을 하는 태그.
- <c:if> 태그에서 조건식은 test라는 속성의 값으로 지정해야 함
이 때 조건식은 반드시 EL 형식으로 기술해야 한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL - core tag(if)</title>
</head>
<body>
<h3><c:if> 태그 </h3>
- Java의 if 문과 비슷한 역할을 하는 태그.<br>
- <c:if> 태그에서 조건식은 test라는 속성의 값으로 지정해야 함<br>
이 때 조건식은 반드시 EL 형식으로 기술해야 한다.
<form action="02_jstl_core_ifEnd.jsp">
첫번째 수 : <input type="text" name="num1" /><br/>
두번째 수 : <input type="text" name="num2" /><br/>
<button type="submit">확인</button>
</form>
</body>
</html>
<%@ 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 - core tag(if)</title>
</head>
<body>
<h3><c:if> 태그 </h3>
- Java의 if 문과 비슷한 역할을 하는 태그.<br>
- <c:if> 태그에서 조건식은 test라는 속성의 값으로 지정해야 함<br>
이 때 조건식은 반드시 EL 형식으로 기술<br>
- else문이 존제하지 않는다.<br>
<hr>
<!-- input태그의 값(파라미터)은 문자열의 형태를 띄고 있으므로
문자열 크기 비교가 일어남. -->
<c:set var="n1" value="${param.num1 }"/>
<c:set var="n2" value="${param.num2 }"/>
<c:if test="${n1 > n2 }">
${n1 }은 ${n2 }보다 큽니다. -> 문자열 비교<br>
</c:if>
<c:if test="${Integer.parseInt(n1)>Integer.parseInt(n2) }">
${n1 }은 ${n2 }보다 큽니다. -> 숫자 비교
</c:if>
<c:if test="${Integer.parseInt(n1)<Integer.parseInt(n2) }">
${n1 }은 ${n2 }보다 작습니다. -> 숫자 비교
</c:if>
<c:if test="${Integer.parseInt(n1)==Integer.parseInt(n2) }">
${n1 }은 ${n2 }는 같습니다. -> 숫자 비교
</c:if>
</body>
</html>
5. <c:choose> 태그
- Java의 if-else if-else, switch 문과 비슷한 역할을 하는 태그.
- <c:when>, <c:otherwise> 태그와 함께 사용되는데,
각각 switch 문의 case, default 절과 비슷한 역할을 함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL - core tag(choose)</title>
</head>
<body>
<h3><c:choose> 태그 </h3>
- Java의 if-else if-else, switch 문과 비슷한 역할을 하는 태그.
- <c:when>, <c:otherwise> 태그와 함께 사용되는데,
각각 switch 문의 case, default 절과 비슷한 역할을 함.
<form name="genderFrm" action="03_jstl_core_chooseEnd.jsp">
<h2>경품뽑기</h2>
숫자를 입력하세요 : <input type="number" name="num1"><br>
<button type="submit">확인</button>
</form>
</body>
</html>
<%@ 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 - core tag(choose)</title>
</head>
<body>
<h3><c:choose> 태그 </h3>
<c:choose>
<c:when test="${ Integer.parseInt(param.num1) == 1}">
🎁🎉 최신형 컴퓨터를 뽑으셨습니다 👏👏👏
</c:when>
<c:when test="${ Integer.parseInt(param.num1) == 2}">
🎁🎉 최신형 스마트폰을 뽑으셨습니다 👏👏👏
</c:when>
<c:when test="${ Integer.parseInt(param.num1) == 3}">
🎁🎉 백화점 상품권을 뽑으셨습니다 👏👏👏
</c:when>
<c:when test="${ Integer.parseInt(param.num1) < 0}">
잘못 입력하셨습니다..
</c:when>
<c:otherwise>
💥 꽝 💥
</c:otherwise>
</c:choose>
</body>
</html>
6. <c:forEach> 태그 -1
- Java의 for문에 해당하는 기능을 제공하는 태그
- forEach는 여러가지 속성이 사용됨
<%@ 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 - core tag(forEach)</title>
</head>
<body>
<h3><c:forEach> 태그 </h3>
- Java의 for문에 해당하는 기능을 제공하는 태그
- forEach는 여러가지 속성이 사용됨
<pre>
var : 현재 반복 횟수에 해당하는 변수의 이름
begin : 반복이 시작할 요소 번호 (0 … n)
end : 반복이 끝나는 요소 번호
step : 반복 시 증가할 수(기본값 1, 음수로 지정 불가)
items : 반복할 객체 명 (Collection 객체)
varStatus : 현재 반복에 해당하는 객체의 요소
</pre>
<h3>기본 사용법</h3>
<c:forEach var="i" begin="1" end="6">
<h<c:out value="${i}" />>c:out으로 반복문 사용</h<c:out value="${i}" />>
<h${i}>EL로 반복문 사용 </h${i}>
<p>-------------------------------------------</p>
</c:forEach>
<hr>
<h3>step 속성</h3>
step속성의 값은 0보다 작거나 같을 수 없음.
<c:forEach var="i" begin="1" end="6" step="2">
<h${i}>건너뛰기 ${i}</h${i}>
</c:forEach>
<hr>
<h3>역순</h3>
<c:forEach var="k" begin="1" end="6">
<h${7-k}>역순 ${7-k}</h${7-k}>
</c:forEach>
</body>
</html>
7. <c:forEach> 태그 - 컬렉션 객체 선언 및 출력
<%@ 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 - core tag(forEach)</title>
</head>
<body>
<!--
EL 3.0 버전 이상을 지원하는 was에서만 EL컬렉션객체 사용 가능
톰캣 8.0부터 EL 3.0을 지원함.
-->
<c:set var="myList" value='${["A","B","C","D","E"]}' scope="request" />
<c:set var="mySet" value='${{"A","B","C","B","A"}}' scope="request" />
<c:set var="myMap" value='${{"name":"홍길동", "job":"학생", "age":20}}' scope="request" />
<!-- Map객체의 키값은 문자열로 전달함. -->
<jsp:forward page="05_jstl_core_forEach2End.jsp"/>
<!-- 현재 페이지에서 선언된 요청 정보(request scope)를
page 속성에 작성된 주소로 위임하겠다.
-->
</body>
</html>
<%@ 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 - core tag(forEach)</title>
</head>
<body>
<h2>컬렉션 객체 선언 및 출력</h2>
<h3>varStatus 속성</h3>
varStatus는 다음과 같은 속성을 가지고 있음
<pre>
current : 현재 반복 횟수 또는 현재 반복 접근한 값
index : 반복 라운드의 제로 기반(zero-based) 인덱스 (0 … n)
count : 반복 라운드의 1 기반(one-based) 인덱스 (1 … n)
first : 현재 라운드가 반복을 통한 첫 번째임을 의미
last :현재 라운드가 반복을 통한 마지막 번째임을 의미
</pre>
<h3>List</h3>
<c:forEach var="item" items="${myList }" varStatus="vs" >
현재 값 : ${vs.current }<br>
index : ${vs.index }<br>
count : ${vs.count }<br>
first: ${vs.first }<br>
last: ${vs.last }<br>
-----------------------------------<br>
</c:forEach>
<hr>
<h3>Set</h3>
<c:forEach var="item" items="${mySet }" varStatus="vs">
${item }
<!-- 마지막이 아닐 때 , 를 출력하라는 if문 -->
<c:if test="${!vs.last }">
,
</c:if>
</c:forEach>
<hr>
<h3>Map</h3>
<c:forEach var="item" items="${myMap }">
${item.key }=${item.value }<br>
</c:forEach>
<hr>
</body>
</html>
공유하기
Twitter Google+ LinkedIn
댓글남기기