3 분 소요

EL(Expression Language)와 JSTL(Jsp Standard Tag Library)를 이용하면 JSP에서 HTML과 자바 코드를 완전히 분리할 수 있다고 한다. 이 페이지에서는 그 중 EL에 대해 살펴보겠다.

EL (Expression Language)

EL은 주로 출력을 위한 언어이다. 문법은 ${식} 의 형태를 띤다. 이 문법 안에 표현식을 작성하면 그 표현식이 화면에 출력되는 방식이다.

해당 식에는 단순히 데이터를 입력하여 화면에 출력할 수도 있고, 연산식도 사용하여 그 결과를 화면에 출력할 수도 있다. 다음은 EL을 이용하여 여러 가지 데이터를 출력하는 간단한 예제이다.

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<ol>
		<li>${ 10 }</li> <!-- 단순한 정수, 실수 출력 -->
		<li>${ 3.14 }</li>
		<li>${ 100 + 1 }</li> <!-- 연산식의 결과도 출력 가능! -->
		<li>${ 100 / 10 }</li>
		<li>${ "wow" == "wow" }</li>
		<li>${ "wow" eq "wow" }</li>  <!-- == 대신 eq 사용 가능 -->
		<li>${ 12 lt 5 }</li>  <!-- < 대신 lt 사용 가능  -->
		<li>${ 12 gt 5 }</li> <!-- > 대신 gt 사용 가능 -->
		<li>${ 12 lt 12 }</li> <!-- 등호(=) 포함 안됨. 등호 포함  ge, le를 대신 사용 -->
		<li>${ 12 gt 12 }</li>
		<li>${ "good!" }</li> <!-- 문자열 출력 -->
		<% String name = null; %>
		
		<!-- empty var : var가 null 또는  값인가? boolean형으로 반환됨 -->
		<li>${empty name }</li>
	</ol>
</body>
</html>

elBasic.jsp

elBasic.jsp 화면 출력결과

elBasic.jsp 화면 출력결과

참고로, EL에서는 원래 자바 언어에서 쓰이는 여러 연산자를 키워드로도 사용할 수 있는데, 다음과 같다.

기존 연산자 기호 EL 제공 키워드
&& and
|| or
! not
== eq
!= ne
< lt
> gt
<= ge
>= le
(var == null || var == “”) ? true : false empty
null null
true/false true/false

그 외 EL의 특징은 다음과 같다.

  • JSTL과 혼용 가능. 반면 스크립트 태그와는 혼용 불가능.
  • 화면 출력에 특화되어 있다. 따라서 반복문 등의 다른 기능들은 가지고 있지 않다. 이로 인해 EL은 보통 반복문 등의 여러 기능들을 제공해주는 JSTL과 같이 사용하는 편이라고 한다.
  • 의도치 않게 null값이 나와도 null값을 출력하지 않는다.
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>출력: ${ requestScope.noData }</p>
</body>
</html>

nullTest.jsp

스크린샷 2024-09-20 153610.png

Implicit Objects (내장 객체)

EL에서도 JSP에서의 내장 객체들을 사용할 수 있다.

  • scope object
    • pageScope : page context 내 저장된 name-value 쌍 데이터 접근 가능.
    • requestScope : request context 내 저장된 name-value 쌍 데이터 접근 가능.
    • sessionScope : session context 내 저장된 name-value 쌍 데이터 접근 가능.
    • applicationScope : application context 내 저장된 name-value 쌍 데이터 접근 가능.
  • 그 외
    • param : request.getParameter(name)${param.name} 과 같이 사용 가능.
    • paramValues : request.getParameterValues(name)${paramValues.name} 과 같이 사용 가능.
    • header
    • headerValues
    • cookie
    • initParam

다음은 requestScope를 이용한 예제이다.

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		request.setAttribute("userName", "kimquel");
	%>
	<p><%= request.getAttribute("userName") %></p>
	<p>${ requestScope.userName }</p>
</body>
</html>

implicitObject.jsp

스크린샷 2024-09-20 093047.png

위 코드에서 스크립트 태그 표현식과 EL 내 표현식은 동일하다. 여기서 requestScope 는 생략 가능하며, ${userName} 과 같이 사용할 수 있다.

만약 생략 시 컴파일러는 자동적으로 page → request → session → application 순으로 context 내 데이터를 찾는다고 한다. 이 말은 다시 말하면 생략 시 실행 성능이 떨어진다는 뜻이니 되도록 생략하지 않는 것이 좋겠다.

다음은 param을 이용한 예제이다.

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="paramStudy.jsp" method="post">
		<p>유저 닉네임: <input type="text" name="userName"></p>
		<input type="submit" value="전송" />
	</form>
</body>
</html>

paramRequest.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		request.setCharacterEncoding("utf-8");
		String userName = request.getParameter("userName");
	%>
	<p><%= userName %>님 환영합니다.</p>
	<p>${ param.userName }님 환영합니다.</p>
</body>
</html>

paramStudy.jsp

paramRequest.jsp를 실행하면 다음의 결과를 얻는다.

스크린샷 2024-09-20 141416.png

스크린샷 2024-09-20 141420.png

스크립트 태그를 이용했으면 request.getParameter("userName"); 이라 했을 것을 EL에서는 ${param.userName} 이라고 간단하게 표현할 수 있게 된다.

또한, 객체.프로퍼티 형태는 객체["프로퍼티"] 로도 표현할 수 있다. 위 예제의 경우 ${param["userName"]} 으로 표현해도 같은 결과가 나온다.

EL with Java Bean

java bean도 EL에서 출력할 수 있다. 이 경우, getter 메서드의 ‘get’ 이름만 빠지고, 첫 영단어의 첫 글자를 소문자로 쓰면 된다. 즉, Inst.getName()${Inst.name} 과 같이 사용할 수 있다.

다음은 java bean 클래스를 정의하고, 이를 EL로 출력하는 예제이다.

package myclasses;

public class UserDto {
	private String userName = null;
	private String email = null;
	
	public String getUserName() {
		return userName;
	}
	
	public void setUserName(String userName) {
		this.userName = userName;
	}
	
	public String getEmail() {
		return email;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
	
}

UserDto.java

<%@page import="myclasses.UserDto"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		UserDto user = new UserDto();
		user.setUserName("kimquel");
		user.setEmail("kimquel@sql.com");
		request.setAttribute("user", user);
		
		UserDto oneUser = (UserDto)request.getAttribute("user");
	%>
	<p>닉네임: <%= oneUser.getUserName() %></p>
	<p>유저 이메일: <%= oneUser.getEmail() %> </p>
	<hr/>
	<p>닉네임: ${ requestScope.user.userName }</p>
	<p>유저 이메일: ${ requestScope.user.email }</p>
</body>
</html>

beanStudy.jsp

스크린샷 2024-09-20 152936.png


References

[1] 에이콘아카데미(강남) 강의

[2] 채규태, “채쌤의 Servlet&JSP 프로그래밍 핵심”, (쌤즈, 2023)

[3] EL 관련 문서

Expression Language

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

This content is licensed under CC BY-NC 4.0

댓글남기기