- 文章中內容並沒有全部驗證,僅作爲參考
- 上下文一起看,才能明白其中的意思
Web Flow中EL表達式作用
web-flow使用EL表達式訪問flow的model和調用方法。在web-flow中EL表達式主要有如下四種用途
- 訪問客戶端(瀏覽器)數據,比如request的parameter
- 訪問web-flow的RequestContex,比如flowScope和currentEvent等
- 調用Spring管理的bean的方法
- 解析表達式(相對於普通表達式)可以解析注入子流程id,view的名稱,
EL表達式分類
web-flow中EL表達式按照按使用形式分爲兩類
- 標準表達式
不需要加#{},直接按照一般程序一樣寫就行了,如果硬要加#{},則會報錯
// 調用searchCriteria對象的nextPage()方法
// searchCriteria對象可以是Spring中的一個bean,也可以是flow上下文中的一個變量
<evaluate expression="searchCriteria.nextPage()" />
- 模板表達式
需要加#{},這種表達式允許將常量和表達式寫在一起,如下這種,最後的view名稱是拼出來的
<view-state id="error" view="error-#{externalContext.locale}.xhtml" />
Web Flow支持的EL表達式
Web Flow支持spring EL表達式,Unified表達式,以及OGNL表達式
- Spring EL
從web-flow 2.1開始就使用了Spring EL表達式,該表達式在Spring的全系列產品中都可以使用。使用它只需要在類路徑下包含一個單獨的jar包org.springframework.expression
。 並且如果以前使用的EL表達式或者ognl的表達式,還需要將他們的包去除。 - Unified EL
在we-flow 2.0時期默認使用的是統一EL表達式,org.jboss.el
提供,該包還需要j2ee提供的el-api
(一般的容器都會自動提供)。雖然目前版本的Spring EL表達式是默認和推薦使用的,但也可以手動更換爲Unified EL表達式。只需加上如下配置即可
// 該配置方法在前面講配置時給過示例
<webflow:flow-builder-services expression-parser="expressionParser"/>
<bean id="expressionParser" class="org.springframework.webflow.expression.el.WebFlowELExpressionParser">
<constructor-arg>
<bean class="org.jboss.el.ExpressionFactoryImpl" />
</constructor-arg>
</bean>
- OGNL
2.4及以後的版本中,已經非常不推薦使用OGNL表達式了。那還是在web-flow 1.0時代標配的是OGNL表達式,如果硬要使用OGNL表達式,還是可以配置,方法請參考教程
EL表達式遷移(Unified EL -> Spring EL)
從Unified EL表達式和OGNL表達式遷移到Spring EL表達式需要注意以下幾點
- EL表達式的符號從${ }變化成了#{ }
- 針對current Event的比較由
#{currentEvent == 'submit'}
要換成#{currentEvent.id == 'submit'}
- 直接解析屬性如
#{currentUser.name}
可能造成空指針異常,以前的檢查方式是:#{currentUser != null ? currentUser.name : null}
, 目前更好的方式:#{currentUser?.name}
更加詳細的EL相關內容,看這裏
一些內建的Spring EL變量
內建代表系統自動創建並管理,用戶可以直接通過EL表達式訪問
重要原則
只有當分配一個新的變量時纔會用到默認存在的作用域變量(flowScope, viewScope, requestScope, etc), 後面使用時就不需要指定作用域變量了。
<!-- 聲明modelMap變量,必須顯式指定作用域 -->
<evaluate expression="flowController.performSearch(searchForm)" result="flashScope.modelMap"/>
... ...
<!-- 使用modelMap變量不用指定作用域 -->
<evaluate expression="flowController.performResult(modelMap)"/>
作用域
前面在講變量時已經講過作用域(看這裏),這裏提一下,不要忘了。
內建變量窮舉
- requestParameters
獲取客戶端的請求參數 - currentEvent
可以獲取當前的Event對象 - currentUser
獲取當前被授權的用戶,即Principal對象 - messageContext
可以訪問當前的上下文,包括錯誤和成功的信息,詳見MessageContext的javaDoc - resourceBundle
訪問資源文件 - flowRequestContext
訪問當前flow的RequestContext對象 ,它是當前flow的請求信息對象,詳見RequestContext的javaDoc - flowExecutionContext
訪問FlowExecutionContext對象,存儲了當前flow的狀態 - flowExecutionUrl
訪問當前view的相對路徑,可以在view-state中指定的jsp中進行使用 - externalContext
可以獲取客戶端的環境信息,包括sessino屬性,詳見ExternalContext JavaDoc
Spring EL查找變量的邏輯
當使用flow中聲明的變量時,並不需要指定作用域,web flow會自動從各作用域,按照如下順序進行查找,如果找不到,則報EvaluationException
異常
requestScope -> flashScope -> viewScope -> flowScope -> conversationScope