Spring Web Flow —— EL表達式 - 101

  1. 文章中內容並沒有全部驗證,僅作爲參考
  2. 上下文一起看,才能明白其中的意思

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章