Spring表达式语言(简称SpEL)是一种鱼JSP2 EL功能类似的变道时语言,它可以在运行时查询和操作对象图。与JSP 2的EL相比,SpEL功能更加强大,它甚至支持方法的调用和基本字符串模板。

  SpEL可以独立Spring容器使用——只是当初简单的表达式语言来使用;也可以在Annotation或XML配置中使用SpEL,这样可以充分利用SpEL简化Spring Bean的配置。

  Spring的SpEL可以单独使用,可以使用SpEL对表达式计算,求值。SpEL主要提供如下两个重要的接口。

  》ExpressionParser:该接口的实例负责解析一个SpEL表达式,返回一个Expression对象。

  》Expression: 该接口的实例代表一个表达式。

  Expression实例代表一个表达式,它包含了如下方法可用于计算,得到表达式的值。

  》Object getValue():计算表达式的值。

  》<T>T getValue(Class<T> desiredResultType):计算表达式的值,而且尝试将该表达式的值当成desiredResultType类型处理。

  》Object getValue(EvaluationContext context):使用指定的EvaluationContext来计算表达式的值

  》<T> T getValue(EvaluationContext context, Class<T> desiredResultType):使用指定EvaluationContext来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理

  》Object getValue(Object rootObject):以rootObject作为表达式的root对象来计算表达式的值。

  》<T> getValue(Object rootObject, Class<T> desiredResultType):以rootObject作为表达式的root对象来计算表达式的值。而且尝试将该表达式的值当成desiredResultType类型处理。

  下面的程序示范了如何利用ExpressionParser和Expression来计算表达式的值

 import org.springframework.expression.*;
import org.springframework.expression.spel.standard.*;
import org.springframework.expression.spel.support.*; import java.util.*; public class SpELTest
{
public static void main(String[] args)
{
//创建一个ExpressionParser对象,用于解析表达式
ExpressionParser parser = new SpelExpressionParser();
//最简单的字符串表达式
Expression exp = parser.parseExpression("'HelloWorld'");
System.out.println("'HelloWorld'的结果: " + exp.getValue());
//调用方法的表达式
exp = parser.parseExpression("'HelloWorld'.concat('!')");
System.out.println("'HelloWorld'.concat('!')的结果: "
+ exp.getValue());
//调用对象的getter方法
exp = parser.parseExpression("'HelloWorld'.bytes");
System.out.println("'HelloWorld'.bytes的结果: "
+ exp.getValue());
//访问对象的属性(d相当于HelloWorld.getBytes().length)
exp = parser.parseExpression("'HelloWorld'.bytes.length");
System.out.println("'HelloWorld'.bytes.length的结果:"
+ exp.getValue());
//使用构造器来创建对象
exp = parser.parseExpression("new String('helloworld')"
+ ".toUpperCase()");
System.out.println("new String('helloworld')"
+ ".toUpperCase()的结果是: "
+ exp.getValue(String.class)); Person person = new Person(1 , "孙悟空", new Date());
exp = parser.parseExpression("name");
//以指定对象作为root来计算表达式的值
//相当于调用person.name表达式的值
System.out.println("以persn为root,name表达式的值是: "
+ exp.getValue(person , String.class));
exp = parser.parseExpression("name=='孙悟空'");
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setRootObject(person);
//以指定Context来计算表达式的值
System.out.println(exp.getValue(ctx , Boolean.class)); List<Boolean> list = new ArrayList<Boolean>();
list.add(true);
EvaluationContext ctx2 = new StandardEvaluationContext();
//将list设置成EvaluationContext的一个变量
ctx2.setVariable("list" , list);
//修饰list变量的第一个元素的值
parser.parseExpression("#list[0]").setValue(ctx2 , "false");
//list集合的第一个元素被改变
System.out.println("list集合的第一个元素为: "
+ list.get(0));
}
}

  上面的程序使用了ExpressionParser多次解析了不同类型的表达式,ExpressionParser调用parserExpression()方法将会返回一个Expression实例(表达式对象)。程序调用Expression对象的getValue()方法即可获取该表达式的值。

  上面的程序还涉及一个EvaluationContext对象,它是SpEL计算表达式值的“上下文”对象,这个Context对象可以包含多个对象,但只能有一个root(跟)对象

  EvaluationContext有点类似于OGNL的Stack Context,EvaluationContext可以包含多个对象,但只能有一个root对象。

  为了往EvaluationContext里放入对象(SpEL称之为变量),可以调用该对象的如下方法。

  》setVariable(String name, Object value):向EvaluationContext中放入Value对象,该对象名为name

  为了在SpEL访问EvaluationContext中指定对象,应采用OGNL类似的格式

 #name

  StandardEvaluationContext提供了如下方法来设置root对象。

  》setRootObject(Object rootObject)

  在SpEL中访问root对象属性时,可以省略root对象前缀,例如如下代码:

 foo.bar    //访问rootObject的foo属性的bar属性

  当然是用Expression对象计算表达式时,也可以直接指定root对象,例如上面的程序中的代码:

 exp.getValue(person, String.class) //以person对象为root对象来计算表达式的值

SpEL快速入门的更多相关文章

  1. 【Java】Spring快速入门(一)

    Spring介绍 Spring可以轻松创建Java企业应用程序.它提供了在企业环境中使用Java语言所需的一切,支持Groovy和Kotlin作为JVM上的替代语言,并可根据应用程序的需要灵活地创建多 ...

  2. SpringSecurity快速入门

    作者:SingleXu 链接:https://www.jianshu.com/p/8212a559d633 来源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 简介 Sp ...

  3. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  4. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  5. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  6. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  9. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

随机推荐

  1. Servlet中获取JSP内置对象

    方便自己查询,嫌低级的勿喷.... 1.request 在servlet的doGet和doPost的参数中就有HttpServletRequest req参数,而JSP内置request对象就是Htt ...

  2. UIScreen UIWindow UIView

    UIScreen(屏幕),UIWindow(窗口),UIView(视图)是IOS的几个基本界面元素.其中UIWindow(窗口)和UIView(视图)是为iPhone应用程序构造用户界面的可视组件.U ...

  3. SpringMVC 学习笔记(一) Hello World

    springMVC概述: Spring MVC 是眼下最主流的MVC 框架之中的一个 Spring MVC 通过一套 MVC 注解.让 POJO 成为处理请 求的控制器,而无须实现不论什么接口. 支持 ...

  4. PHP Ctype函数(转)

    Ctype函数是PHP内置的字符串体测函数.主要有以下几种 ctype_alnum -- Check for alphanumeric character(s)检测是否是只包含[A-Za-z0-9] ...

  5. [转] 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...

  6. android图片处理方法(转)

    //压缩图片大小 public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArr ...

  7. TCP/IP协议原理与应用笔记09:数据通信---封装

    2016-08-091. 数据通信----封装: 2. 协议数据单元: PDU:对等层数据通信的单元. 比如Source端的应用层 和 Destination端的应用层是对等层(L7),这个时候L7 ...

  8. POJ 2007 Scrambled Polygon 凸包

    Scrambled Polygon Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7214   Accepted: 3445 ...

  9. codevs 2495 水叮当的舞步IDA*

    /* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...

  10. 用Global.asax实现伪静态.

    在Global.asax文件里添加Application_BeginRequest事件处理.添加如下代码: 1 protected void Application_BeginRequest(Obje ...