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();
[ 사용 예제 ]
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>
'Java Web Programming > 4. JSP' 카테고리의 다른 글
[JSP] 회원관리 웹 어플리케이션2 - layout 두 가지 (로그인 + 회원가입 + 회원정보 수정 + 경로 + EL/JSTL + BootStrap + Model2 설계) (0) | 2020.09.21 |
---|---|
[JSP] 회원 관리 웹 어플리케이션 (EL/JSTL 적용, 웹 프로그램 경로, BootStrap + Model2 설계) (0) | 2020.09.18 |
[JSP] Semi-Project | Model2 MVC 기반 고객관리 웹어플리케이션 (회원가입, 로그인) (0) | 2020.09.16 |
[UML] Use Case Diagram (유즈케이스 다이어그램) (0) | 2020.09.15 |
[JSP] Include Action Tag - 페이지 모듈화 (0) | 2020.09.15 |