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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值