ㅁ JSP를 이루는 구성인자
(1) 스크립트 원소
- 스크립틀릿(<% %>) : 자바코드 작성 (변수 선언, 제어문 등)
- 표현식(<%= %>) : 자바 값 출력
- 선언식(<%! %>) : 메소드 및 멤버변수 정의
(2) 지시어
- page 지시어 : jsp에 대한 정보 기술
- include 지시어 : 다른 jsp를 포함시키는 기술
- taglib 지시어 : 외부 라이브러리를 해당 jsp에서 사용할 수 있게 하는 기술
(3) 액션 태그
- xml 태그 방식을 이용해서 기존의 jsp 문법을 확장하는 기술
- 표준 액션 태그 : 별도의 라이브러리 필요없이 바로 작성 가능. 태그명에 jsp: 접두어가 붙는다.
- 커스텀 액션 태그 : 별도의 라이브러리 등록을 통해 사용 가능. 태그명에 라이브러리 종류별 접두어가 붙는다.
ㅁ index.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>
<h3>EL</h3>
<a href="<%= request.getContextPath() %>/el.do">1) EL 기본 구문</a> <br>
<a href="<%= request.getContextPath() %>/elOperator.do">2) EL 연산자</a>
<h3>JSP Action Tag</h3>
<h4>1. 표준 액션 태그 (Standard Action Tag)</h4>
<a href="<%= request.getContextPath() %>/02_standardAction/include.jsp">1) jsp:include</a> <br>
<a href=""></a>
</body>
</html>
ㅁ webapp 폴더에 02_standardAction 폴더를 만들고 include.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>
<h3>jsp:include</h3>
<p>또 다른 페이지를 포함하고자 할 때 사용하는 태그</p>
</body>
</html>
- 이때까지 써왔던 include 지시어 대신 표준 액션 태그로도 다른 페이지를 포함시킬 수 있다.
ㅁ webapp/02_standardAction에 footer.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>
<%
String currentYear = new java.text.SimpleDateFormat("yyyy").format(new java.util.Date());
%>
<div style="border: 1px solid gray; padding: 10px;">
Copyright ⓒ 2000-<%= currentYear %> GooDee Academy. All rights reserved.
<br>
</div>
</body>
</html>
- 풀클래스 명을 쓰면 import할 필요 없다.
ㅁ include.jsp에서 footer.jsp를 include 한다.
<%@ 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>
<h3>jsp:include</h3>
<p>또 다른 페이지를 포함하고자 할 때 사용하는 태그</p>
<h4>기존 include 지시어 방식 (정적 include 방식-컴파일 시점에 포함되어서)</h4>
<%@ include file="footer.jsp" %>
<br>
특징 : include하는 jsp 상에 선언된 변수를 현재 이 페이지에서도 사용 가능 (include 선언 이후 코드에서만 사용 가능) <br>
currentYear : <%= currentYear %>
단, 현재 이 페이지에서 동일한 이름의 변수를 재선언할 수 없다. 변수명 중복이라서. <br>
<%-- int currentYear = 2024; --%>
</body>
</html>
- 기존 include 지시어 방식은 컴파일 시점에 포함되어서 정적 include 방식이라고 한다.
- include 선언 이전의 코드에서는 포함시키는 jsp 상에 선언된 변수를 쓸 수 없다.
- 동일한 이름의 변수를 재선언할 수 없다. 변수명이 중복된다.
ㅁ include를 표준 액션 태그로 해보기
<%@ 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>
<h3>jsp:include</h3>
<p>또 다른 페이지를 포함하고자 할 때 사용하는 태그</p>
<%--
<h4>기존 include 지시어 방식 (정적 include 방식-컴파일 시점에 포함되어서)</h4>
<%@ include file="footer.jsp" %>
<br>
특징 : include하는 jsp 상에 선언된 변수를 현재 이 페이지에서도 사용 가능 (include 선언 이후 코드에서만 사용 가능) <br>
currentYear : <%= currentYear %>
단, 현재 이 페이지에서 동일한 이름의 변수를 재선할 수 없다. 변수명 중복이라서. <br>
int currentYear = 2024;
--%>
<h4>include 표준액션태그 방식 (동적 include 방식)</h4>
<jsp:include page="footer.jsp"></jsp:include>
</body>
</html>
- 정적 incldue 방식은 컴파일시 포함된다면, 동적 include 방식은 runtime시 포함되는 형태다.
- 액션 태그 사용시 유의사항 : 반드시 종료태그가 존재해야 한다.
- 시작 태그와 종료 태그 사이에 구문을 더 작성할 수도 있다.
- 시작 태그와 종료 태그 사이에 작성할 구문이 없다면 시작태그에 종료태그까지 같이 기술할 수 있다.
<jsp:include page="footer.jsp"></jsp:include>
<jsp:include page="footer.jsp"/>
- 시작태그 마지막에 슬래시("/")를 작성한다.
- 표준액션태그 방식으로도 include가 잘 된다.
ㅁ 표준액션태그 방식 특징
<%@ 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>
<h3>jsp:include</h3>
<p>또 다른 페이지를 포함하고자 할 때 사용하는 태그</p>
<%--
<h4>기존 include 지시어 방식 (정적 include 방식-컴파일 시점에 포함되어서)</h4>
<%@ include file="footer.jsp" %>
<br>
특징 : include하는 jsp 상에 선언된 변수를 현재 이 페이지에서도 사용 가능 (include 선언 이후 코드에서만 사용 가능) <br>
currentYear : <%= currentYear %>
단, 현재 이 페이지에서 동일한 이름의 변수를 재선할 수 없다. 변수명 중복이라서. <br>
int currentYear = 2024;
--%>
<h4>include 표준액션태그 방식 (동적 include 방식)</h4>
<jsp:include page="footer.jsp"></jsp:include>
<br><br><br>
특징1 : include하는 jsp 상에 선언된 변수는 현재 페이지에서 사용 불가능 (따라서 재선언 가능) <br><br>
<%-- currentYear : <%= currentYear %> 오류발생 --%>
특징2 : include시 해당 jsp로 값을 전달해서 동적으로 표현할 수 있다. <br><br>
<jsp:include page="footer.jsp">
<jsp:param name="test" value="hello"/>
</jsp:include> <br>
<jsp:include page="footer.jsp">
<jsp:param name="test" value="good bye"/>
</jsp:include>
</body>
</html>
※ include 표준액션태그 방식의 특징
- 동적 include 방식이다.
- include하는 jsp 상에 선언된 변수는 현재 페이지에서 사용 불가능하다. 따라서 재선언이 가능하다.
- include시 해당 jsp로 값을 전달해서 동적으로 표현할 수 있다.
- jsp:param으로 값을 넘길 때는 반드시 key-value 세트로 보내야 한다.
- jsp:param도 표준 액션 태그라 닫는 태그가 반드시 필요하다.
- 똑같은 footer.jsp가 포함이 되는데 일부 영역만 데이터를 다르게 처리할 수 있다.
포함할 페이지를 동적으로 매번 다르게 표현할 수 있다.
- 메뉴바 등에서 현재 선택된 카테고리를 표시하거나 강조하기 위해 사용할 수 있다.
- 그런데 전달값이 한글이면 깨져보인다.
한글 데이터 전달시에는 인코딩 설정을 해야 한다.
<jsp:include page="footer.jsp">
<jsp:param name="test" value="하하"/>
</jsp:include> <br>
<% request.setCharacterEncoding("utf-8"); %>
<jsp:include page="footer.jsp">
<jsp:param name="test" value="하하"/>
</jsp:include>
ㅁ 2. jsp:forward
- 아래는 index.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>
<h3>EL</h3>
<a href="<%= request.getContextPath() %>/el.do">1) EL 기본 구문</a> <br>
<a href="<%= request.getContextPath() %>/elOperator.do">2) EL 연산자</a>
<h3>JSP Action Tag</h3>
<h4>1. 표준 액션 태그 (Standard Action Tag)</h4>
<a href="<%= request.getContextPath() %>/02_standardAction/include.jsp">1) jsp:include</a> <br>
<a href="<%= request.getContextPath() %>/02_standardAction/forward.jsp">2) jsp:forward</a>
</body>
</html>
- 아래는 forward.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>
<h3>jsp:forward</h3>
<p>jsp에서 또다른 jsp로 바로 포워딩하고자 할 때</p>
<% if(10 < 3) { %>
<jsp:forward page="/01_el/elBasic.jsp"/>
<% } else { %>
<jsp:forward page="/02_standardAction/footer.jsp">
<jsp:param name="test" value="hello world"/>
</jsp:forward>
<% } %>
<jsp:forward page="/01_el/elBasic.jsp"/>
</body>
</html>
- 처음 index.jsp에서 클릭한 링크는 forward.jsp지만 실제 로드되는 페이지는 footer.jsp다.
주소창에는 이동한 페이지의 경로는 숨겨진다.
========================================================================
ㅁ 커스텀 액션 태그
- 표준액션태그보다 커스텀액션태그가 더 중요하다. 많이 쓰게될 것이다.
- 대표적으로 많이 쓰는 라이브러리가 JSTL이다.
ㅁ JSTL
- JSP Standard Tag Library
- 자주 쓰는 자바 코드를 보다 쉽게 사용할 수 있도록 태그화 시킨 대표적인 라이브러리
- 라이브러리 연동을 해야 한다.
jstl 라이브러리(jar)를 다운받아서 lib 폴더에 넣는다.
그런데 lib 폴더에 넣는다고 끝이 아니고, jstl을 작성하고자 하는 jsp 파일에 taglib 지시어를 이용해서 라이브러리 연동하는 구문을 작성해야 한다.
ㅁ jstl 라이브러리 다운
- 아파치 톰캣 사이트를 간다
- impl, spec 두 jar 파일을 다운받는다.
- 바로 lib 폴더에 넣어도 되지만, 자주 쓸거라 dev 폴더에 넣어놓는다.
- WEB-INF/lib에도 붙여놓는다.
ㅁ 대표적인 라이브러리 종류
- jstl 내에서도 라이브러리 종류가 나뉜다. 태그를 제공하는 라이브러리들이다.
- Core Library : 변수와 제어문 등의 로직과 관련된 문법 제공 (매우 중요)
- Formatting Library : 숫자, 날짜 및 시간 데이터의 출력 형식관련 문법 제공
- Function Library : EL 구문 내에서 사용 가능한 함수 제공
- JSTL은 EL 구문과 함께 쓰는거라 세트로 불려진다. EL/JSTL
ㅁ Core Library
- 아래는 index.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>
<h3>EL</h3>
<a href="<%= request.getContextPath() %>/el.do">1) EL 기본 구문</a> <br>
<a href="<%= request.getContextPath() %>/elOperator.do">2) EL 연산자</a>
<h3>JSP Action Tag</h3>
<h4>1. 표준 액션 태그 (Standard Action Tag)</h4>
<a href="<%= request.getContextPath() %>/02_standardAction/include.jsp">1) jsp:include</a> <br>
<a href="<%= request.getContextPath() %>/02_standardAction/forward.jsp">2) jsp:forward</a>
<h4>2. 커스텀 액션 태그 (JSTL)</h4>
<a href="${ pageContext.request.contextPath }/03_customAction/core.jsp">1) JSTL Core Library ****</a><br>
<a href="">2) JSTL Formatting Library</a><br>
<a href="">3) JSTL Function Library</a><br>
</body>
</html>
- pageContext는 JSP에서 현재 페이지의 모든 정보를 담고 있는 객체입니다. JSP 컨테이너가 페이지가 실행되는 동안 자동으로 제공하는 객체 중 하나로, 페이지 범위의 여러 속성에 접근할 수 있게 해줍니다.
- 아래는 core.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>
<h2>JSTL Core Library</h2>
<h3>1. 변수(== 속성 == JSP 내장객체 내의 attribute)</h3>
</body>
</html>
- taglib 지시어에는 항상 2개의 속성을 기술한다. prefix와 uri.
- core 라이브러리는 접두어로 보통 c:을 붙인다.
- jsp 파일 상단에 core 라이브러리를 쓰겠다는 선언을 한다. 접두어는 c:이다.
ㅁ <c:set>
- JSP 내장객체에 데이터(attribute)를 담는(binding) 구문.
- 변수를 선언 및 초기화하는 구문이라고 생각해도 된다.
<c:set var="" value="" [scope=""]/>
<c:set var="" [scope=""]>value값</c:set>
- var : 바인딩할 Attribute명 (변수명)
- value : 바인딩할 데이터값
- scope : 해당 key-value 세트를 어느 영역(page, request, session, application)에 저장시킬 건지 지정.
생략시 기본값은 page 영역이다. 현재 이 페이지에서만 쓸 수 있다.
- 내부적으로 scope로 지정한 JSP내장객체.setAttribute("var명", value값);이 실행된다.
- <c:set>으로 담았으면 반드시 EL 구문으로 JSP 내장객체에 담긴 attribute를 꺼내서 출력해야 한다. (표현식 불가)
${ var명 } => value 값 출력
ㅁ <c:set>
<%@ 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>
<h2>JSTL Core Library</h2>
<h3>1. 변수(== 속성 == JSP 내장객체 내의 attribute)</h3>
<c:set var="num1">10</c:set> <!-- pageContext.setAttribute("num1", 10); -->
<c:set var="num2" value="20" scope="request"/> <!-- request.setAttribute("num2", 20); -->
num1값 : ${ num1 } 또는 ${ pageScope.num1 } <br>
num2값 : ${ num2 } 또는 ${ requestScope.num2 } <br>
<br><br>
<c:set var="result" value="${ num1 + num2 }" scope="session"></c:set>
result값 : ${ result } 또는 ${ sessionScope.result } <br>
<br><br>
<!-- 앞으로 자주 사용할 c:set 구문 -->
<c:set var="contextPath" value="${ pageContext.request.contextPath }"></c:set>
contextPath값 : ${ contextPath }
</body>
</html>
- 태그를 작성했지만 내부적으로는 자바 코드가 실행된다. 자바코드를 안써도 된다.
- 종료태그 반드시 쓰기!
ㅁ <c:remove>
- 바인딩 되어있는 Attribute 삭제하는 구문
<c:remove var="" [scope=""]/>
- var : 삭제할 attribute 명
- scope : 삭제시킬 영역. 생략시 전체 scope에서 다 삭제한다.
- 내부적으로 scope로 지정한 JSP내장객체.removeAttribute("var명"); 이런 자바코드가 실행된다.
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<h3>1. 변수(== 속성 == JSP 내장객체 내의 attribute)</h3>
<c:set var="num1">10</c:set> <!-- pageContext.setAttribute("num1", 10); -->
<c:set var="num2" value="20" scope="request"/> <!-- request.setAttribute("num2", 20); -->
num1값 : ${ num1 } 또는 ${ pageScope.num1 } <br>
num2값 : ${ num2 } 또는 ${ requestScope.num2 } <br>
<c:set var="result" value="${ num1 + num2 }" scope="session"></c:set>
result값 : ${ result } 또는 ${ sessionScope.result } <br>
<!-- 앞으로 자주 사용할 c:set 구문 -->
<c:set var="contextPath" value="${ pageContext.request.contextPath }"></c:set>
contextPath값 : ${ contextPath }
<br><br>
<c:remove var="result"></c:remove>
result값 : ${ result }
</body>
</html>
ㅁ <c:out>
- 특정 데이터를 출력하는 구문
<c:out value="" [default=""] [escapeXml=""]/>
- value : 출력할 데이터
- default : 출력할 데이터가 존재하지 않을 경우 출력시킬 기본값
- escapeXml : 출력할 데이터에 html태그가 존재할 경우 태그로써 해석시킬 껀지 여부
(true가 기본값. true면 태그로 해석안되고 문자열로 취급됨. false면 태그로 해석됨)
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<h3>1. 변수(== 속성 == JSP 내장객체 내의 attribute)</h3>
<c:set var="num1">10</c:set> <!-- pageContext.setAttribute("num1", 10); -->
<c:set var="num2" value="20" scope="request"/> <!-- request.setAttribute("num2", 20); -->
num1값 : ${ num1 } 또는 ${ pageScope.num1 } <br>
num2값 : ${ num2 } 또는 ${ requestScope.num2 } <br>
<c:set var="result" value="${ num1 + num2 }" scope="session"></c:set>
result값 : ${ result } 또는 ${ sessionScope.result } <br>
<!-- 앞으로 자주 사용할 c:set 구문 -->
<c:set var="contextPath" value="${ pageContext.request.contextPath }"></c:set>
contextPath값 : ${ contextPath }
<br><br>
<c:remove var="result"></c:remove>
result값 : ${ result }
<br><br><br>
result값 : <c:out value="${ result }"/> <br>
result값 : <c:out value="${ result }" default="없음"/> <br><br>
<c:set var="outTest" value="<b>출력테스트</b>"></c:set>
outTest값 : <c:out value="${ outTest }"/> <br>
outTest값 : <c:out value="${ outTest }" escapeXml="false"/> <br>
</body>
</html>
====================================================================================
ㅁ 2. 조건문
ㅁ <c:if>
- 자바에서의 단일 if문을 대체하는 구문
<c:if test="조건식">
해당 조건이 true일 경우 실행 또는 출력할 구문
</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>Insert title here</title>
</head>
<body>
<h3>2. 조건문</h3>
<%--
<% if(num1 <= num2){ %>
<% } %>
--%>
<c:if test="${ num1 le num2 }">
<b>num1이 num2보다 작거나 같습니다</b> <br>
</c:if>
<c:set var="str" value="안녕"></c:set>
<%--
<% if(str.equals("안녕")) { %>
<% } %>
--%>
<c:if test="${ str eq '안녕' }">
<b>Hello World</b> <br>
</c:if>
</body>
</html>
- EL이랑 JSTL이 결합되면 자바 코드가 싹 사라진다. 그렇다고 자바 코드가 실행되지 않는 것은 아님.
- EL에서 문자열은 쌍따옴표, 홑따옴표 다 가능하지만 바깥쪽의 따옴표와 겹쳐서는 안 됨.
ㅁ <c:choose>, <c:when>, <c:otherwise>
- 자바에서의 else if문 또는 else문을 대체하는 구문
<c:choose>
<c:when test="첫번째 조건식">
if 블럭
</c:when>
<c:when test="두번째 조건식">
else if 블럭
</c:when>
<c:otherwise>
else 블럭
</c:otherwise>
</c:choose>
- otherwise는 생략 가능.
- 주석은 각 태그 안쪽에 써야 함. <c:choose>와 <c:when test="조건식"> 사이에 쓰면 나중에 오류날 수 있다.
<%--
<% if(num1 > 20){ %>
<% }else if(num1 >= 10){ %>
<% }else { %>
<% } %>
--%>
<c:choose>
<c:when test="${ num1 > 20 }">
<b>반갑습니다.</b>
</c:when>
<c:when test="${ num1 ge 10 }">
<b>안녕하세요.</b>
</c:when>
<c:otherwise>
<b>어서오세요.</b>
</c:otherwise>
</c:choose>
==============================================================================
ㅁ 3. 반복문
ㅁ <c:forEach>
- 자바에서의 for문을 대체하는 구문
(1) for loop문
<c:forEach var="" begin="" end="" [step=""]> </c:forEach>
- var : 반복문 돌 때 마다 순차적으로 증가된 값을 받기 위한 변수
- begin : 초기값
- end : 최종값
- step : 증가값, 생략시 기본값 1
(2) 향상된 for문
<c:forEach var="" items="" [varStatus=""]> </c:forEach>
- var : 반복문 돌 때 마다 접근되는 요소를 받기 위한 변수
- items : 순차적으로 접근하고자 하는 객체(배열, 컬렉션)
- varStatus : 현재 접근된 요소의 상태값을 담기 위한 변수 (count-순번, index-인덱스 속성에 접근 가능)
얘도 결국 var여서 어떤 값을 보관해두기 위한 변수다.
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<h3>3. 반복문</h3>
<%--
<% for(int i=1; i<=10; i+=2){ %>
<% { %>}
--%>
<c:forEach var="i" begin="1" end="10" step="2">
반복확인 : ${ i } <br>
</c:forEach>
<c:forEach var="i" begin="1" end="6">
<h${ i }>태그 안에도 적용 가능</h${ i }>
</c:forEach>
</body>
</html>
- var로 선언된 변수에 접근할 때는 무조건 EL 구문으로 접근한다.
- 태그 안에도 EL 구문 사용 가능하다.
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<h3>3. 반복문</h3>
<%--
<% for(int i=1; i<=10; i+=2){ %>
<% { %>}
--%>
<c:forEach var="i" begin="1" end="10" step="2">
반복확인 : ${ i } <br>
</c:forEach>
<c:forEach var="i" begin="1" end="6">
<h${ i }>태그 안에도 적용 가능</h${ i }>
</c:forEach>
<%@ page import="java.util.*, com.br.elJstl.model.vo.Person" %>
<%
String[] colorArr = {"red", "yellow", "green", "pink"};
request.setAttribute("colors", colorArr);
List<Person> personList = new ArrayList<>();
personList.add(new Person("홍길동", 20, "남자"));
personList.add(new Person("홍길녀", 30, "여자"));
personList.add(new Person("홍길순", 40, "여자"));
request.setAttribute("list", personList);
%>
<%--
<% for(String c : colorArr) { %>
<% } %>
--%>
<ul>
<c:forEach var="c" items="${ colors }">
<li>${ c }</li>
</c:forEach>
</ul>
<ul>
<c:forEach var="c" items="${ colors }">
<li style="color:${ c }">${ c }</li>
</c:forEach>
</ul>
<%--
<% for(Person p : personList) { %>
<% { %>
--%>
<table border="1">
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>나이</th>
<th>성별</th>
</tr>
</thead>
<tbody>
<c:forEach var="p" items="${ list }" varStatus="sta">
<tr>
<td>순번: ${ sta.count }, 인덱스: ${ sta.index }</td>
<td>${ p.name }</td>
<td>${ p.age }</td>
<td>${ p.gender }</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
- 순번은 1부터 시작, 인덱스는 0부터 시작
- 향상된 for문의 특성상 인덱스를 쓸 수 없다. 인덱스를 쓰고 싶다면 varStatus 속성을 쓰면 된다.
ㅁ <c:forTokens>
- 자바에서의 split 또는 StringTokenizer와 같은 구문으로 구분자로 문자열 분리 후 반복문 수행시키는 구문.
<c:forTokens var="" items="" delims=""> </c:forTokens>
- var : 순차적으로 분리된 문자열들을 전달받을 변수
- items : 분리시켜 반복문 돌리고자하는 데이터
- delims : 분리 기준의 구분자
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<c:set var="device" value="컴퓨터,핸드폰,TV.에어컨/냉장고.세탁기"/>
<ol>
<c:forTokens var="d" items="${ device }" delims=",./">
<li>${ d }</li>
</c:forTokens>
</ol>
</body>
</html>
- delims에 여러개의 구분자 제시 가능하다.
============================================================================================
ㅁ 4. url 제작 관련 태그
ㅁ <c:url>, <c:param>
- 요청할 url을 생성하고 쿼리스트링(요청시 전달할 값)을 정의해둘 수 있는 구문.
<c:url var="" value="">
<c:param name="" value=""/>
<c:param name="" value=""/>
</c:url>
- var : 최종적으로 제작된 url 구문을 받기 위한 변수
- value : 요청할 url 주소
- name : 파라미터(요청시전달값)명 == 키값
- value : 파라미터(요청시전달값)값 == 밸류값
ㅁ
<%@ 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>
<h2>JSTL Core Library</h2>
<!-- 앞으로 자주 사용할 c:set 구문 -->
<c:set var="contextPath" value="${ pageContext.request.contextPath }"></c:set>
<h3>4. url제작</h3>
<a href="${ contextPath }/test.do?name=홍길동&age=10">기존방식(url 직접 작성)</a> <br>
<%-- String mkUrl = "/elJstl/test.do?name=홍길동&age=10" --%>
<c:url var="mkUrl" value="/test.do">
<c:param name="name" value="홍길동"></c:param>
<c:param name="age" value="10"/>
</c:url>
<a href="${ mkUrl }">c:url로 제작한 url로 요청하는 방식</a>
</body>
</html>
- url을 직접 작성하는 기존 방식
- url을 여러군데에 제시해야해서 구조적으로 만들어 두는게 c:url태그다.
- value의 /가 context path를 의미해서 저렇게만 써도 된다.
value="${ contextPath }/test.do" 이렇게 쓰면 context path인 elJstl이 두번 보여짐.
ㅁ core 라이브러리 끝.