본문 바로가기
웹개발/jsp

EL과 JSTL

by heavenLake 2021. 7. 23.
반응형

 

 

원본은 밑에 사이트 참고 했습니다. 감합니다.

https://creamilk88.tistory.com/117

 

[JSP] EL / JSTL 표현식 한 방에 정리 ! (문법과 사용방법)

EL과 JSTL을 사용하는 이유? 1. design tool에서는 jsp 코드<% %>가 깨질 수 있다. [ EL ] EL 이란? Expression Language의 약자 JSP 2.0에서 새롭게 추가된 스크립트 언어 기존의 Script tag의 표현식(<%= 정보 %..

creamilk88.tistory.com

 

 

 

 

 

 

EL과 JSTL을 사용하는 이유? 

1. design tool에서는 jsp 코드<% %>가 깨질 수 있다.

 

[ EL ]

EL 이란?

  • Expression Language의 약자
  • JSP 2.0에서 새롭게 추가된 스크립트 언어
  • 기존의 Script tag의 표현식(<%= 정보 %>) tag에서 업그레이드된 버전 ( ${ 정보 } )
  • [ 주요 특징 ]
    1) JSP 속성영역 (request,  response, session, application) 저장된 속성 객체의 property를 출력한다 
    2) 리터럴 데이터, 다양한 연산결과 출력이 가능하다 
    3) JSTL과 연동이 가능하다

[기존 방식 예 : scriptlet 스클립틀릿]

<!--  mvo instance의 name 변수 출력 -->
<% MemberVO vo = (MemberVO) request.getAttribute("mvo"); %>
<%= vo.getName()%>

 

[EL 방식 예]

<!--  mvo instance의 name 변수 출력 -->
${requestScope.mvo.name} 

<!-- requestScope는 생략 가능 -->
${mvo.name}

requestScope는 생략이 가능하지만,

실행속도가 느려지고, 구분이 헷갈릴 수 있기때문에 기재해 주는 것이 권장된다.

 

JSP 내장객체 종류

- pageContext : 다른 내장 객체를 생성하는 역할

- pageScope : JSP가 Servlet으로 변환되었을 때, Serlvet 객체 자신을 의미 (=this)

- requestScope :  request 객체에 접근하기 위한 역할

- sessionScope :  session객체에 접근하기 위한 역할

- applicationScope : application 객체 (ServletContext 객체)에 접근하기 위한 역할

 

[ 유효범위 ]

request < session < application(ServletContext)

- request의 유효범위 : response 할 때까지

- session의 유효범위 :

   1) 로그아웃(서버에서 session.invalidate() ) 시 소멸

   2) 클라이언트(브라우저) 종료 시 소멸

   3) 지정한 session timeout까지 재접속이 없을 경우 소면

- application(ServletConext) : 웹 어플리케이션 서비스가 종료될 때까지 유효 

 

EL 에서의 파라미터 제어 객체

- param = request.getParameter();

- paramValues = request.getParameterValues();


SCRIPT

https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js

SCRIPT

(adsbygoogle = window.adsbygoogle || []).push({});

 

SCRIPT

https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js

 

 

[ 사용 예제 ] 

 

1. session에서 Attribute 받아오기

 

/step1.jsp

CarVO instance에서 1) 변수 출력 2)리스트로 변수 출력 3)HashMap으로 변수 출력

<%@page import="java.util.HashMap"%>
<%@page import="java.util.ArrayList"%>
<%@page import="model.CarVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 연습</title>
</head>
<body>

<%
	//컨트롤러에서 공유했다고 가정하고 view에서 바로 setAttribute해줌
	CarVO car1 = new CarVO("1234", "소나타", 2000);
 	request.setAttribute("cvo", car1);
%>
<h3>EL(Expression Language) 기본</h3>

<!-- 변수 출력 -->
<strong>1. CarVO instance에서 변수 model 출력</strong><br>
<!-- 방법 1 -->
${requestScope.cvo.model}<br>
<!--  방법 2 -->
${cvo.model}
<hr>

<!-- 리스트로 변수 출력 -->
<%
	ArrayList<CarVO> list = new ArrayList<CarVO>();
	list.add(new CarVO("234", "테슬라", 4500));
	//컨트롤러에서 공유했다고 가정하고 view에서 바로 setAttribute해줌
	session.setAttribute("carList", list);
%>
<strong>2. CarVO instance에서 List로 변수 출력</strong><br>
${sessionScope.carList[0].model}
<hr>

<!-- 해쉬맵으로 변수 출력 -->
<%
	HashMap<String, CarVO> map = new HashMap<String, CarVO>();
	map.put("car1", new CarVO("333", "모닝", 1000));
	//컨트롤러에서 할당했다고 가정
	session.setAttribute("carMap", map);
%>
<strong>3. 세션영역의 HashMap 요소에 접근</strong><br>
${sessionScope.carMap.car1.model}

</body>
</html>

[ 브라우저 출력 결과 ]


2. 쿼리스트링 방식으로 parameter 접근

 

/step2-1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL param 연습 1</title>
</head>
<body>
	<!-- 쿼리스트링 방식으로 전송 -->
	<a href="step2-2.jsp?name=파프리카&address=제주">step2-2 이동</a>
</body>
</html>

 

/step2-2.jsp

EL방식일 경우 NULL이 param값으로 오게되면 브라우저에 아예 아무 값도 출력하지 않는다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL param 연습 2</title>
</head>
<body>
	<a href="step2-1.jsp">step2-1 이동</a>
<hr>
	1. 스클립틀릿 방식으로 파라미터 전달받음<br>
	<%=request.getParameter("name") %><br>
	<%=request.getParameter("address") %>
	<br><br>
	2. EL 방식으로 파라미터 전달받음<br>
	${param.name}<br>
	${param.address}
</body>
</html>

 

/step2-3.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL param 연습 3</title>
</head>
<body>
	<!-- 기존 방식(스클립틀릿)에서는 넘어오는 parameter값이
		 문자열로 인식이 되므로, 
		'59'+'1'이 되어 나이(문자열) 뒤에 1이 추가됨 -->
	1. 스클립틀릿 방식으로 파라미터 처리<br>
	<%=request.getParameter("nick") %><br>
	<%=request.getParameter("age")+1 %>세<br>
	
	<hr>
	
	<!-- EL 방식은 내부적으로 형변환하여 (Integer.parseInt())
		 연산되므로,
		 59+1이 되어 나이(숫자)에 1이 더해짐 -->
	2. EL 방식으로 파라미터 처리<br>
	${param.nick}<br>
	${param.age+1}세<br>

	<hr>
	<form action="step2-4.jsp">
		<input type="checkbox" name="food" value="삼겹살">삼겹살<br>
		<input type="checkbox" name="food" value="참이슬">참이슬<br>
		<input type="submit" value="전송">
	</form>
	
</body>
</html>

 

/step2-4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL param 연습 4</title>
</head>
<body>
	<!-- EL 방식이므로, null일 경우 출력하지 않는다 -->
	메뉴 1 : ${paramValues.food[0]} <br>
	메뉴 2 : ${paramValues.food[1]}	
</body>
</html>

 

[ 브라우저 출력 결과 ]

/step2-1.jsp

/step2-2.jsp

 

/step2-3.jsp

* 기존 방식(스클립틀릿)에서는 넘어오는 parameter값이 문자열로 인식이 되므로, 

'59'+'1'이 되어 나이(문자열) 뒤에 1이 추가됨

* EL 방식은 내부적으로 형변환하여 (Integer.parseInt()) 연산되므로,

59+1이 되어 나이(숫자)에 1이 더해짐

/step2-4.jsp

체크된 메뉴만 넘어온다

EL 방식이므로, null일 경우 출력하지 않는다


 

 

 

 

 

3. Model에 접근

* EL에서 Model에 접근 가능한 메서드는  get계열과 is계열 메서드만 가능

(is 계열 메서드는 리턴 타입이 boolean일때 사용)

 

/TestVO.java

package model;

public class TestVO {
	public String getName() {
		System.out.println("TestVO의 getName()이 실행");
		return "파프리카";
	}
	
	public String findNick() {
		return "펭수";
	}
	
	public String getMessage() {
		return "봄이 벚나무와 하는 것과 같은 걸 너와 함께 하기를";
	}
	
	public boolean isExist() {
		return false;
	}
	
	public int getMoney() {
		return 150;
	}
}

 

/step3-EL-Model.jsp

<%@page import="model.TestVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL에서 Model에 접근</title>
</head>
<body>
<%
	TestVO vo = new TestVO();
	request.setAttribute("tvo", vo);
%>
<!-- 
	 EL에서 Model에 접근 가능한 메서드는 
	 get계열과 is계열 메서드만 가능
	 (is 계열 메서드는 리턴 타입이 boolean일때 사용)
 -->
 
 <!-- get 계열 -->
1. TestVO의 name을 출력 : ${requestScope.tvo.name}<br>
<%-- ${requestScope.tvo.nick} //error--%>
2. TestVO의 message를 출력 : ${requestScope.tvo.message}<br>

 <!-- is 계열 -->
3. TestVO의 exist를 출력 : ${requestScope.tvo.exist} // 
${requestScope.tvo.exist == false} <!-- 연산도 가능하다 --><br>

<!-- 연산 테스트 -->
4. TestVO의 money 연산 :<br>
 - money값:
 ${requestScope.tvo.money}<br>
 - money * 4:
 ${requestScope.tvo.money*4} <!-- 곱하기 --> <br>
 - money가 100보다 큰지 :
 ${requestScope.tvo.money>100} <!-- 비교1 --> <br>
 - money가 100 초과 200 미만 인지 :	
 ${requestScope.tvo.money>100 && requestScope.tvo.money<200}<br>
 
<hr>
<!-- 비교 테스트 -->
null인지 아닌지 true or false 반환
${sessionScope.mvo == null} // ${sessionScope.mvo != null}
</body>
</html>

 

[ 브라우저 결과 ] 


 

 

 

 

4. ServletContext InitParameter 접근

SerlvetContext의 초기파라미터(=application:context parameter)에 접근하여 출력

(web.xml에 있는 내용)

 

/step4.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ServletContext InitParameter Test</title>
</head>
<body>
	<!-- application : context parameter
		
	 -->
	<%=application.getInitParameter("adminEmail") %>
	<br>
	${initP	aram.adminEmail}
</body>
</html>

 


5. Web Context (or Web Project 이름) 출력

프로젝트 작업 시, 프로젝트 명을 변경할 경우 매우 유용하게 사용된다.

path를 아래와 같이 쓰면, 현재 프로젝트의 웹 컨텍스트로 넘어가게 된다.

 

/step5-path.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>path</title>
</head>
<body>
	Web Context (or Web Project 이름)을 출력 : 
	${pageContext.request.contextPath}
</body>
</html>

 


[ JSTL ] 

JSTL 이란?

  • JSP Standard Tag Library의 약자로 JSP 표준 라이브러리이다.
    : JSP에서 자주 사용하는 기능(반복문과 조건문, 데이터 표현 등)을 미리 구현해 놓은 커스텀 태그 라이브러리 모음이다.
    : JSTL은 EL을 사용하여 표현한다.
  • Apache 재단에서 진행하는 custom tag library 프로젝트
    – 스크립트 릿으로 작성해야할 로직을 태그로 대신 처리 가능
    – apache에서 다운받아 lib에 추가.
  • 환경설정
    1) https://mvnrepository.com/artifact/javax.servlet/jstl/1.2
    에서 jstl lib(jstl-1.2.jar)를 다운받아
    웹어플리케이션의 WEB-INF/lib 에 추가 (jstl-1.2.jar)
    2) custom tag는 지시자 태그 taglib를 통해 prefix 설정 필요
    : <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 참고 사이트 
    – http://java.sun.com/products/jsp/jstl 
    – http://jakarta.apache.org/taglibs

 Core

  • 변수 지원
    – set :JSP에서 사용 될 변수설정
    – remove :설정한 변수 제거
  • 흐름제어
    – if :조건문 처리
    – choose: 다중 조건 처리 (else if)
    – forEach: collection 또는 map의 각 항목을 처리 할때 사용 –loop 반복문
    – forTokens: 구분자로 분리된 각각의 토큰을 처리시 사용

[ 사용 예제 ] 

[ 목차 ]

1. JSTL if : 조건문 
2. JSTL if 다중조건 (choose, when, otherwise)
3. JSTL Choose form 연동
4. JSTL for Each (for loop - 반복문)
5. JSTL for Each - Form 연동
6. JSTL forEach - 반복 횟수 정하기
7. JSTL forEach  + Choose (when, otherwise) 연습문제
8. JSTL forEach  에 HashMap 적용해보기
9. JSTL SET 이용해보기
10. JSTL import ( include )

 

1. JSTL if : 조건문 

 

/step1-if.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!-- JSTL 선언부 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL if</title>
</head>
<body>
<!-- JSTP if 조건 -->
<c:if test="true">
	true이므로 실행한다.
</c:if>
<hr>

<!-- query string 방식 -->
<a href="step1-if.jsp?age=10&nick=펭수">step1을 다시 호출</a><br><br>
나이: ${param.age} <br>
닉네임: ${param.nick}
<br><br>

<c:if test="${param.age > 5 && param.nick == '펭수'}">
	나이가 5세를 초과합니다. 닉네임은 펭수입니다.
</c:if>

</body>
</html>

 


 

 

2. JSTL if 다중조건 (choose, when, otherwise)

 

/step2-choose.jsp

when : else if 역할 

otherwise : else 역할

<%@page import="model.PersonVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!-- JSTL 선언부 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	PersonVO vo = new PersonVO("손흥민", 30);
 	request.setAttribute("pvo", vo);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL if 다중조건 (choose, when, otherwise)</title>
</head>
<body>
	EL로 name과 age를 출력<br>
	이름: ${requestScope.pvo.name}<br>
	나이: ${requestScope.pvo.age}<br>
	
	<hr>
	JSTL 다중조건 choose, when, otherwise<br>
	<c:choose>
		<c:when test="${requestScope.pvo.name=='아이유'}">
			아이유님이 맞습니다.<br>
			나이는 ${requestScope.pvo.age}세 입니다.
		</c:when>
		<c:when test="${requestScope.pvo.name == '손흥민'}">
			손흥민님이 맞습니다.<br>
			나이는 ${requestScope.pvo.age}세 입니다.
		</c:when>
		<!--  else 역할 -->
		<c:otherwise>
			아이유 아님
		</c:otherwise>
	</c:choose>
</body>
</html>

 

/PersonVO.java

package model;

public class PersonVO {
	private String name;
	private int age;
	
	public PersonVO() {
		super();
	}
	
	public PersonVO(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	
}

 

 


3. JSTL Choose form 연동

 

step3-choose-action.jsp

19세 이상이면

아이유님 28세 성인입니다.

13세 이상이면

아이유님 15세 청소년입니다.

1 ~ 13세 미만이면

아이유님 7세 어린이입니다.

0세 이하이면

아이유님 아직 태어나지 않았습니다.

 

/step3-choose-form.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Choose Form</title>
</head>
<body>
	<form action="step3-choose-action.jsp">
		이름 <input type="text" name="userName"><br>
		나이 <input type="number" name="userAge"><br>
		<input type="submit" name="전송"><br>
	</form>
</body>
</html>

 

/step3-choose-action.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!-- JSTL 선언부 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>	
	<%-- 다중조건 --%>
	<c:choose>
		<c:when test="${param.userAge >= 19}">
			${param.userName}님, ${param.userAge}세 성인입니다.
		</c:when>
		<c:when test="${param.userAge >=13}">
			${param.userName}님, ${param.userAge}세 청소년입니다.
		</c:when>
		<c:when test="${param.userAge >=1}">
			${param.userName}님, ${param.userAge}세 어린이입니다.
		</c:when>
		<c:otherwise>
			${param.userName}님, 아직 태어나지 않았습니다.
		</c:otherwise>
	</c:choose>
</body>
</html>

 


 

 

4. JSTL for Each (for loop - 반복문)

 

<c:forEach items="${[Scope종류].[전송대상이름]}" var="[요소지정변수]" varStatus="[변수]">
</c:forEach>

JSTL forEach : JSTL for loop (반복문)

items : 대상 배열 또는 컬렉션

var : 요소를 저장할 변수

varStatus : index와 count 속성이 있다.  (index는 0부터, count는 1부터 시작)

 

/step4-forEach.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!-- JSTL 선언부 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>forEach(JSTL for loop)</title>
</head>
<body>
<%
	String friends[] ={"밀크", "두유", "방울"};
	request.setAttribute("fa", friends);
%>
<%-- 
	JSTL forEach : JSTL for loop (반복문)
	items : 대상 배열 또는 컬렉션
	var : 요소를 저장할 변수
	varStatus : 
 --%>
<c:forEach items="${requestScope.fa}" var="fname" varStatus="order">
	count: ${order.count}
	index: ${order.index}
	${fname} <br>
</c:forEach>
</body>
</html>

 


5. JSTL for Each - Form 연동

 

/step5-forEach-form.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL forEach Form</title>
</head>
<body>
	<form action="step5-forEach-action.jsp" method="POST">
		주문자 <input type="text" name="customerName"><br>
		<input type="checkbox" name="menu" value="전어">전어<br>
		<input type="checkbox" name="menu" value="연어">연어<br>
		<input type="checkbox" name="menu" value="방어">방어<br>
		<input type="submit" value="주문하기">
	</form>
</body>
</html>

 

/step5-forEach-action.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<!-- JSTL 선언부 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
	//post 한글방식 처리
	request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL forEach Action</title>
</head>
<body>
	주문자명 : ${param.customerName} <br>
	<c:forEach items="${paramValues.menu}" var="food" varStatus="order">
		${order.count}. ${food}<br>
	</c:forEach>  	
	을 주문하셨습니다.
</body>
</html>

 


6. JSTL forEach - 반복 횟수 정하기

 

/step6-forEach.java

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" session="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<!-- <c:forEach begin="[시작숫자]" end="[끝나는숫자]" var="[요소지정 변수]"> -->
	<c:forEach begin="1" end="5" var="num">
		${num}<br>
	</c:forEach>
</body>
</html>


7. JSTL forEach  + Choose (when, otherwise) 연습문제

 

19세 이상이면

성인 파프리카 27세

아니면

미성년 밀크 10세

 

/step7-forEach-ex.java

<%@page import="model.PersonVO"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<!-- Bootstrap 선언부 -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<title>JSTL forEach exam</title>
</head>
<body>
	<%
		ArrayList<PersonVO> list = new ArrayList<PersonVO>();
	list.add(new PersonVO("밀크", 10));
	list.add(new PersonVO("두유", 1));
	list.add(new PersonVO("파프리카", 27));
	request.setAttribute("memberList", list);
	%>
	<div class="container">
		<h2>JSTL forEach Exercise</h2>
		<table class="table table-hover">
			<thead>
				<tr>
					<th>연령대</th>
					<th>이름</th>
					<th>나이</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach items="${requestScope.memberList}" var="person"
					varStatus="order">
					<tr>
						<c:choose>
							<c:when test="${person.age > 19}">
								<td>성인</td>
							</c:when>
							<c:otherwise>
								<td>미성년</td>
							</c:otherwise>
						</c:choose>
						<td>${person.name}</td>
						<td>${person.age}</td>
					</tr>
				</c:forEach>
			</tbody>
		</table>
	</div>
</body>
</html>

 


 

 

8. JSTL forEach  에 HashMap 적용해보기

 

/step8-forEach-map.java

<%@page import="java.util.Iterator"%>
<%@page import="java.util.Set"%>
<%@page import="model.PersonVO"%>
<%@page import="java.util.LinkedHashMap"%>
<%@ 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 forEach Map</title>
</head>
<body>
	<%
		LinkedHashMap<String, PersonVO> map = new LinkedHashMap<String, PersonVO>();
		map.put("a", new PersonVO("파프리카", 27));
		map.put("b", new PersonVO("밀크", 10));
		map.put("c", new PersonVO("두유", 1));
	
		session.setAttribute("personMap", map);
		
		@SuppressWarnings("unchecked")
		LinkedHashMap<String, PersonVO> rMap 
			= (LinkedHashMap<String, PersonVO>) session.getAttribute("personMap");
	%>
	
	<!-- 기존 방식으로 HashMap 활용 -->
	<strong>1. 기존 scriptlet 방식으로 세션에 저장된 map의 key와 value를 출력 </strong>
	<br>
	<%
		//rMap의 key와 value를 순차적으로 출력
		Set<String> set = rMap.keySet();
	
		//set으로부터 iterator()를 호출해서, Iterator 객체 반환
		//Iterator의 hasNext()와 next()를 이용해 key를 추출
		//추출한 key로부터 rMap의 key에 해당하는 value를 rMap.get(key) 형태로 반환
		/* key : a  value : 파프리카
		   key : b  value : 밀크
		   key : c  value : 두유
		*/
		Iterator<String> keyIt = set.iterator();
		while (keyIt.hasNext()) {
			String key = keyIt.next();	%>
			key : <%=key%> / value : <%=rMap.get(key).getName()%><br>
	<% } %>

	<hr>
	<!-- JSTL 방식으로 HashMap 활용 -->
	<strong>2. JSTL forEach로 map의 key와 value를 출력</strong><br>	
	<c:forEach items="${sessionScope.personMap}" var="person">
		key: ${person.key} / value: ${person.value.name} <br>
	</c:forEach>
</body>
</html>


9. JSTL SET 이용해보기

 

반복적으로 많이 쓰이는 객체를 c set으로 담아둘 수 있다.

<c:set var="[지정할 변수이름]" value="${[ ]Scope.[name].[variable]}"></c:set>

 

/step10-set.java

<%@page import="model.CarVO"%>
<%@page import="model.PersonVO"%>
<%@ 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 set</title>
</head>
<body>
	<%
		PersonVO pvo 
			= new PersonVO("파프리카", 20, new CarVO("123", "테슬라", 4500));
		request.setAttribute("person", pvo);
	
		PersonVO rvo = (PersonVO) request.getAttribute("person");
	%>
	
	<%-- 기존방식(scriptlet)으로 정보 확인 --%>
	이름 : <%=rvo.getName() %><br>
	자동차 모델명 : <%=rvo.getCarVO().getModel() %><br>
	
	<hr>
	<%-- EL 방식으로 정보 확인 --%>
	이름: ${requestScope.person.name} <br>
	자동차 모델명: ${requestScope.person.carVO.model}<br>
	자동차 가격 : ${requestScope.person.carVO.price}<br><br>
	
	<c:set var="car" value="${requestScope.person.carVO}"></c:set>
	이름 : ${requestScope.person.name}<br>
	자동차 모델명: ${car.model}<br>
	자동차 가격 : ${car.price}
	
	
</body>
</html>


10. JSTL import ( include )

 

<c:import url="[header or footer path]"></c:import>

JSP에서 include action tag와 같은 기능을 한다.

차이는 JSTP import는 다른 웹 어플리케이션의 자원을 이용할 수 있다는 것이다. 

(ex. web project 1에 있는 header.jsp를 web project2에서도 <c:import>를 통해 가져올 수 있다)

(JSP는 자신의 웹 어플리케이션 프로젝트의 자원만 이용할 수 있다!)

 

/step11-header.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>Header</title>
</head>
<body>
	---------- <br>
	  HEADER  <br>
	---------- <br>
</body>
</html>

 

/step11-footer.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>Footer</title>
</head>
<body>
	---------- <br>
	  FOOTER  <br>
	---------- <br>
</body>
</html>

 

(JSTL include)

/step11-import-include.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>JSTL import</title>
</head>
<body>
	<c:import url="step11-header.jsp"></c:import>
	<br><br><br>이 부분은 step11 화면입니다. <br><br><br>
	<c:import url="step11-footer.jsp"></c:import>
</body>
</html>

 

 

반응형

댓글