package com.zf.spel;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext; /**
*
* @author ZF
*
*/
public class ExpressionTest { public static void main(String[] args) throws NoSuchMethodException, SecurityException {
/**
* 1.直接量表达式
*/
System.out.println("=========1.直接量表达式========");
// 创建一个ExpressionParser,用于解析表达式
ExpressionParser parser = new SpelExpressionParser();
// 计算结果为"Hello World "
String helloworld = parser.parseExpression("'Hello World'").getValue(String.class);
Double num = parser.parseExpression("0.23").getValue(Double.class); System.out.println(helloworld + " ====== " + num); /**
* 2.在表达式中创建数组
*/
System.out.println("=========2.在表达式中创建数组========");
// 创建一个数组
Expression exp = parser.parseExpression("new String[]{'JAVA','Struts','Spring'}");
System.out.println(exp.getValue());
// 创建二维数组
exp = parser.parseExpression("new int[2][4]");
System.out.println(exp.getValue());
/**
* 3.在表达式中创建List集合
*/
System.out.println("=========3.在表达式中创建List集合========");
// 创建一个List集合
exp = parser.parseExpression("{'JAVA','Struts','Spring'}");
System.out.println(exp.getValue());
// 创建"二维"List集合
exp = parser.parseExpression("{{'疯狂JAVA讲义',''},{'左传','战国策'}}");
System.out.println(exp.getValue());
/**
* 3.在表达式中访问List、Map等集合元素
*/
List<String> list = new ArrayList<String>();
list.add("JAVA");
list.add("Spring"); Map<String, Double> map = new HashMap<String, Double>();
map.put("JAVA", 80.0);
map.put("Spring", 89.0);
EvaluationContext ctx = new StandardEvaluationContext();
ctx.setVariable("myList", list);
ctx.setVariable("myMap", map);
// 访问List集合的第二个元素
System.out.println(parser.parseExpression("#myList[1]").getValue(ctx));
// 访问Map集合的指定元素
System.out.println(parser.parseExpression("#myMap['JAVA']").getValue(ctx)); /**
* 4.调用方法
*/
System.out.println("=========4.调用方法========");
// 调用String对象的substring(0计数的起始位置,结束位置不包含该位置的值)方法
System.out.println(parser.parseExpression("'HelloWord!'.substring(5,9)").getValue());
List<String> list2 = new ArrayList<String>();
list2.add("java");
list2.add("struts");
list2.add("spring");
list2.add("hibernate");
// 设置一个变量
ctx.setVariable("myList2", list2);
System.out.println(parser.parseExpression("#myList2.subList(1,3)").getValue(ctx));
/**
*
* 5.算术、比较、逻辑、赋值、三目等运算符
* 算术支持:加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算
* 比较支持:eq("=="),ne("!="),le("<="),lt("<"),gt(">"),ge(">="),div("/"),mod("%"),not("!"),正则表达式及instanceof操作
* 逻辑支持:且(and)、或(or)、非(!或NOT)。
* 赋值支持:允许给自定义变量赋值,也允许给跟对象赋值,直接使用“#variableName=value”即可赋值:
* 三目支持:如“2>1?true:false”将返回true
*/
System.out.println("=========5.算术、比较、逻辑、赋值、三目等运算符========");
List<String> list3 = new ArrayList<String>();
list3.add("java");
list3.add("struts");
list3.add("spring");
list3.add("hibernate");
// 设置一个变量
ctx.setVariable("myList3", list3);
// 对集合的第一个元素进行赋值
parser.parseExpression("#myList3[0]='疯狂java讲义'").getValue(ctx);
// 下面将输出 疯狂java讲义
System.out.println(list3.get(0));
// 使用三目运算符
System.out.println(
parser.parseExpression("#myList3.size()>3 ?" + "'myList3长度大于3' : 'myList3长度不大于3'").getValue(ctx));
// 关系表达式
System.out.println(parser.parseExpression("2.0 between {1,3}").getValue(Boolean.class));
/**
* 逻辑表达式 且(and)、或(or)、非(!或NOT)。
*
*/
System.out.println(parser.parseExpression("2 > 1 and (!true or !false)").getValue(Boolean.class));
System.out.println(parser.parseExpression("2 > 1 and (NOT true or NOT false)").getValue(Boolean.class));
/**
* 字符串连接及截取表达式
*/
// 字符串连接
System.out.println(parser.parseExpression("'Hello'+' Word!'").getValue(String.class));
// 字符串截取,目前只能截取一个
System.out.println(parser.parseExpression("'Hello Word!'[0]").getValue(String.class));
/**
* 三目运算与Elivis运算
*
* 三目运算符 “表达式1?表达式2:表达式3”用于构造三目运算表达式,如“2>1?true:false”将返回true;
* Elivis运算符“表达式1?:表达式2”从Groovy语言引入用于简化三目运算符的,
* 当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2, 简化了三目运算符方式“表达式1? 表达式1:表达式2”,
* 如“null?:false”将返回false,而“true?:false”将返回true
*
*
*/
System.out.println(parser.parseExpression("2 > 1 ? true : false").getValue(Boolean.class));
System.out.println(parser.parseExpression("null ?: false").getValue(Boolean.class)); /**
* 6.类型运算符 T()
*
* 使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,
* “java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。
*/
System.out.println("=========6.类型运算符 T()========");
// java.lang包类访问
System.out.println(parser.parseExpression("T(String)").getValue(Class.class));
// 其它包类的访问
System.out.println(parser.parseExpression("T(com.zf.spelXml.Author)").getValue(Class.class));
// 类静态字段访问
System.out.println(parser.parseExpression("T(Integer).MAX_VALUE").getValue(Integer.class));
// 类静态方法调用
System.out.println(parser.parseExpression("T(Integer).parseInt('1')").getValue(int.class));
/**
* 类的实例化
* 类实例化同样使用java关键字“new”,类名必须是全限定名,但java.lang包内的类型除外,如String、Integer。
*
*/
System.out.println(parser.parseExpression("new String('helloworld String')").getValue(String.class));
System.out.println(parser.parseExpression("new java.util.Date()").getValue(Date.class));
/**
* instanceof表达式
*
*/
System.out.println(parser.parseExpression("'abc' instanceof T(String)").getValue(Boolean.class));
/**
* 7.调用构造器
*
* substring(2,4)从0开始,不包括最后一个值
*/
System.out.println("=========7.调用构造器========");
System.out.println(parser.parseExpression("new String('HelloWord').substring(2,4)").getValue(String.class));
// System.out.println(parser.parseExpression("new
// javax.swing.JFrame('测试')"+".setVisible('true')").getValue()); /**
* 8.变量定义及引用
*
* 变量定义通过EvaluationContext接口的setVariable(variableName, value)方法定义;
* 在表达式中使用“#variableName”引用; 除了引用自定义变量,SpE还允许引用根对象及当前上下文对象,
* 使用“#root”引用根对象,引用SpEL的EvaluationContext 的root对象,
* 使用“#this”引用当前上下文对象,引用SpEL当前正在计算的对象;
*/
System.out.println("=========8.变量定义及引用========");
ctx.setVariable("variable", "haha");
System.out.println(parser.parseExpression("#variable").getValue(ctx, String.class)); ctx = new StandardEvaluationContext("hihi");
System.out.println(parser.parseExpression("#root").getValue(ctx, String.class));
System.out.println(parser.parseExpression("#this").getValue(ctx, String.class)); /**
* 9.自定义函数
*
*/
System.out.println("=========9.自定义函数========"); StandardEvaluationContext ctx2 = new StandardEvaluationContext();
Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
ctx2.registerFunction("parseInt", parseInt);
ctx2.setVariable("parseInt2", parseInt);
System.out.println(parser.parseExpression("#parseInt('3') == #parseInt2('3')").getValue(ctx2, Boolean.class)); /**
* 10.安全导航操作
*
*/
System.out.println("=========10.安全导航操作========");
System.out.println(parser.parseExpression("#foo?.bar").getValue());
// 以下语句将会产生异常
// System.out.println(parser.parseExpression("#foo.bar").getValue());
/**
* 11.集合选择
* 语法格式:collection.?[condition_expr]
*
*
*
*/
System.out.println("=========11.集合选择========");
// 将返回不可修改的空List
System.out.println(parser.parseExpression("{}").getValue(List.class));
// 对于字面量列表也将返回不可修改的List
System.out.println(parser.parseExpression("{1,2,3,4}").getValue(List.class).get(1));
// 不可修改的List,以下代码将会抛出异常java.lang.UnsupportedOperationException 不支持请求的操作
// System.out.println(parser.parseExpression("{1,2,3,4}").getValue(List.class).set(0,5)); // 对于列表中只要有一个不是字面量表达式,将只返回原始List,
// 不会进行不可修改处理
String expression3 = "{{1+2,2+4},{3,4+4}}";
List<List<Integer>> result3 = parser.parseExpression(expression3).getValue(List.class);
// 修改{1+2,2+4}中的下标为1第二个元素值为25
System.out.println(result3.get(0).set(1, 25));
System.out.println(result3.get(0)); // 声明二维数组并初始化
System.out.println(parser.parseExpression("new int[2]{1,2}").getValue(int[].class).length);
// 定义一维数组并且初始化
System.out.println(parser.parseExpression("new int[1]{9}").getValue(int[].class).length);
// 定义多维数组但不初始化
System.out.println("多维数组" + parser.parseExpression(expression3).getValue(int[][][].class).length);
// 错误的定义多维数组,多维数组不能初始化,以下代码会报错
// String expression4="new int[][][]{1}{2}{3}";
// System.out.println(parser.parseExpression(expression4).getValue(int[][][].class).length); /**
* 使用较少:三维数组
*
*/
int score[][][] = { { { 5, 1 }, { 6, 7 } }, { { 9, 4 }, { 8, 3 } } };
System.out.print(score[0][0][0] + "\t");
System.out.print(score[0][0][1] + "\t");
System.out.print(score[0][0][0] + "\t");
System.out.print(score[0][0][1] + "\t"); System.out.print(score[1][0][0] + "\t");
System.out.print(score[1][0][1] + "\t");
System.out.print(score[1][1][0] + "\t");
System.out.print(score[1][1][1] + "\t"); System.out.println("\n =========书J2EE企业应用实战事例========"); /**
* 书J2EE企业应用实战事例
*/
List<String> list4=new ArrayList<String>();
list4.add("疯狂JAVA讲义");
list4.add("疯狂Ajax讲义");
list4.add("疯狂XML讲义");
list4.add("经典JAVA EE企业应用实战 "); ctx.setVariable("myList4",list4);
//判断集合元素值的长度length()方法大于7,所以"疯狂XML讲义"将会移除 不会显示
System.out.println(parser.parseExpression("#myList4.?[length()>7]").getValue(ctx)); Map<String,Double> map2=new HashMap<String, Double>();
map2.put("java",89.0);
map2.put("Spring",82.0);
map2.put("英语",75.0);
ctx.setVariable("myMap2", map2);
//判断Map集合的value值大于80,所以只会保留前两个
System.out.println(parser.parseExpression("#myMap2.?[value>80]").getValue(ctx)); /**
* 12.集合投影
* 语法格式:collection.![condition_expr]
*
*/
System.out.println("=========12.集合投影========"); List<String> list5=new ArrayList<String>();
list5.add("疯狂JAVA讲义");
list5.add("疯狂Ajax讲义");
list5.add("疯狂XML讲义");
list5.add("经典JAVA EE企业应用实战 ");
ctx.setVariable("myList5", list5);
//得到的新集合的元素是原集合的每个元素length()方法的返回值
System.out.println(parser.parseExpression("#myList5.![length()]").getValue(ctx));
List<Person> listPerson=new ArrayList<Person>();
listPerson.add(new Person(1, "张三",18));
listPerson.add(new Person(2, "李四",20));
listPerson.add(new Person(3, "王五",26));
ctx.setVariable("listPerson", listPerson);
//得到的新集合的元素是原集合的每个元素的name属性值
System.out.println(parser.parseExpression("#listPerson.![name]").getValue(ctx));
/**
* 上面list5.add("经典JAVA EE企业应用实战 ");中的元素 长度为16,注意中间只有一个空格,敲两个空格将会是一个长度
*
* java字符串去除空格
* 1、" 12 5 ".trim():只去掉前后首尾空格,中间的任然保留
* 2、" qw we ew ".replace(" ",""):去掉所有空格
* 3、或者replaceAll(" +",""); 去掉所有空格
* 4、str = .replaceAll("\\s*", "");去掉所有空格
*/
String test=new String(" qw e r t y f ff gfg fg ");
System.out.println(test.replace(" ", "")); /**
* 13.表达式模板
*
*/
System.out.println("=========13.表达式模板========");
Person person1=new Person(1, "张三", 19);
Person person2=new Person(2, "张三", 25);
//将person1对象的name,age,填充到表达式#{}中
System.out.println(parser.parseExpression("我的名字是#{name},年龄是#{age}",new TemplateParserContext()).getValue(person1));
//将person2对象的name,age,填充到表达式#{}中
System.out.println(parser.parseExpression("我的名字是#{name},年龄是#{age}",new TemplateParserContext()).getValue(person1)); }
}

Spring3.0提供的表达式语言spel的更多相关文章

  1. 7 -- Spring的基本用法 -- 12... Spring 3.0 提供的表达式语言(SpEL)

    7.12 Spring 3.0 提供的表达式语言(SpEL) Spring表达式语言(简称SpEL)是一种与JSP 2 的EL功能类似的表达式语言,它可以在运行时查询和操作对象图.支持方法调用和基本字 ...

  2. Spring学习笔记--Spring表达式语言SpEL

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL).SpEL是一种强大的.简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean ...

  3. Sping表达式语言--SpEL

    Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...

  4. Spring表达式语言SpEL简单介绍

    Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...

  5. Spring3表达式语言(SpEL)学习笔记

    最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...

  6. 开涛spring3(5.3) - Spring表达式语言 之 5.3 SpEL语法

    5.3  SpEL语法 5.3.1  基本表达式 一.字面量表达式: SpEL支持的字面量包括:字符串.数字类型(int.long.float.double).布尔类型.null类型. 类型 示例 字 ...

  7. Spring3系列6 - Spring 表达式语言(Spring EL)

    Spring3系列6-Spring 表达式语言(Spring EL) 本篇讲述了Spring Expression Language —— 即Spring3中功能丰富强大的表达式语言,简称SpEL.S ...

  8. Spring学习记录(七)---表达式语言-SpEL

    SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...

  9. Spring表达式语言SpEL

    Spring表达式语言,简称SpEL,是一个支持运行时查询和操作对象图的强大的表达式语言.语法类似于EL:SpEL使用#{…}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean属 ...

随机推荐

  1. Qt入门(19)——自定义窗口部件

    我们介绍可以画自己的第一个自定义窗口部件.我们也加入了一个有用的键盘接口.我们添加了一个槽:setRange().        void setRange( int minVal, int maxV ...

  2. nginx第三方模块---nginx-sticky-module的使用(基于cookie的会话保持)

    目前的项目网站架构中使用了F5和nginx,F5用来做负载均衡,nginx只用作反向代理服务器.最近应客户的要求准备去掉F5,使用软负载.大家都知道nginx抗并发能力强,又可以做负载均衡,而且使用n ...

  3. Java---注解、类加载器-加强-实现运行任意目录下class中加了@MyTest的空参方法

    做自己的类加载器 虚拟机的核心是通过类加载器来加载.class文件,然后进行相应的解析执行.那么我们可以自己做类加载器,手动加载需要的.class以进行解析执行,从而扩展虚拟机的功能. 以下内容摘自A ...

  4. 高效算法——C 分饼

    My birthday is coming up and traditionally I’m serving pie. Not just one pie, no, I have a number N ...

  5. UVA 11478 Halum(差分约束)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 [思路] 差分约束系统. 设结点u上的操作和为sum[u] ...

  6. poj1664 (递归)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31295   Accepted: 19742 Description ...

  7. 调查:Java程序员最亲睐的Web框架

    这是关于Java的第二个调查,第一个调查请点这里查看. 这一次,我们要讨论的是web框架. 只有少数几种语言像Java一样提供了各种各样的web框架,上面的统计图就是一个证据.下面是其他开发者所使用w ...

  8. bzoj3669: [Noi2014]魔法森林 lct

    记得去年模拟赛的时候好像YY出二分答案枚举a,b的暴力,过了55欸 然后看正解,为了将两维变成一维,将a排序,模拟Kruskal的加边过程,同时维护1到n的最大值,加入一条边e(u,v,a,b)时有以 ...

  9. DateTimePicker控件为空 分类: WinForm 2014-04-15 09:46 239人阅读 评论(0) 收藏

    设置属性:                 Format=Custom 加载事件:ValueChanged    private void dtpStart_ValueChanged(object s ...

  10. 手游Apk破解疯狂,爱加密apk加固保护开发人员

    2013年手游行业的规模与收入均实现了大幅增长,发展势头强劲.权威数据显示, 我国移动游戏市场实际销售收入从2012年的32.4亿猛增到2013年的112.4亿元,同比增长了246.9%,手游用户从2 ...