- EL (Expression Language)
- JSP에서 표현식을 간단하고 효율적으로 작성할 수 있도록 고안된 언어 (JSP 기본 내장)
- Java 데이터 값을 HTML 형식으로 표시(출력)하는 언어
- 기본 작성 형식 : ${ key } - EL 특징
1) GET 이라는 단어를 생략해서 사용
: 출력 용도의 언어이기 때문에 SET이라는 개념이 존재하지 않음
→ 반대되는 GET만 남았는데, 생략하여 사용
ex) JSP 표현식 : <%=request.getParameter("test")%>
EL 표현식 : ${param.test}
2) null, NullPointerException은 빈 칸으로 처리 - EL 예시
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSPProject2</title>
</head>
<body>
<ol>
<li>
<!--절대경로-->
<!-- <a href="/JSPProject2/el">EL(Expression Language)</a><br> -->
<!--상대경로 (웹 주소의 상대경로)-->
<!-- "el" : 서버 요청 주소 -->
<a href="el">EL(Expression Language)</a>
</li>
</ol>
</body>
</html>
※ 절대경로와 상대 경로
1) 절대 경로
- 변하지 않는 절대적인 위치를 기준으로 경로를 표현
EX. (학원 주소 : 대한민국 서울시 강남구 테헤란로 KH 정보교육원)
-> 대한민국 기준
(파일 경로 : C:\workspace\5_Server\JSPProject2)
-> C드라이브 기준
(웹 주소 : /JSPProject2/el)
-> /JSPProject2 기준 (== webapp 폴더)
2) 상대 경로
- 현재 위치를 기준으로 목표로 하는 곳의 경로를 표현
EX. (KH정보교육원 : 우회전 해서 2번째 건물(스타벅스))
(웹 주소) - 현재 위치 : /JSPProject2/index.html
- 목표 위치 : /JSPProject2/el
→ 상대 경로 : el [index.html이 el로만 바뀌면 됨]
- Servlet Container
package edu.kh.jsp.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import edu.kh.jsp.dto.Person;
@WebServlet("/el")
public class ELServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path="/WEB-INF/views/el.jsp";
req.getRequestDispatcher(path).forward(req, resp);
}
// form태그 POST 방식 요청
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// POST 방식 문자 인코딩 처리
req.setCharacterEncoding("UTF-8");
// 새로운 값을 HttpServletRequest에 속성으로 추가
// req.setAttribute("K", V);
// 기본 자료형, String 추가
req.setAttribute("color", "red");
req.setAttribute("score", 100);
// 컬렉션(List, Set, Map)
List<String> strList = new ArrayList<>();
strList.add("티라미수");
strList.add("스초생");
strList.add("딸기요거트케이크");
strList.add("고구마케이크");
req.setAttribute("strList", strList);
// DTO 또는 모든 객체 추가 가능
Person p1 = new Person("홍길동", 35, 182.3);
req.setAttribute("person", p1);
//---------------------------------------------------------------
// null, 빈칸, 비어있음 확인
String test1 = null; // null
String test2 = ""; // 빈칸
List<String> test3 = null; // null
List<String> test4 = new ArrayList<>(); // 비어있음
List<String> test5 = new ArrayList<>(); // 비어있지 않음
test5.add("바나나");
test5.add("복숭아");
req.setAttribute("test1", test1);
req.setAttribute("test2", test2);
req.setAttribute("test3", test3);
req.setAttribute("test4", test4);
req.setAttribute("test5", test5);
// ---------------------------------------------------------------
// 요청 위임 구문 작성
req.getRequestDispatcher("/WEB-INF/views/el_result.jsp").forward(req, resp);
}
}
- JSP
1) el
<%@ 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>
<h2>EL 테스트(POST 방식)</h2>
<form action="el" method="post">
날짜 : <input type="date" name="inputDate">
<button>제출하기</button>
</form>
</body>
</html>
2) el_result
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- JSP import 구문 (EL 사용 시 필요 없음) -->
<%@ page import="java.util.List"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EL 결과 페이지</title>
</head>
<body>
<h1>EL을 이용해서 파라미터 출력하기</h1>
<h4>EL : ${param.inputDate}</h4>
<h4>JSP 표현식 : <%=request.getParameter("inputDate")%></h4>
<hr>
<h1>EL을 이용해서 세팅된 속성(Attribute)값 출력하기</h1>
<ul>
<li> [작성법] : \${ key }</li>
<li> 기본 자료형 : ${score}</li>
<li> String(객체) : ${color}</li>
<li>
List(객체) : ${strList}
<ul>
<!-- EL -->
<li>${strList[0]}</li>
<li>${strList[1]}</li>
<li>${strList[2]}</li>
<li>${strList[3]}</li>
<!-- JSP -->
<li><%=request.getAttribute("strList")%></li>
<li><%=((List)request.getAttribute("strList")).get(0)%></li>
</ul>
</li>
</ul>
<li>
DTO(객체) : ${person}
<ul>
<li>이름 : ${person.getName()}</li>
<%-- EL : ${key.필드명}: getter를 자동으로 호출하여 값을 얻어옴 --%>
<li>이름 : ${person.name}</li>
<li>나이 : ${person.age}</li>
<li>키 : ${person.height}</li>
</ul>
</li>
<hr><hr>
<h1> empty 연산자 </h1>
<pre>
- \${empty 객체 | 배열 | 리스트}
- null 또는 빈칸 또는 비어있으면 true
아니면 false
- EL은 null을 빈칸으로 표현
-> null == ""(빈칸) == 비어있음(출력할 게 없어서 빈칸)
</pre>
<ul>
<li>String test1 = null; -> ${empty test1}</li>
<li>String test2 = ""; -> ${empty test2}</li>
<li>List<String> test3 = null; -> ${empty test3}</li>
<li>List<String> test4 = new ArrayList<>(); -> ${empty test4}</li>
<li>List<String> test5 = new ArrayList<>(); -> ${empty test5}</li>
</ul>
</body>
</html>
- Person DTO 클래스 (Servlet Container에서 req.setAttribute( )로 DTO 객체 추가 가능여부 확인 TEST용 클래스)
package edu.kh.jsp.dto;
public class Person {
private String name;
private int age;
private double height;
public Person() {}
public Person(String name, int age, double height) {
super();
this.name = name;
this.age = age;
this.height = height;
}
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;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", height=" + height + "]";
}
}
- 화면
1) EL을 이용해서 파라미터 출력
2) EL을 이용해서 세팅된 속성(Attribute) 값 출력
3) empty 연산자를 이용해서 값 출력
- Servlet / JSP 내장객체와 범위
- Servlet / JSP에는 4종류 범위를 나타내는 내장객체가 존재함
→ 각 종류마다 영향을 끼치는 범위가 달라짐
1) page (pageContext) : 현재 페이지
→ 현재 JSP 페이지에서만 사용 가능한 객체 (Servlet X)
2) request (요청)
→ 요청 받은 페이지(Servlet / JSP)와
위임 받은 페이지(Servlet / JSP)에서 유지되는 객체
3) session (접속)
→ session : 서버에 접속한 클라이언트를 나타내거나, 관련 정보를 get/set 할 수 있는 객체
(session 객체는 서버에서 관리함)
★ ★ session 객체는 브라우저마다 하나씩 생성됨 ★ ★
→ 유지 범위 : 사이트 접속 ~ 브라우저 종료 or 세션 만료되기 전까지
4) application (ServletContext)
→ 하나의 웹 애플리케이션마다 하나만 생성되는 객체 (Server를 키면 하나만 생성되는 객체)
→ application 객체는 어디서든 사용 가능함
→ 유지 범위 : 서버 실행 ~ 서버 종료 - scope 예시
- index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JSPProject2</title>
</head>
<body>
<ol>
<li>
<a href="scope">Servlet/JSP 내장 객체와 범위(scope)</a>
</li>
</ol>
</body>
</html>
- Servlet Container [ 1 ]
→ ScopeServlet
package edu.kh.jsp.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/scope")
public class ScopeServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// Scope 관련 내장 객체
// 1. page -> JSP에서 확인
//-------------------------------------------------------------------
// 2. request : 요청/위임 받은 페이지에서 유지
// (위임되는 동안 계속 유지, 최소 2페이지)
req.setAttribute("requestMessage", "requset scope 입니다.");
//--------------------------------------------------------------------
// 3. session : 클라이언트 브라우저당 1개
// 브라우저 종료 또는 session 만료 시까지 유지
// (브라우저 종료 전까지 어디서든 사용 가능)
// 3-1) session 범위 객체 얻어오기
HttpSession session = req.getSession();
// 3-2) session 객체에 값 세팅
session.setAttribute("sessionMessage", "session scope 입니다.");
//--------------------------------------------------------------------
// 4. application : 서버에 1개만 존재
// 서버 종료 시까지 유지
// (서버 종료 전까지 어디서든 사용 가능)
// 4-1) application scope 객체 얻어오기
ServletContext application = req.getServletContext();
// 4-2) application 객체에 값 세팅
application.setAttribute("applicationMessage", "application scope 입니다.");
//--------------------------------------------------------------------
// 5. 우선 순위 확인
// -> 모든 범위에 같은 key 값으로 속성 추가
req.setAttribute("str", "request scope에 세팅된 문자열");
session.setAttribute("str", "session scope에 세팅된 문자열");
application.setAttribute("str", "application scope에 세팅된 문자열");
//--------------------------------------------------------------------
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/scope.jsp");
dispatcher.forward(req, resp);
}
}
- JSP [ 1 ]
→ scope
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet/JSP 내장객체와 범위</title>
</head>
<body>
<h1>내장 객체 확인</h1>
<% // 스크립틀릿 : JSP에서 Java 코드를 작성하는 영역
// pageContext == page 범위(scope) 객체
pageContext.setAttribute("pageMessage", "page scope 입니다.");
%>
<ul>
<li>page : ${pageMessage}</li>
<li>request : ${requestMessage}</li>
<li>session : ${sessionMessage}</li>
<li>application : ${applicationMessage}</li>
<li><a href="scopeCheck">scope 확인하기</a></li>
</ul>
<hr>
<h1>우선 순위 확인</h1>
<% // page scope
pageContext.setAttribute("str", "page scope 입니다.");
%>
<h2>\${ key } : 4종류의 scope 객체를 범위가 좁은 순서대로 탐색해서
key가 일치하는 속성이 존재하면 출력
</h2>
<h2>${str}</h2>
<hr>
<h2>\${XXXScope.key} : XXX 자리에 scope를 작성하면
해당 scope에서 key가 일치하는 속성을 찾아서 출력
</h2>
<h4>${pageScope.str}</h4>
<h4>${requestScope.str}</h4>
<h4>${sessionScope.str}</h4>
<h4>${applicationScope.str}</h4>
</body>
</html>
- 화면
1) 내장객체 확인
2) 우선 순위 확인
3) ${XXXScope.key} 사용해서 해당 scope에서 key가 일치하는 속성 찾아서 출력
- Servlet Container [ 2 ]
→ ScopeCheckServlet
package edu.kh.jsp.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/scopeCheck")
public class ScopeCheckServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher dispatcher = req.getRequestDispatcher("/WEB-INF/views/scope_check.jsp");
dispatcher.forward(req, resp);
}
}
- JSP [ 2 ]
→ scope_check
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>scope 확인</title>
</head>
<body>
<h3>page : ${pageMessage}</h3>
<h3>request : ${requestMessage}</h3>
<h3>session : ${sessionMessage}</h3>
<h3>application : ${applicationMessage}</h3>
</body>
</html>
- 화면
- page scope : 현재 JSP 페이지에서만 사용 가능
- request scope
: 요청 / 위임 받은 페이지에서만 유지 (위임되는 동안 계속 유지 / 최소 2페이지)
: ScopeServlet.java / scope.jsp에서만 유지되므로 scope_check.jsp에서는 유지 X
- session : 클라이언트 브라우저당 1개
- application : 서버에 1개만 존재
'Server > Servlet & JSP' 카테고리의 다른 글
JSP 기본 개념 - 3 ( JSTL - JSP Standard Tag Library ) (0) | 2025.01.02 |
---|---|
JSP 기본 개념 - 1 (0) | 2025.01.01 |
Servlet 기본 개념 (0) | 2024.12.31 |