c:forEach 태그는 jsp 페이지에서 반복문을 수행하는 태그이며, 사용형식은 다음과 같음.
<c:forEach var = "변수이름" items = "반복할객체이름" begin = "시작값"
end = "마지막값" step = "증가값" varStatsu = "반복상태변수이름">
...
</c:forEach>
여기서 var는 반복할 변수 이름을, items는 반복할 객체 이름을 지정함. begin과 end는 각각 반복 시작 및 종료 값을, step은 한 번 반복 변수를 증가시킬 값을, varStatus는 반복 상태 속성을 지정함.
index - int : items에서 정의한 항목을 가리키는 index 번호임. 0부터 시작함.
count - int : 몇 번째 반복인지 나타냄. 1부터 시작함.
first - boolean : 첫 번째 반복인지 나타냄.
last - boolean : 마지막 반복인지 나타냄.
먼저 자바 코드로 ArrayList 객체를 생성하여 문자열을 저장한 후 c:forEach 태그에서 사용할 수 있도록 c:set 태그로 변수 list에 재할당함. 그리고 varStatus의 loop 속성을 이용해 반복 횟수를 출력함. c:forEach 태그의 items에 ArrayList를 설정한 후 반복문 수행 시 ArrayList에 저장된 문자열을 반복 변수 data에 한 개씩 가져와 출력함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
import = "java.util.*"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%>
<%
List dataList = new ArrayList();
dataList.add("hello");
dataList.add("world");
dataList.add("안녕하세요");
%>
<!-- 표현언어에서 사용할 수 있도록 c:set 태그를 이용해 변수에 dataList를 할당함. -->
<c:set var = "list" value = "<%=dataList %>"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 반복 변수 i를 1부터 10까지 1씩 증가시키면서 반복문을 수행함. -->
<c:forEach var = "i" begin = "1" end = "10" step = "1" varStatus = "loop">
i = ${i } 반복횟수 : ${loop.count }<br>
</c:forEach>
<br>
<!-- 반복 변수 i를 1부터 10까지 2씩 증가시키면서 반복문을 수행함. -->
<c:forEach var = "i" begin = "1" end = "10" step = "2">
5 * ${i } = ${5 * i }<br>
</c:forEach>
<br>
<!-- ArrayList 같은 컬렉션 객체에 저장된 객체(데이터)를 반복해서 반복 변수 data에 하나씩 가져와 처리함. -->
<c:forEach var = "data" items = "${list }">
${data }<br>
</c:forEach>
<br>
<c:set var = "fruits" value = "사과, 파인애플, 바나나, 망고, 귤" />
<!-- 구분자 ,(콤마)를 이용해 문자열을 분리해서 출력함. -->
<c:forTokens var = "token" items = "${fruits }" delims=",">
${token }<br>
</c:forTokens>
</body>
</html>
이번에는 c:forEach 태그를 이용해 ArrayList에 저장된 회원 정보를 출력해 보겠음. c:forEach 태그를 이용하면 ArrayList에 저장된 객체에 편리하게 접근할 수 있음.
다음과 같이 c:forEach 태그의 반복 변수 i를 ArrayList의 인덱스로 사용해서 저장된 회원 정보를 차례대로 출력하도록 작성함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
import = "java.util.*, sec01.ex01.*"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("utf-8");
List membersList = new ArrayList();
MemberBean m1 = new MemberBean("son", "1234", "손흥민", "son@test.com");
MemberBean m2 = new MemberBean("ki", "4321", "기성용", "ki@test.com");
MemberBean m3 = new MemberBean("park","1212", "박지성", "park@test.com");
// 세 명의 회원 정보를 MemberBean에 저장한 후 다시 ArrayList에 저장함.
membersList.add(m1);
membersList.add(m2);
membersList.add(m3);
%>
<c:set var = "membersList" value = "<%=membersList %>"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border = "1" align = "center">
<tr align = "center" bgcolor = "lightgreen">
<td width = "7%"><b>아이디</b></td>
<td width = "7%"><b>비밀번호</b></td>
<td width = "7%"><b>이름</b></td>
<td width = "7%"><b>이메일</b></td>
</tr>
<!-- membersList에 저장된 회원 수만큼 반복 변수 i를 0부터 1씩 증가시키면서 forEach 문을 실행함. -->
<c:forEach var = "i" begin = "0" end = "2" step = "1">
<tr align = "center">
<!-- 반복 변수 i를 ArrayList의 인덱스로 사용해 회원 정보를 차례대로 출력함. -->
<td>${membersList[i].id }</td>
<td>${membersList[i].pwd }</td>
<td>${membersList[i].name }</td>
<td>${membersList[i].email }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
이번에는 c:forEach문의 items 속성에 membersList를 할당한 후 실행해 자동으로 var의 member에 membersList의 MemberBean 객체가 차례대로 할당되도록 작성함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
import = "java.util.*, sec01.ex01.*"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%>
<%
request.setCharacterEncoding("utf-8");
List membersList = new ArrayList();
MemberBean m1 = new MemberBean("son", "1234", "손흥민", "son@test.com");
MemberBean m2 = new MemberBean("ki", "4321", "기성용", "ki@test.com");
MemberBean m3 = new MemberBean("park","1212", "박지성", "park@test.com");
membersList.add(m1);
membersList.add(m2);
membersList.add(m3);
%>
<c:set var = "membersList" value = "<%=membersList %>"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border = "1" align = "center">
<tr align = "center" bgcolor = "lightgreen">
<td width = "7%"><b>아이디</b></td>
<td width = "7%"><b>비밀번호</b></td>
<td width = "7%"><b>이름</b></td>
<td width = "7%"><b>이메일</b></td>
</tr>
<!-- 반복문을 수행하면서 memberList에 저장된 MemberBean 객체가 차례대로 member에 할당됨. -->
<c:forEach var = "member" items = "${membersList }">
<tr align = "center">
<!-- 반복 변수 i를 ArrayList의 인덱스로 사요애해 회원 정보를 차례대로 출력함. -->
<td>${member.id }</td>
<td>${member.pwd }</td>
<td>${member.name }</td>
<td>${member.email }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
<c:url> 테그는 jsp 페이지에서 url 정보를 저장하는 역할을 하며, 사용 형식은 다음과 같음.
<c:url var = "변수이름" value = "url경로" [scope = "scope 속성 중 하나"]
[<c:param name = "매개변수이름" value = "전달값" />]
...
</c:url>
여기서 var는 생성된 url이 저장된 변수를, value는 생성할 url을, scope는 scope 속성의 값을 지정함.
c:url 태그를 이용해 다른 페이지로 이동하면서 데이터를 전달함. 따라서 이동할 페이지로 전달할 데이터가 많을 경우에 사용하면 편리함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
import = "java.util.*"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<c:set var = "contextPath" value = "${pageContext.request.contextPath }"/>
<!-- c:url 태그로 이동할 페이지를 설정함. -->
<c:url var = "url1" value = "/test01/member1.jsp">
<!-- 이동할 페이지로 전달할 데이터를 설정함. -->
<c:param name = "id" value = "hong"/>
<c:param name = "pwd" value = "1234"/>
<c:param name = "name" value = "홍길동"/>
<c:param name = "email" value = "hong@test.com"/>
</c:url>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- <a href = '${contextPath }/test01/member1.jsp'>회원정보출력</a> -->
<!-- c:url 태그의 변수 이름을 간단하게 설정함. -->
<a href = '${url1 }'>회원정보출력</a>
</body>
</html>
회원정보출력을 클릭함.
매개변수로 전달된 회원 정보를 출력함(member1.jsp에서 ${속성}을 ${param.속성}으로 수정할 것).
<c:redirect> 태그는 지정된 jsp 페이지로 리다이렉트할 때 사용함. response.sendRedirect() 기능과 동일하며 <c:redirect> 태그로 리다이렉트할 때 매개변수를 전달할 수 있음.
사용 형식은 다음과 같음.
<c:redirect url = "redirect할 URL">
[<c:param name = "매개변수이름" value = "전달값"/>]
...
</c:redirect>
여기서 url은 리다이렉트 될 url이 저장될 변수를 지정함.
<c:redirect> 태그를 이용해 회원 정보 출력창으로 리다이렉트함. 리다이렉트하면서 회원 정보를 매개변수로 전달함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 리다이렉트할 페이지를 설정함. -->
<c:redirect url = "/test01/member1.jsp">
<!-- 리다이렉트할 페이지로 전달할 매개변수를 설정함. -->
<c:param name = "id" value = "${'hong' }"/>
<c:param name = "pwd" value = "${'1234' }"/>
<c:param name = "name" value = "${'홍길동' }"/>
<c:param name = "email" value = "${'hong@test.com' }"/>
</c:redirect>
</body>
</html>
http:localhost:8090/pro14/test3/redirectTest.jsp로 요청하면 test01/member1.jsp로 리다이렉트 됨. 그러면서 매개변수로 전달한 회원 정보를 출력함.
<c:out> 태그는 화면에 지정한 값을 출력해 주는 태그임. 표현 언어와 기능은 거의 동일하지만 기본값 설정 기능 등을 제공하므로 더 편리하게 사용할 수 있음.
사용 형식은 다음과 같음.
<c:out value = "출력값" default = "기본값" [escapeXml = "boolean값"] />
여기서 value는 출력할 값을, default는 value 속성에 지정된 값이 없을 때 출력할 기본값을, escapeXml은 escape 문자를 변환하는 역할을 함(생략할 수 있으며 기본값은 true).
다음은 회원 가입창에서 입력한 회원 정보를 전달받아 <c:out> 태그를 이용해 화면에 출력하는 예제임. 다음과 같이 memberForm.jsp를 작성해 회원 가입창에서 회원 정보를 입력한 후 member9.jsp로 전달함.
<%@ page language="java" contentType="text/html; charset=UTF-8"
isELIgnored="false"
pageEncoding="UTF-8"%>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table align = "center" border = "1">
<tr align = "center" bgcolor = "lightgreen">
<td width = "7%"><b>아이디</b></td>
<td width = "7%"><b>비밀번호</b></td>
<td width = "7%"><b>이름</b></td>
<td width = "7%"><b>이메일</b></td>
</tr>
<c:choose>
<c:when test = "${empty param.id }">
<tr align = "center">
<td colspan = "5">아이디를 입력하세요</td>
</tr>
</c:when>
<c:otherwise>
<tr align = "center">
<td><c:out value = "${param.id }"/></td>
<td><c:out value = "${param.pwd }"/></td>
<td><c:out value = "${param.name }"/></td>
<td><c:out value = "${param.email }"/></td>
</tr>
</c:otherwise>
</c:choose>
</table>
</body>
</html>
<c:out> 태그를 이용해 전송된 회우너 정보를 출력함.
프로그래밍을 하다 보면 > 또는 < 그리고 작은따옴표(')나 큰따옴표(") 같은 특수 문자를 출력해야 하는 경우가 있음. 그런데 이런 특수 문자들은 html 태그에도 사용되므로 각각의 특수문자에 지정된 문자를 이용해서 브라우저에 출력해야 함.
< : <
> : >
& : &
' : '
" : "
... : ...
간단히 특수 문자 사용 예를 실습해 보겠음.
<c:out> 태그의 escapeXml 속성을 이용해 변환된 문자를 특수 문자로 변환함.
<%@ 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>Insert title here</title>
</head>
<body>
<h2>escapeXml 변환하기</h2>
<h2>
<pre>
<!-- escapeXml 속성이 true이므로 value의 <는 그대로 화면에 출력 됨. -->
<c:out value = "<" escapeXml = "true"/>
<!-- escapeXml 속성이 false이므로 value의 <는 해당하는 특수 문자로 변환되어 화면에 출력함. -->
<c:out value = "<" escapeXml = "false"/>
<c:out value = ">" escapeXml = "true"/>
<c:out value = ">" escapeXml = "false"/>
<c:out value = "&" escapeXml = "true"/>
<c:out value = "&" escapeXml = "false"/>
<c:out value = "'" escapeXml = "true"/>
<c:out value = "'" escapeXml = "false"/>
<c:out value = """ escapeXml = "true"/>
<c:out value = """ escapeXml = "false"/>
</pre>
</h2>
</body>
</html>
지금까지 일반적으로 많이 사용하는 코어 라이브러리에 대해 알아봤음. 그 외 <c:import> 태그는 <jsp:include>와 같은 기능을 수행함.