개발자 미니민의 개발스터디

[JSP] JSTL 정의 / Core 태그 / <c:forEach> / Map 접근

by mini_min

JSP

[JSP] JSTL 정의 / Core 태그 / <c:forEach> / Map 접근

✔️ JSTL 정의

: JSP 에서는 사용자가 태그를 정의해서 사용하는 것이 가능하며, 이런 사용자 정의 태그를 커스텀 태그라한다. 이들 중 자주 사용하는 것을 표준으로 만들어 놓은 것이 JSTL 이다.

👩‍💻 JSTL 의 핵심은 JSP 의 공통적인 핵심 기능을 캡슐화 한 태그 모음이란 것이다.

👩‍💻 반복, 조건문, XML 문서 조작을 위한 태그, 국제화 태그 및 SQL 태그 같은 일반적인 구조 작업을 지원한다.

👩‍💻 모든 태그는 시작과 끝이 한 쌍이어야한다.

 💖 EL 을 사용해 표현한다. 

 

📓 필요한 것

다음의 라이브러리가 필요하다.

- jstl-1.2.jar

- jstl-1.2.jar의 maven dependency

- taglib 지시어 (JSTL 사용을 위한 라이브러리를 지정한다)

(사용자 정의 태그, JSTL 라이브러리 위치를 식별하고 JSP 에서 사용자 정의 태그 및 JSTL 을 식별하기 위한 방법을 선언한다.)

(uri 는 태그 라이브러리 URI 또는 디스크립터 파일의 URI)

(prefix 는 사용자 정의 태그 접두사이다)

 

📓 JSTL 태그 종류

: 코어, 포메팅, 함수 태그 자주 사용

 

 

✔️ Core 태그

- 일반 프로그램 언어에서 제공하는 변수선언, 조건, 제어, 반복문 등의 기능을 제공한다.

- Core 태그를 위해 아래와 같은 tablib 지시어 설정

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

 

 

👩‍💻 <c:if> 태그

: c:if 태그는 조건이 참인 경우에 실행하며, else 구문은 없다.

- test : 실행 여부 결정하는 조건식

- var : 테스트 조건 결과를 저장할 변수, 불린형

- scope : 조건 결과를 저장할 변수의 scope

<form action="ex11.jsp" method="post">
	<input type="text" name="num" required="required" placeholder="숫자" pattern="\d+">
	<button type="submit">확인</button>
</form>
<c:if test="${not empty param.num}">
<p>
    ${param.num } :
        <c:if test="${param.num % 2 == 0 }">
            짝수
        </c:if>
        <c:if test="${param.num % 2 == 1 }">
            홀수
        </c:if>
</p>
</c:if>

 

 

👩‍💻 <c:choose> / <c:when> / <c:otherwise> 태그

: 여러 조건 중 하나의 조건을 선택하여 실행한다.

: when 조건에 만족하는 것이 없으면, otherwise 태그 본문을 실행한다.

<form action="ex12.jsp" method="post">
<p>
	<input type="text" name="num" placeholder="숫자" required="required" pattern="\d+">
	<button type="submit">확인</button>
</p>
</form>
<c:if test="${not empty param.num }">
<p>
	${param.num } : 
	<c:choose>
		<c:when test="${param.num%3==0 && param.num%4==0 }">
			3과 4의 배수
		</c:when>
		<c:when test="${param.num%3==0}">
			3의 배수
		</c:when>
		<c:when test="${param.num%4==0}">
			4의 배수
		</c:when>
		<c:otherwise>
			3 또는 4의 배수가 아님
		</c:otherwise>
	</c:choose>
</p>
</c:if>

 

 

👩‍💻 <c:forEach> 태그

: 고정된 횟수 또는 컬렉션에 대해 중첩 본문 콘텐츠를 반복할 때 사용되는 반복 태그이다.

- var : 사용할 변수

- items : Collection 객체 (list 나 map 등), begin 속성과 end 속성이 없을 때 필수다.

- varStaus : 반복 상태를 알 수 있는 변수

- begin : 반복을 시작할 index, 정의하지 않으면 0

- end : 반복을 종료할 index, 

- step : 반복할 때마다 건너 뛸 index 개수

 

🔒 예제 (구구단)

<form action="ex13.jsp" method="post">
	<input type="text" name="num" placeholder="단" required="required" pattern="[1-9]{1}">
	<button type="submit">확인</button>
</form>
<c:if test="${not empty param.num }">
	<p> ** ${param.num } 단 ** </p>
	<!--  step : 증가분. 1이면 생략 가능 -->
	<c:forEach var="n" begin="1" end="9" step="1">
		${param.num } * ${n } = ${param.num * n } <br>
	</c:forEach>
</c:if>

 

🔒 예제 (구구단 자동 출력)

<p> ** 구구단 ** </p>
<!--  step : 증가분. 1이면 생략 가능 -->
<c:forEach var="n" begin="2" end="9" step="1">
    <c:forEach var="dan" begin="1" end="9" step="1">
        ${n } * ${dan } = ${n * dan } <br>
    </c:forEach>
        <br>
</c:forEach>

 

 

👩‍💻 <c:forEach> List (Collection) 반복 (1)

ex15 파일에서 List Collection 객체를 만들어 저장하고 포워딩 해준다. (ex15_ok.jsp)

List<String> list = new ArrayList<>();
list.add("서울");
list.add("부산");
list.add("대구");

request.setAttribute("list", list);
request.setAttribute("subject", "자바,스프링,HTML,CSS,서블릿");
<jsp:forward page="ex15_ok.jsp"/>

 

- ex15_ok.jsp 에서 forEach 로 객체 반복하기

: forEach 에서 items 를 주면 , Collection 객체 를 받을 수 있다. (변수 a에 저장함)

<c:forEach var="a" items="${list}">
	<p>${a }</p> <!--  서울 부산 대구 그대로 출력됨 -->
</c:forEach>

 

+ forEach 에서 메소드 사용하기 (split)

<c:forEach var="a" items="${subject.split(',')}">
	<p>${a }</p>
</c:forEach>
<!-- split 리턴 : 배열임 -->

 

👩‍💻 <c:forEach> List (Collection) 반복 (2)

: User 객체를 생성해서, List 에 저장하고 포워딩

List<User> list = new ArrayList<>();

list.add(new User("홍길동", 20, "010-1111-1111", "자바"));
list.add(new User("너너너", 21, "010-1111-2222", "HTML"));
list.add(new User("도도도", 21, "010-1111-3333", "CSS"));
list.add(new User("가가가", 20, "010-1111-1000", "servlet"));
list.add(new User("후후후", 23, "010-1111-2000", "oracle"));

request.setAttribute("list", list);
<jsp:forward page="ex16_ok.jsp"></jsp:forward>

 

- 이번에는 하나의 값이 아니라, 여러 값이 저장되어있을 때 출력하기다.

items 로 컬렉션 객체를 받고, 변수 vo 에 저장해서 User 객체에 저장된 이름으로 호출이 가능하다.

<c:forEach var="vo" items="${list }">
	<p> ${vo.name } | ${vo.age } | ${vo.tel } | ${vo.subject } </p>
</c:forEach>

 

👩‍💻 반복 상태 확인하기 : varStatus 속성

: index:0부터 순서, count:1부터 순서, first:처음여부, last:마지막여부

<c:forEach var="vo" items="${list }" varStatus="status">
	<p> 
		${vo.name } | ${vo.age } | ${vo.tel } | ${vo.subject } |
		${status.index } | ${status.count } | ${status.first } | ${status.last }
	</p>
</c:forEach>

 

 

✔️ Map 접근

: 일반 맵 객체 1개 / List 안에 Map 이 들어간 객체가 있다.

Map<String, Object> m = new HashMap<>();
m.put("name", "이이이");
m.put("age", 20);
m.put("subject", "servlet");

List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> a;

a = new HashMap<>();
a.put("name", "가나다");
a.put("city", "서울");
list.add(a);

a = new HashMap<>();
a.put("name", "누누누");
a.put("city", "경기");
list.add(a);

a = new HashMap<>();
a.put("name", "마마마");
a.put("city", "인천");
list.add(a);

request.setAttribute("map", m);
request.setAttribute("list", list);

 

- EL 에서 Map 접근하기

<p>${map.name } | ${map.age } | ${map.subject } </p>

 

- JSTL 에서 MAP 접근하기

: 출력되는 데이터 순서 조작 못함. map 은 어떻게 나올지 모름

: key 와 value 값으로 접근 가능하다. 

<c:forEach var="m1" items="${map }">
	<p>${m1.key } : ${m1.value }</p>
</c:forEach>

 

- JSTL 에서 LIST의 MAP 접근하기

<c:forEach var="m2" items="${list }">
	<p>${m2.name } | ${m2.city } </p>
</c:forEach>

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기