1. package com.zf.spel;
  2.  
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9.  
  10. import org.springframework.expression.EvaluationContext;
  11. import org.springframework.expression.Expression;
  12. import org.springframework.expression.ExpressionParser;
  13. import org.springframework.expression.common.TemplateParserContext;
  14. import org.springframework.expression.spel.standard.SpelExpressionParser;
  15. import org.springframework.expression.spel.support.StandardEvaluationContext;
  16.  
  17. /**
  18. *
  19. * @author ZF
  20. *
  21. */
  22. public class ExpressionTest {
  23.  
  24. public static void main(String[] args) throws NoSuchMethodException, SecurityException {
  25. /**
  26. * 1.直接量表达式
  27. */
  28. System.out.println("=========1.直接量表达式========");
  29. // 创建一个ExpressionParser,用于解析表达式
  30. ExpressionParser parser = new SpelExpressionParser();
  31. // 计算结果为"Hello World "
  32. String helloworld = parser.parseExpression("'Hello World'").getValue(String.class);
  33. Double num = parser.parseExpression("0.23").getValue(Double.class);
  34.  
  35. System.out.println(helloworld + " ====== " + num);
  36.  
  37. /**
  38. * 2.在表达式中创建数组
  39. */
  40. System.out.println("=========2.在表达式中创建数组========");
  41. // 创建一个数组
  42. Expression exp = parser.parseExpression("new String[]{'JAVA','Struts','Spring'}");
  43. System.out.println(exp.getValue());
  44. // 创建二维数组
  45. exp = parser.parseExpression("new int[2][4]");
  46. System.out.println(exp.getValue());
  47. /**
  48. * 3.在表达式中创建List集合
  49. */
  50. System.out.println("=========3.在表达式中创建List集合========");
  51. // 创建一个List集合
  52. exp = parser.parseExpression("{'JAVA','Struts','Spring'}");
  53. System.out.println(exp.getValue());
  54. // 创建"二维"List集合
  55. exp = parser.parseExpression("{{'疯狂JAVA讲义',''},{'左传','战国策'}}");
  56. System.out.println(exp.getValue());
  57. /**
  58. * 3.在表达式中访问List、Map等集合元素
  59. */
  60. List<String> list = new ArrayList<String>();
  61. list.add("JAVA");
  62. list.add("Spring");
  63.  
  64. Map<String, Double> map = new HashMap<String, Double>();
  65. map.put("JAVA", 80.0);
  66. map.put("Spring", 89.0);
  67. EvaluationContext ctx = new StandardEvaluationContext();
  68. ctx.setVariable("myList", list);
  69. ctx.setVariable("myMap", map);
  70. // 访问List集合的第二个元素
  71. System.out.println(parser.parseExpression("#myList[1]").getValue(ctx));
  72. // 访问Map集合的指定元素
  73. System.out.println(parser.parseExpression("#myMap['JAVA']").getValue(ctx));
  74.  
  75. /**
  76. * 4.调用方法
  77. */
  78. System.out.println("=========4.调用方法========");
  79. // 调用String对象的substring(0计数的起始位置,结束位置不包含该位置的值)方法
  80. System.out.println(parser.parseExpression("'HelloWord!'.substring(5,9)").getValue());
  81. List<String> list2 = new ArrayList<String>();
  82. list2.add("java");
  83. list2.add("struts");
  84. list2.add("spring");
  85. list2.add("hibernate");
  86. // 设置一个变量
  87. ctx.setVariable("myList2", list2);
  88. System.out.println(parser.parseExpression("#myList2.subList(1,3)").getValue(ctx));
  89. /**
  90. *
  91. * 5.算术、比较、逻辑、赋值、三目等运算符
  92. * 算术支持:加(+)、减(-)、乘(*)、除(/)、求余(%)、幂(^)运算
  93. * 比较支持:eq("=="),ne("!="),le("<="),lt("<"),gt(">"),ge(">="),div("/"),mod("%"),not("!"),正则表达式及instanceof操作
  94. * 逻辑支持:且(and)、或(or)、非(!或NOT)。
  95. * 赋值支持:允许给自定义变量赋值,也允许给跟对象赋值,直接使用“#variableName=value”即可赋值:
  96. * 三目支持:如“2>1?true:false”将返回true
  97. */
  98. System.out.println("=========5.算术、比较、逻辑、赋值、三目等运算符========");
  99. List<String> list3 = new ArrayList<String>();
  100. list3.add("java");
  101. list3.add("struts");
  102. list3.add("spring");
  103. list3.add("hibernate");
  104. // 设置一个变量
  105. ctx.setVariable("myList3", list3);
  106. // 对集合的第一个元素进行赋值
  107. parser.parseExpression("#myList3[0]='疯狂java讲义'").getValue(ctx);
  108. // 下面将输出 疯狂java讲义
  109. System.out.println(list3.get(0));
  110. // 使用三目运算符
  111. System.out.println(
  112. parser.parseExpression("#myList3.size()>3 ?" + "'myList3长度大于3' : 'myList3长度不大于3'").getValue(ctx));
  113. // 关系表达式
  114. System.out.println(parser.parseExpression("2.0 between {1,3}").getValue(Boolean.class));
  115. /**
  116. * 逻辑表达式 且(and)、或(or)、非(!或NOT)。
  117. *
  118. */
  119. System.out.println(parser.parseExpression("2 > 1 and (!true or !false)").getValue(Boolean.class));
  120. System.out.println(parser.parseExpression("2 > 1 and (NOT true or NOT false)").getValue(Boolean.class));
  121. /**
  122. * 字符串连接及截取表达式
  123. */
  124. // 字符串连接
  125. System.out.println(parser.parseExpression("'Hello'+' Word!'").getValue(String.class));
  126. // 字符串截取,目前只能截取一个
  127. System.out.println(parser.parseExpression("'Hello Word!'[0]").getValue(String.class));
  128. /**
  129. * 三目运算与Elivis运算
  130. *
  131. * 三目运算符 “表达式1?表达式2:表达式3”用于构造三目运算表达式,如“2>1?true:false”将返回true;
  132. * Elivis运算符“表达式1?:表达式2”从Groovy语言引入用于简化三目运算符的,
  133. * 当表达式1为非null时则返回表达式1,当表达式1为null时则返回表达式2, 简化了三目运算符方式“表达式1? 表达式1:表达式2”,
  134. * 如“null?:false”将返回false,而“true?:false”将返回true
  135. *
  136. *
  137. */
  138. System.out.println(parser.parseExpression("2 > 1 ? true : false").getValue(Boolean.class));
  139. System.out.println(parser.parseExpression("null ?: false").getValue(Boolean.class));
  140.  
  141. /**
  142. * 6.类型运算符 T()
  143. *
  144. * 使用“T(Type)”来表示java.lang.Class实例,“Type”必须是类全限定名,
  145. * “java.lang”包除外,即该包下的类可以不指定包名;使用类类型表达式还可以进行访问类静态方法及类静态字段。
  146. */
  147. System.out.println("=========6.类型运算符 T()========");
  148. // java.lang包类访问
  149. System.out.println(parser.parseExpression("T(String)").getValue(Class.class));
  150. // 其它包类的访问
  151. System.out.println(parser.parseExpression("T(com.zf.spelXml.Author)").getValue(Class.class));
  152. // 类静态字段访问
  153. System.out.println(parser.parseExpression("T(Integer).MAX_VALUE").getValue(Integer.class));
  154. // 类静态方法调用
  155. System.out.println(parser.parseExpression("T(Integer).parseInt('1')").getValue(int.class));
  156. /**
  157. * 类的实例化
  158. * 类实例化同样使用java关键字“new”,类名必须是全限定名,但java.lang包内的类型除外,如String、Integer。
  159. *
  160. */
  161. System.out.println(parser.parseExpression("new String('helloworld String')").getValue(String.class));
  162. System.out.println(parser.parseExpression("new java.util.Date()").getValue(Date.class));
  163. /**
  164. * instanceof表达式
  165. *
  166. */
  167. System.out.println(parser.parseExpression("'abc' instanceof T(String)").getValue(Boolean.class));
  168. /**
  169. * 7.调用构造器
  170. *
  171. * substring(2,4)从0开始,不包括最后一个值
  172. */
  173. System.out.println("=========7.调用构造器========");
  174. System.out.println(parser.parseExpression("new String('HelloWord').substring(2,4)").getValue(String.class));
  175. // System.out.println(parser.parseExpression("new
  176. // javax.swing.JFrame('测试')"+".setVisible('true')").getValue());
  177.  
  178. /**
  179. * 8.变量定义及引用
  180. *
  181. * 变量定义通过EvaluationContext接口的setVariable(variableName, value)方法定义;
  182. * 在表达式中使用“#variableName”引用; 除了引用自定义变量,SpE还允许引用根对象及当前上下文对象,
  183. * 使用“#root”引用根对象,引用SpEL的EvaluationContext 的root对象,
  184. * 使用“#this”引用当前上下文对象,引用SpEL当前正在计算的对象;
  185. */
  186. System.out.println("=========8.变量定义及引用========");
  187. ctx.setVariable("variable", "haha");
  188. System.out.println(parser.parseExpression("#variable").getValue(ctx, String.class));
  189.  
  190. ctx = new StandardEvaluationContext("hihi");
  191. System.out.println(parser.parseExpression("#root").getValue(ctx, String.class));
  192. System.out.println(parser.parseExpression("#this").getValue(ctx, String.class));
  193.  
  194. /**
  195. * 9.自定义函数
  196. *
  197. */
  198. System.out.println("=========9.自定义函数========");
  199.  
  200. StandardEvaluationContext ctx2 = new StandardEvaluationContext();
  201. Method parseInt = Integer.class.getDeclaredMethod("parseInt", String.class);
  202. ctx2.registerFunction("parseInt", parseInt);
  203. ctx2.setVariable("parseInt2", parseInt);
  204. System.out.println(parser.parseExpression("#parseInt('3') == #parseInt2('3')").getValue(ctx2, Boolean.class));
  205.  
  206. /**
  207. * 10.安全导航操作
  208. *
  209. */
  210. System.out.println("=========10.安全导航操作========");
  211. System.out.println(parser.parseExpression("#foo?.bar").getValue());
  212. // 以下语句将会产生异常
  213. // System.out.println(parser.parseExpression("#foo.bar").getValue());
  214. /**
  215. * 11.集合选择
  216. * 语法格式:collection.?[condition_expr]
  217. *
  218. *
  219. *
  220. */
  221. System.out.println("=========11.集合选择========");
  222. // 将返回不可修改的空List
  223. System.out.println(parser.parseExpression("{}").getValue(List.class));
  224. // 对于字面量列表也将返回不可修改的List
  225. System.out.println(parser.parseExpression("{1,2,3,4}").getValue(List.class).get(1));
  226. // 不可修改的List,以下代码将会抛出异常java.lang.UnsupportedOperationException 不支持请求的操作
  227. // System.out.println(parser.parseExpression("{1,2,3,4}").getValue(List.class).set(0,5));
  228.  
  229. // 对于列表中只要有一个不是字面量表达式,将只返回原始List,
  230. // 不会进行不可修改处理
  231. String expression3 = "{{1+2,2+4},{3,4+4}}";
  232. List<List<Integer>> result3 = parser.parseExpression(expression3).getValue(List.class);
  233. // 修改{1+2,2+4}中的下标为1第二个元素值为25
  234. System.out.println(result3.get(0).set(1, 25));
  235. System.out.println(result3.get(0));
  236.  
  237. // 声明二维数组并初始化
  238. System.out.println(parser.parseExpression("new int[2]{1,2}").getValue(int[].class).length);
  239. // 定义一维数组并且初始化
  240. System.out.println(parser.parseExpression("new int[1]{9}").getValue(int[].class).length);
  241. // 定义多维数组但不初始化
  242. System.out.println("多维数组" + parser.parseExpression(expression3).getValue(int[][][].class).length);
  243. // 错误的定义多维数组,多维数组不能初始化,以下代码会报错
  244. // String expression4="new int[][][]{1}{2}{3}";
  245. // System.out.println(parser.parseExpression(expression4).getValue(int[][][].class).length);
  246.  
  247. /**
  248. * 使用较少:三维数组
  249. *
  250. */
  251. int score[][][] = { { { 5, 1 }, { 6, 7 } }, { { 9, 4 }, { 8, 3 } } };
  252. System.out.print(score[0][0][0] + "\t");
  253. System.out.print(score[0][0][1] + "\t");
  254. System.out.print(score[0][0][0] + "\t");
  255. System.out.print(score[0][0][1] + "\t");
  256.  
  257. System.out.print(score[1][0][0] + "\t");
  258. System.out.print(score[1][0][1] + "\t");
  259. System.out.print(score[1][1][0] + "\t");
  260. System.out.print(score[1][1][1] + "\t");
  261.  
  262. System.out.println("\n =========书J2EE企业应用实战事例========");
  263.  
  264. /**
  265. * 书J2EE企业应用实战事例
  266. */
  267. List<String> list4=new ArrayList<String>();
  268. list4.add("疯狂JAVA讲义");
  269. list4.add("疯狂Ajax讲义");
  270. list4.add("疯狂XML讲义");
  271. list4.add("经典JAVA EE企业应用实战 ");
  272.  
  273. ctx.setVariable("myList4",list4);
  274. //判断集合元素值的长度length()方法大于7,所以"疯狂XML讲义"将会移除 不会显示
  275. System.out.println(parser.parseExpression("#myList4.?[length()>7]").getValue(ctx));
  276.  
  277. Map<String,Double> map2=new HashMap<String, Double>();
  278. map2.put("java",89.0);
  279. map2.put("Spring",82.0);
  280. map2.put("英语",75.0);
  281. ctx.setVariable("myMap2", map2);
  282. //判断Map集合的value值大于80,所以只会保留前两个
  283. System.out.println(parser.parseExpression("#myMap2.?[value>80]").getValue(ctx));
  284.  
  285. /**
  286. * 12.集合投影
  287. * 语法格式:collection.![condition_expr]
  288. *
  289. */
  290. System.out.println("=========12.集合投影========");
  291.  
  292. List<String> list5=new ArrayList<String>();
  293. list5.add("疯狂JAVA讲义");
  294. list5.add("疯狂Ajax讲义");
  295. list5.add("疯狂XML讲义");
  296. list5.add("经典JAVA EE企业应用实战 ");
  297. ctx.setVariable("myList5", list5);
  298. //得到的新集合的元素是原集合的每个元素length()方法的返回值
  299. System.out.println(parser.parseExpression("#myList5.![length()]").getValue(ctx));
  300. List<Person> listPerson=new ArrayList<Person>();
  301. listPerson.add(new Person(1, "张三",18));
  302. listPerson.add(new Person(2, "李四",20));
  303. listPerson.add(new Person(3, "王五",26));
  304. ctx.setVariable("listPerson", listPerson);
  305. //得到的新集合的元素是原集合的每个元素的name属性值
  306. System.out.println(parser.parseExpression("#listPerson.![name]").getValue(ctx));
  307. /**
  308. * 上面list5.add("经典JAVA EE企业应用实战 ");中的元素 长度为16,注意中间只有一个空格,敲两个空格将会是一个长度
  309. *
  310. * java字符串去除空格
  311. * 1、" 12 5 ".trim():只去掉前后首尾空格,中间的任然保留
  312. * 2、" qw we ew ".replace(" ",""):去掉所有空格
  313. * 3、或者replaceAll(" +",""); 去掉所有空格
  314. * 4、str = .replaceAll("\\s*", "");去掉所有空格
  315. */
  316. String test=new String(" qw e r t y f ff gfg fg ");
  317. System.out.println(test.replace(" ", ""));
  318.  
  319. /**
  320. * 13.表达式模板
  321. *
  322. */
  323. System.out.println("=========13.表达式模板========");
  324. Person person1=new Person(1, "张三", 19);
  325. Person person2=new Person(2, "张三", 25);
  326. //将person1对象的name,age,填充到表达式#{}中
  327. System.out.println(parser.parseExpression("我的名字是#{name},年龄是#{age}",new TemplateParserContext()).getValue(person1));
  328. //将person2对象的name,age,填充到表达式#{}中
  329. System.out.println(parser.parseExpression("我的名字是#{name},年龄是#{age}",new TemplateParserContext()).getValue(person1));
  330.  
  331. }
  332. }

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. JavaScript框架设计 第14章 动画引擎

    easing-js <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...

  2. VLC打开.264文件

    昨天收到几个文件名是:xxx.264的文件,这种文件属于视频图像的raw files,即只包含视频数据.由于缺少视频头文件,所以一般播放器难以播放出来.网上很多介绍的是.H264文件如何打开,以及用一 ...

  3. cookie操作大全

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  4. 庖丁解牛FPPopover

    作者:ani_di 版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di 庖丁解牛FPPopover FPPopover是一个实现Popover控件的开源项目,比标准控 ...

  5. Need a code of lazy load for div--reference

    1. For all DIVs of a page $(function() {  $("div").lazyload({effect: 'fadeIn'});}); 2. For ...

  6. Android开发艺术探索》读书笔记 (5) 第5章 理解RemoteViews

    第5章 理解RemoteViews 5.1 RemoteViews的应用 (1)RemoteViews表示的是一个view结构,它可以在其他进程中显示.由于它在其他进程中显示,为了能够更新它的界面,R ...

  7. android基础篇学习心得

    android技术中,线程.进程.JNI.IPC和各个小框架结构是基本功.在跟随高焕堂老师的android程序猿到架构师之路系列视频中 学习完基础篇之后,颇有些心得,记录下来. android开发就是 ...

  8. python-打印简单公司员工信息表

    python-打印简单公司员工信息表 要求,输入name不为空,输入次数最多3次,3次后跳出程序: 知识点: raw_input str转int whil if elif else continue ...

  9. Java POI 导出excel表

    1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/3895051 2.Student.java ...

  10. IE浏览器中设为首页

    <a onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('<%=Configurati ...