[JSP] EL

Published: by Creative Commons Licence

참고

EL Expression Language

EL은 간단한 표현식으로 자바데이터를 동적으로 얻을 수 있다. 그 중 즉각적인 평가식(${ })을 주로 사용하는데 템플릿 텍스트 혹은 태그속성 값 사이에서만 사용 가능하고 읽기전용으로 값을 변경할 수는 없다.

[참고] 즉각적인 평가식과 지연된 평가식

즉각적인 평가식이란 페이지가 렌더링 되자마자 평가가 되어 결과를 리턴하는 것에 비해 지연된 평가식(#{expr})이란 시스템에서 페이지의 라이프 사이클 동안에 적절한 때가 오면 평가를 하는 것을 의미한다. 참고만 하자.

값 표현식

정적인 텍스트 사이에서 값을 산출하거나 값을 세팅하는데 사용할 수 있다. 자바빈 객체의 이름을 이용해 객체의 프로퍼티나 속성을 참조할 수 있다.
못 찾으면 null을 리턴한다.

객체 참조

.혹은 [ ]를 이용해 객체의 속성에 접근할 수 있다. 단, [ ]를 이용할 때 내부는 문자열로 속성명을 써야 한다.

${customer.name}
${customer["name"]}

배열, 리스트 참조

${customer.orders[1]}
${customer.orders.socks}

맵 참조

${customer.orders["socks"]}

리터럴 표현식

문자열 : ${"literal"}
Boolean : ${true} or ${false}
Integer : ${21}
Floating-point : ${2.021}
Null : ${null}

문자열과 함쎄 쓰이는 이스케이프 문자

" -> \"
' -> \'
\ -> \\

람다 표현식

매개변수와 함께 쓰이는 값 표현식으로 EL 3.0에 새로 포함되어 있다.

${ ([매개변수1], [매개변수2], [...]) -> 표현식 }

${ x -> x+1 }
${ (x, y) -> x + y }
${ () -> 64 }

즉시 호출을 하려면 아래와 같은 형식으로 작성한다.

${ (([매개변수1], [매개변수2], [...]) -> 표현식)([인수1], [인수2], [...]) }

${ ((x, y) -> x + y)(3, 4) }

혹은 할당 및 세미콜론연산자와 함께 람다식을 이용할 수 있다. 변수 v(x, y) -> x + y 함수를 할당하고 세미콜론으로 구분한 뒤, v(3,4)로 매개변수와 함께 호출한다.

${ v = (x, y) -> x + y; v(3, 4) }

스트림 Stream

EL은 sets, lists, maps 과 같은 컬렉션 객체도 지원한다.
컬렉션 객체를 동적으로 생성하기도 하고 스트림과 파이프 라인을 사용해 생성된 데이터를 사용하여 또 다른 작업(chaining)을 할수 있다.
stream()로 자바 컬렉션이나 자바배열을 결과로 얻는데 이 작업으로 원본 컬렉션 객체가 수정되지는 않는다.
람다 표현식과 같이 자바 8 버전에서 사용 가능. EL 3.0 포함

books.stream().filter(b->b.category == 'history')
              .map(b->b.title)
              .toList()
<c:out value="${[1,3,5,2].stream()
                          .sorted()
                          .toList()
                          .toString() }"></c:out>
<!--  [1, 2, 3, 5] -->

EL을 지원하는 메서드

참고 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

allMatch
anyMatch
average
count
distinct
filter
findFirst
flatMap
forEach
iterator
limit
map
max
min
noneMatch
peek
reduce
sorted
substream
sum
toArray
toList

연산자

우선순위가 높은 순서대로 정렬

종류 연산자 설명
  [ ] 자바빈의 프로퍼티 참조, 이넘 인스턴스, 컬렉션의 항목, 암시적인 객체의 속성을 표기할때 사용
  . 자바빈의 프로퍼티 참조, 이넘 인스턴스, 컬렉션의 항목, 암시적인 객체의 속성을 표기할때 사용
  ( ) 연산자의 우선순위를 변경할때 사용
산술 연산자 - (단항)  
논리 연산자 not 또는 !  
Empty empty null 혹은 empty 일때 사용 가능
산술 연산자 *  
산술 연산자 / 또는 div  
산술 연산자 % 또는 mod  
산술 연산자 +  
산술 연산자 - (다항)  
String concatenation += 3.0 추가
관계 연산자 < 또는 lt 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
관계 연산자 > 또는 gt 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
관계 연산자 <= 또는 le 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
관계 연산자 >= 또는 ge 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
관계 연산자 == 또는 eq 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
관계 연산자 != 또는 ne 다른 값이나 boolean, 문자열, 정수 또는 부동 소수점 리터럴에 대해 비교 가능
논리 연산자 && 또는 and  
논리 연산자 \|\| 또는 or  
삼항 연산자 ? :  
Lambda expression -> 3.0 추가
할당 = 3.0 추가
세미콜론 ; 3.0 추가

예약어

  • and, or, not
  • eq, ne
  • lt, gt, le, ge
  • true, false
  • null, instanceof, empty
  • div, mod

예시

EL Expression Result
${1 > (4/2)} FALSE
${4.0 >= 3} TRUE
${100.0 == 100} TRUE
${(10*10) ne 100} FALSE
${'a' < 'b'} TRUE
${'hip' gt 'hit'} FALSE
${4 > 3} TRUE
${1.2E4 + 1.4} 12001.4
${3 div 4} 0.75
${10 mod 4} 2
${((x, y) -> x + y)(3, 5.5)} 8.5 (람다 표현식 3.0 추가)
[1,2,3,4].stream().sum() 10 (컬렉션 오브젝트 작업(체인) 3.0 추가)
[1,3,5,2].stream().sorted().toList() [1, 2, 3, 5] (컬렉션 오브젝트 작업(체인) 3.0 추가)
${!empty param.Add} False if the request parameter named Add is null or an empty string.
${pageContext.request.contextPath} The context path.
${sessionScope.cart.numberOfItems} The value of the numberOfItems property of the session-scoped attribute named cart.
${param['mycom.productId']} The value of the request parameter named mycom.productId.
${header["host"]} The host.
${departments[deptName]} The value of the entry named deptName in the departments map.
${requestScope['javax.servlet.forward.servlet_path']} The value of the request-scoped attribute named javax.servlet.forward.servlet_path.

page, request, session, and application scopes

검색 범위를 지정할 수 있다. 만약 지정되지 않는다면 해당 스코프 관련 보관소 뿐만 아니라 모든 보관소를 다 찾는다.

이름 보관소
pageScope JspContext
requestScope ServletRequest
sessionScope HttpSession
applicationScope ServletContext

자바로 검색범위를 표현하게 되면 아래와 같다.

Customer obj = (Customer) request.getAttribute("customer");
String value = obj.getName()

하지만 EL을 이용하명 아래와 같이 간결하게 표기할 수 있다.

${스코프.객체.속성}
${requestScope.customer.name}