EL(Experession Language)이란?
저장 객체에서 값을 추출해서 출력하는 표현식을 말한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%= request.getAttribute("result") %>
${result}
</body>
</html>
이전 글을 보면 View에서 request.getAttribute("result")는 값을 꺼내는 역할만 하고
출력은 <%= %> 태그를 사용했었던 것을 기억할 것이다.
하지만 ${result}와 같이 EL을 사용한다면 값을 꺼내서 출력까지 할 수 있다.
이는 리스트를 사용할 때 더 편리하다.
EL을 사용하지 않고 자바 코드를 사용했다면 아래와 같이 표현할 수 있다.
// Controller
List list = new ArrayList(){"1", "test"};
request.setAttribute("list", list);
// View
((List)request.getAttribute("list")).get(0);
리스트에서 0번째인 것을 꺼낼 때 담겨진 것이 무엇이든 Object를 반환한다.
그렇게되면 get() 메소드를 사용할 수 없으므로 List로 형변환을 해서 get() 메소드를 사용할 수 있게 한다.
이는 복잡하기 때문에 EL을 사용한다면 ${list[0]}와 같이 짧고 간단하게 표현할 수 있다.
담겨진 것이 Array이든 List인 경우 더 쉽게 꺼낼 수 있는 것을 아래를 통해 확인할 수 있다.
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String[] names = {"apple", "banana"};
req.setAttribute("names", names);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${names[0]}<br/>
${names[1]}
</body>
</html>

배열에 담긴 값들이 잘 출력되는 것을 확인할 수 있다.
배열뿐만 아니라 Map에서도 편리하게 사용할 수 있다. 먼저 자바 코드를 사용한 예제를 보도록 하자.
// Controller
Map n = new HashMap("title", "제목");
request.setAttribute("n", n);
// View
((Map)request.getAttribute("n")).get("title");
Map도 마찬가지로 Object로 반환되기 때문에 Map으로 형변환을 거친 후에 title을 꺼낼 수 있다.
이 코드를 EL을 사용한다면 ${n.title}와 같이 정말 간단하게 값을 꺼내서 출력할 수 있다.
EL을 사용한 Map 예제는 아래와 같다.
package org.jsp.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, Object> notice = new HashMap<String, Object>();
notice.put("id", 1);
notice.put("title", "EL 사용해보기");
req.setAttribute("notice", notice);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${notice.id}<br/>
${notice.title}
</body>
</html>

Map 또한 EL을 통하여 값들이 잘 출력되는 것을 볼 수 있다.
일반적인 자바 코드를 사용하는 것보다 EL을 사용하는 것이 코드가 더 짧아 훨씬 간단하고 편리해진 것을
확인할 수 있다.
EL의 데이터 저장소
내장 객체 중 하나인 pageContext는 페이지 내에서 저장소로 쓸 수 있는 객체이다.
EL을 사용해서 뽑아낼 수 있는 것은 page 객체, request 객체, session 객체, application 객체이다.
만약에 여기서 ${result}의 result가 page에도 존재하고 request에도 존재하는 등
여러가지 객체에 존재하게 되면 어떻게 될까?
여기에는 우선 순위가 존재한다. 우선 순위에 따라 처음으로 찾는 저장 공간은 page이다.
여기에 result가 존재하지 않는다면 다음 저장소인 request에서 찾고
그 다음은 session, application에서 순서대로 찾게 된다.
그러면 내가 page에 있는 result 값이 아니라 request에 있는 result 값을 찾고 싶다면 어떻게 해야할까?
다른 곳은 찾지않고 내가 원하는 저장소만 찾게하라는 Scope 키워드가 있다.
내장 객체 | 설명 |
pageScope | Page 영역의 생명 주기에서 사용되는 저장소 |
requestScope | Request 영역의 생명 주기에서 사용되는 저장소 |
sessionScope | Session 영역의 생명 주기에서 사용되는 저장소 |
applicationScope | Application 영역의 생명 주기에서 사용되는 저장소 |
모든 곳을 찾는 것은 원하지 않고 특정한 곳에서만 값을 찾아 꺼내고 싶다면
위쪽 표의 내장 객체를 이용해서 ${requestScope.result}와 같이 사용할 수 있다.
아래의 코드를 통해 그 결과를 확인해보도록 하자.
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int num=0;
String num_=req.getParameter("num");
if(num_ != null && !num_.equals("")){
num=Integer.parseInt(num_);
}
String result="";
if(num%2!=0){
result = "홀수";
}else{
result = "짝수";
}
// result 값 저장
req.setAttribute("result", result);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%pageContext.setAttribute("result", "page 객체");%>
${result}<br/>
${requestScope.result}
</body>
</html>
Scope를 사용하지 않고 바로 ${result}를 사용하면
우선 순위가 더 높은 page 저장소에 있던 result인 "page 객체"가 출력되는 것을 확인할 수 있다.
그러고나서 requestScope를 사용해서 request 저장소에 있는 result를 찾는다면
결과는 "짝수"로 출력되는 것을 확인할 수 있다.

이외에도 다양한 저장소들이 있다.
내장 객체 | 설명 |
param | 파라미터 값을 저장하고 있는 저장소 |
paramValues | 파라미터 값을 배열로 저장하고 있는 저장소 |
header | Header 정보를 저장하고 있는 저장소 |
cookie | 쿠키 정보를 저장하고 있는 저장소 |
pageContext | 페이지 범위의 컨텍스트 저장소 |
이런 값들도 EL을 통해서 쉽게 얻을 수 있다.
${param.num}<br/>
${header.accept}

파라미터 값으로 넘겨준 3과 헤더의 accept 정보를 얻을 수 있는 것을 확인할 수 있다.
EL 연산자
연산자 | 뜻 |
>, gt | 크다 |
<, lt | 작다 |
>=, ge | 크거나 같다 |
<=, le | 작거나 같다 |
==, eq | 같다 |
<>, ne | 같지 않다 |
empty | 값이 비어 있다 |
not empty | 값이 존재한다 |
?: | 조건?참일경우 실행할 내용:거짓일 경우 실행할 내용 |
우리가 잘 알고있는 크기를 비교하는 연산자(>, <와 같은 부등호)를 사용하면 되는데
왜 gt, lt와 같은 연산자를 사용해야만 할까? 그 이유는 우리가 사용하는 HTML에 있다.
HTML 자체가 <>를 가지고 있기 때문에 <> 안에서 부등호를 사용하는 것은 바람직하지 않다고 할 수 있으며
오류가 발생할 수도 있기 때문에 부등호보다는 gt, lt와 같은 기호화된 연산자를 사용하는 것이 좋다.
나머지 연산자를 예제를 통해 마저 살펴보도록 하자.
${empty param.num}<br/>
${not empty param.num}<br/>
${empty param.num ? "값이 비어있음" : param.num }<br/>
${param.num/2}
empty 연산자는 param.num == null || param.num = ""과 같은 의미라고
할 수 있다. (값이 비어있다면 true)
주소창에서 ?num=을 이용해서 파라미터를 넘겨줄 때 아예 넘겨주지 않거나
?num=만 보낼 때 true로 출력된다.
not empty는 반대의 의미이므로 반대로 출력될 것이고 (값이 비어있지 않다면 true)
삼항연산자(?:)는 값이 비어있다면 "값이 비어있음"이 출력되고
파라미터를 제대로 넘겨주었다면 그 값이 출력되는 것을 확인할 수 있다.
마지막으로 나누기를 했을 때 이 값은 어떻게 출력될까?
웹의 파라미터는 모두 문자열이라고 했기 때문에 나누기를 했을 때 오류가 날까?
아니면 제대로 된 값인 1.5가 나올까? 그렇지도 않다면 정수값인 1이 출력될까?
결과는 스크립트 언어이기 때문에 여기서는 자동으로 형변환을 해주므로 문자열로 취급되는 것이 아니라
제대로 된 값인 1.5가 출력되는 것을 확인할 수 있다.
만약 정수 부분인 1만 출력하고 싶다면 Integer.parseInt()와 같은 별도 처리가 필요하다.


'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
JSP에서 Oracle 사용하기 (0) | 2023.07.16 |
---|---|
JSP의 페이지 지시자를 이용한 인코딩 (0) | 2023.07.15 |
JSP MVC Model1과 Model2 (0) | 2023.07.09 |
내장 객체 메소드 (0) | 2023.07.08 |
Jasper와 다양한 JSP 태그들 (0) | 2023.07.06 |
EL(Experession Language)이란?
저장 객체에서 값을 추출해서 출력하는 표현식을 말한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%= request.getAttribute("result") %>
${result}
</body>
</html>
이전 글을 보면 View에서 request.getAttribute("result")는 값을 꺼내는 역할만 하고
출력은 <%= %> 태그를 사용했었던 것을 기억할 것이다.
하지만 ${result}와 같이 EL을 사용한다면 값을 꺼내서 출력까지 할 수 있다.
이는 리스트를 사용할 때 더 편리하다.
EL을 사용하지 않고 자바 코드를 사용했다면 아래와 같이 표현할 수 있다.
// Controller
List list = new ArrayList(){"1", "test"};
request.setAttribute("list", list);
// View
((List)request.getAttribute("list")).get(0);
리스트에서 0번째인 것을 꺼낼 때 담겨진 것이 무엇이든 Object를 반환한다.
그렇게되면 get() 메소드를 사용할 수 없으므로 List로 형변환을 해서 get() 메소드를 사용할 수 있게 한다.
이는 복잡하기 때문에 EL을 사용한다면 ${list[0]}와 같이 짧고 간단하게 표현할 수 있다.
담겨진 것이 Array이든 List인 경우 더 쉽게 꺼낼 수 있는 것을 아래를 통해 확인할 수 있다.
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String[] names = {"apple", "banana"};
req.setAttribute("names", names);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${names[0]}<br/>
${names[1]}
</body>
</html>

배열에 담긴 값들이 잘 출력되는 것을 확인할 수 있다.
배열뿐만 아니라 Map에서도 편리하게 사용할 수 있다. 먼저 자바 코드를 사용한 예제를 보도록 하자.
// Controller
Map n = new HashMap("title", "제목");
request.setAttribute("n", n);
// View
((Map)request.getAttribute("n")).get("title");
Map도 마찬가지로 Object로 반환되기 때문에 Map으로 형변환을 거친 후에 title을 꺼낼 수 있다.
이 코드를 EL을 사용한다면 ${n.title}와 같이 정말 간단하게 값을 꺼내서 출력할 수 있다.
EL을 사용한 Map 예제는 아래와 같다.
package org.jsp.controller;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Map<String, Object> notice = new HashMap<String, Object>();
notice.put("id", 1);
notice.put("title", "EL 사용해보기");
req.setAttribute("notice", notice);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${notice.id}<br/>
${notice.title}
</body>
</html>

Map 또한 EL을 통하여 값들이 잘 출력되는 것을 볼 수 있다.
일반적인 자바 코드를 사용하는 것보다 EL을 사용하는 것이 코드가 더 짧아 훨씬 간단하고 편리해진 것을
확인할 수 있다.
EL의 데이터 저장소
내장 객체 중 하나인 pageContext는 페이지 내에서 저장소로 쓸 수 있는 객체이다.
EL을 사용해서 뽑아낼 수 있는 것은 page 객체, request 객체, session 객체, application 객체이다.
만약에 여기서 ${result}의 result가 page에도 존재하고 request에도 존재하는 등
여러가지 객체에 존재하게 되면 어떻게 될까?
여기에는 우선 순위가 존재한다. 우선 순위에 따라 처음으로 찾는 저장 공간은 page이다.
여기에 result가 존재하지 않는다면 다음 저장소인 request에서 찾고
그 다음은 session, application에서 순서대로 찾게 된다.
그러면 내가 page에 있는 result 값이 아니라 request에 있는 result 값을 찾고 싶다면 어떻게 해야할까?
다른 곳은 찾지않고 내가 원하는 저장소만 찾게하라는 Scope 키워드가 있다.
내장 객체 | 설명 |
pageScope | Page 영역의 생명 주기에서 사용되는 저장소 |
requestScope | Request 영역의 생명 주기에서 사용되는 저장소 |
sessionScope | Session 영역의 생명 주기에서 사용되는 저장소 |
applicationScope | Application 영역의 생명 주기에서 사용되는 저장소 |
모든 곳을 찾는 것은 원하지 않고 특정한 곳에서만 값을 찾아 꺼내고 싶다면
위쪽 표의 내장 객체를 이용해서 ${requestScope.result}와 같이 사용할 수 있다.
아래의 코드를 통해 그 결과를 확인해보도록 하자.
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
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("/spag")
public class spagController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int num=0;
String num_=req.getParameter("num");
if(num_ != null && !num_.equals("")){
num=Integer.parseInt(num_);
}
String result="";
if(num%2!=0){
result = "홀수";
}else{
result = "짝수";
}
// result 값 저장
req.setAttribute("result", result);
RequestDispatcher rd = req.getRequestDispatcher("spag.jsp");
rd.forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%pageContext.setAttribute("result", "page 객체");%>
${result}<br/>
${requestScope.result}
</body>
</html>
Scope를 사용하지 않고 바로 ${result}를 사용하면
우선 순위가 더 높은 page 저장소에 있던 result인 "page 객체"가 출력되는 것을 확인할 수 있다.
그러고나서 requestScope를 사용해서 request 저장소에 있는 result를 찾는다면
결과는 "짝수"로 출력되는 것을 확인할 수 있다.

이외에도 다양한 저장소들이 있다.
내장 객체 | 설명 |
param | 파라미터 값을 저장하고 있는 저장소 |
paramValues | 파라미터 값을 배열로 저장하고 있는 저장소 |
header | Header 정보를 저장하고 있는 저장소 |
cookie | 쿠키 정보를 저장하고 있는 저장소 |
pageContext | 페이지 범위의 컨텍스트 저장소 |
이런 값들도 EL을 통해서 쉽게 얻을 수 있다.
${param.num}<br/>
${header.accept}

파라미터 값으로 넘겨준 3과 헤더의 accept 정보를 얻을 수 있는 것을 확인할 수 있다.
EL 연산자
연산자 | 뜻 |
>, gt | 크다 |
<, lt | 작다 |
>=, ge | 크거나 같다 |
<=, le | 작거나 같다 |
==, eq | 같다 |
<>, ne | 같지 않다 |
empty | 값이 비어 있다 |
not empty | 값이 존재한다 |
?: | 조건?참일경우 실행할 내용:거짓일 경우 실행할 내용 |
우리가 잘 알고있는 크기를 비교하는 연산자(>, <와 같은 부등호)를 사용하면 되는데
왜 gt, lt와 같은 연산자를 사용해야만 할까? 그 이유는 우리가 사용하는 HTML에 있다.
HTML 자체가 <>를 가지고 있기 때문에 <> 안에서 부등호를 사용하는 것은 바람직하지 않다고 할 수 있으며
오류가 발생할 수도 있기 때문에 부등호보다는 gt, lt와 같은 기호화된 연산자를 사용하는 것이 좋다.
나머지 연산자를 예제를 통해 마저 살펴보도록 하자.
${empty param.num}<br/>
${not empty param.num}<br/>
${empty param.num ? "값이 비어있음" : param.num }<br/>
${param.num/2}
empty 연산자는 param.num == null || param.num = ""과 같은 의미라고
할 수 있다. (값이 비어있다면 true)
주소창에서 ?num=을 이용해서 파라미터를 넘겨줄 때 아예 넘겨주지 않거나
?num=만 보낼 때 true로 출력된다.
not empty는 반대의 의미이므로 반대로 출력될 것이고 (값이 비어있지 않다면 true)
삼항연산자(?:)는 값이 비어있다면 "값이 비어있음"이 출력되고
파라미터를 제대로 넘겨주었다면 그 값이 출력되는 것을 확인할 수 있다.
마지막으로 나누기를 했을 때 이 값은 어떻게 출력될까?
웹의 파라미터는 모두 문자열이라고 했기 때문에 나누기를 했을 때 오류가 날까?
아니면 제대로 된 값인 1.5가 나올까? 그렇지도 않다면 정수값인 1이 출력될까?
결과는 스크립트 언어이기 때문에 여기서는 자동으로 형변환을 해주므로 문자열로 취급되는 것이 아니라
제대로 된 값인 1.5가 출력되는 것을 확인할 수 있다.
만약 정수 부분인 1만 출력하고 싶다면 Integer.parseInt()와 같은 별도 처리가 필요하다.


'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
JSP에서 Oracle 사용하기 (0) | 2023.07.16 |
---|---|
JSP의 페이지 지시자를 이용한 인코딩 (0) | 2023.07.15 |
JSP MVC Model1과 Model2 (0) | 2023.07.09 |
내장 객체 메소드 (0) | 2023.07.08 |
Jasper와 다양한 JSP 태그들 (0) | 2023.07.06 |