[JSP] EL
참고
- Expression Language for Java EE 6 by oracle
- Expression Language for Java EE 7 by oracle
- [JSP] EL 2.2 by noritersand
- JSP - EL 표현식 문법과 사용 방법 by Knowledge Repository
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}