목차

Expression Language

개요

Spring Web Flow는 데이타 모델 및 action실행을 위해 Expression Language(EL)을 이용한다.

설명

지원하는 EL 구현체

Unified EL과 OGNL(Object Graph Navigation Language)을 사용할 수 있다. Unified EL과 OGNL은 비슷한 문법을 가지고 있다.
Spring Web Flow에는 Unified EL만을 사용하는 것을 권장한다.

Unified EL

기본으로는 Unified EL을 사용하도록 되어 있다. jboss-el이 기본 구현체로 되 있다.

참고 : web 컨테이너에서는 일반적으로 el-api를 지원하고 있다.

OGNL

ONGL은 SWF2에서 제공하는 또 다른 EL. 클래스패스에 추가하면 사용할 수 있다..

EL 사용법

Flow에서 EL 사용하는 경우

Flow에 의해 보여지는 View는 EL을 사용해서 Flow 데이터 구조에 접근하게 됨.

표현 타입

표준 eval 표현

가장 일반적인 방법은 eval 표현으로 이 경우 ${}나 #{}을 사용하면 안 됨. 이 예는 searchCriteria에 있는 nextPage() 호출.

<evaluate expression="searchCriteria.nextPage()" />
표현 템플릿

다음은 “template” 표현식으로 아래와 같은 형태로 ${} 을 사용할 수 있다.

<view-state id="error" view="error-${externalContext.locale}.xhtml" />

externalContext 에 세팅되어 있는 locale 결과를 대체하여 error-결과.xhtml 로 생성된다.

특별한 EL 변수

Scope
<evaluate expression="searchService.findHotel(hotelId)" result="flowScope.hotel" />
<on-render>
  <evaluate expression="searchService.findHotels(searchCriteria)" result="viewScope.hotels" result-type="dataModel" />
</on-render>
<set name="requestScope.hotelId" value="requestParameters.id" type="long" />
<set name="flashScope.statusMessage" value="'Booking confirmed'" />

converation 변수에 할당. 최상위 Flow가 시작할 때 할당되며, 최상위 Flow가 종료될 때 정리. 최상위 Flow의 자식 Flow에서 공유. HTTP session에 저장되며, 세션 복제를 할 경우를 대비해 Serizalizable를 구현해야 함.

<evaluate expression="searchService.findHotel(hotelId)" result="conversationScope.hotel"/>
context
<evaluate expression="bookingValidator.validate(booking, messageContext)" />
<evaluate expression="searchService.suggestHotels(externalContext.sessionMap.userProfile)" result="viewScope.hotels" />
그 외
<set name="requestScope.hotelId" value="requestParameters.id" type="long" />
<evaluate expression="booking.guests.add(currentEvent.guest)" />
<evaluate expression="bookingService.createBooking(hotelId, currentUser.name)" result="flowScope.booking" />
<set name="flashScope.successMessage" value="resourceBundle.successMessage" />

범위 검색 알고리즘

특정 범위에 변수를 할당할 때는 반드시 범위를 명시해야 한다.

<set name="requestScope.hotelId" value="requestParameters.id" type="long" />

특정 범위에 있는 변수에 접근할 때는 꼭 범위를 명시할 필요는 없다.

<evaluate expression="entityManager.persist(booking)" />

booking처럼 범위를 명시하지 않은 경우, 범위 검색 알고리즘(scope searching algorithm)이 동작하며,
이 알고리즘은 request→flash→view→flow→conversation 범위의 순서로 찾게 된다. 없을 경우 EvaluationException 발생.
아래그림은 검색되는 Scope 순서를 잘 보여주고 있다.

참고자료