zoukankan      html  css  js  c++  java
  • 后端——框架——容器框架——spring_core——EL表达式

      EL表达式有以下四类,

      表达式为XX expression

      运算符为XX operator

      集合为Map,List,数组等相关的操作。

      方法为调用构造器,调用类方法

    1、表达式

    表达式为XX expression,例如Literal expression,赋值,访问属性等表达式。

    1.1   字面量

    字面量有字符串,数字,布尔,null。

    /**
     * 
     * @Title: testLiteralExpression
     * @Description: 测试SpringEL表达式
     */
    public static void testLiteralExpression() {
    	// 创建解析器
    	ExpressionParser parser = new SpelExpressionParser();
    	// 表达式
    	Expression exp = parser.parseExpression("'Hello World'");
    	// 字符串
    	String helloWorld = exp.getValue(String.class);
    	// 获取数字
    	exp = parser.parseExpression("123");
    	// 数字
    	Integer num = exp.getValue(Integer.class);
    	// 布尔值
    	boolean blValue = parser.parseExpression("true").getValue(Boolean.class);
    	// null
    	Object nullVal = parser.parseExpression("null").getValue();
    	System.out.println("HelloWorld:" + helloWorld + "
    num:" + num + "
    blValue:" + blValue + "
    nullVal:" + nullVal);
    }
    

    1.2   Bean属性

    当获取对象的属性时,需要在上下文中明确对象,体现在代码上,getValue的第二个参数为对象的实例。

    例如获取User的name属性

    /**
     * 
     * @Title: testBeanFields  
     * @Description: 测试获取bean的属性
     */
    public static void testBeanFields() {
    	// 创建解析器
    	ExpressionParser parser = new SpelExpressionParser();
    	// 表达式
    	Expression exp = parser.parseExpression("name");
    	// 创建User对象
    	User user = new User();
    	user.setName("张三");
    	// 获取name属性,第一个参数为对象的实例,第二个参数为name属性的类型
    	String name = exp.getValue(user, String.class);
    	System.out.println("name:" + name);
    }
    

      当属性为对象时,例如User有Address(地址)属性,address.country,表示用户所在的国家,即Address对象中的country属性。

    当属性为集合,数组时,例如User有List<Role>属性,roles[index]访问到Role对象,roles[index].name获取Role对象的角色名称。

    当属性为Map时,其中的index转换为key。

    1.3   系统属性

    系统属性是指JVM属性和操作系统的属性。获取系统属性的格式为:

    #{systemProperties[key]}

    其中

    • #:表示变量
    • {}:变量包裹在大括号中
    • systemProperties:它代表系统属性。
    • key:系统属性变量的key值。

    例如获取user.name系统变量

    public class User {
    	// 用户的名称
    	@Value("#{ systemProperties['user.name'] }")
    	private String name;
    	// 其他代码省略
    }
    

      当从IOC容器中获取时,name的属性值会是user.name系统变量值。使用new方式自定义User对象时,name属性无值。

      表达式也可以出现在XML配置文件中,当使用property子标签设置name属性时,当value为表达式的值时,也会被解析为user.name系统变量值。

    1.4   表达式模板

    表达式模板是指引用上下文中对象的属性,调用上下文中对象的方法,获取它返回值等等。

    // 任意的表达式模板,必须把User设置为上下文对象,并且User的name属性有值
    Expression exp = parser.parseExpression("your name is #{name} ");
    

      返回字符串“your name is 张三”。

    2、运算符

    运算符有四种,关系运算符,逻辑运算符,算术运算符,赋值运算符。

    2.1   关系运算符

    关系运算符,大于,等于,小于等等,这些值返回的都是布尔类型。

    /**
     * 
     * @Title: testRelationalOperators
     * @Description: 测试关系运算符
     */
    public static void testRelationalOperators() {
    	// 创建解析器
    	ExpressionParser parser = new SpelExpressionParser();
    	// 任意的关系运算符
    	Expression exp = parser.parseExpression("1 < 2");
    	// 获取值
    	Boolean isTrue = exp.getValue(Boolean.class);
    	// 关系运算符
    	System.out.println("relational expression:" + isTrue);
    }
    

    2.2   逻辑运算符

    逻辑运算符有与,或,非三种,Spel使用and,or,not表示。返回的值也都是布尔类型

    // 任意的逻辑运算符
    Expression exp = parser.parseExpression("true and false");
    

    2.3   算术运算符

    算术运算符有加,减,乘,除,余,各种函数等。返回的基本都是数字类型

    // 任意的算术运算符
    Expression exp = parser.parseExpression("1 + 1");
    

    2.4   赋值运算符

    赋值运算符有=,+=,-=等等。

    // 任意的赋值运算符,value是字符串,需要加单引号
    Expression exp = parser.parseExpression(" key=’value’ ");
    

      还可以调用expression的setValue方法。

    // 任意的赋值运算符,field是某个对象的属性 
    Expression exp = parser.parseExpression(" field ");
    // setValue方法,第一个参数为上下文对象,第二个参数为对象实例,第三个为filed属性的值
    exp.setValue(context, inventor, "fieldVal");
    

    2.5   三目运算符

    格式与Java程序中的三目运算符一致。

    exp ? ‘true value’ :’false value’。

    // 任意的三目表达式,值是字符串,需要添加单引号
    Expression exp = parser.parseExpression(" true ? 'true value' : 'false value' ");
    

    2.6   Elvis 运算符

    它是三目运算符的缩写,是Groovy语言的语法。

    表达式一般是判断对象或字段是否为空,true value 一般是对象或字段本身,false value一般是对象或字段的默认值。

    格式为: obj ? new Object() 或 field ? “default field Value”;

    // 任意的Elvis运算符,相当于name属性无值时,给其设置默认值张三
    Expression exp = parser.parseExpression(" name ? : '张三' ");
    

    2.7   Safe navigation运算符

    它是在获取对象的属性时,添加一层机制,确保即使对象为空时,也不会抛出空指针异常,相当于获取对象属性的加强版。

    格式为:obj ?. field。 中间是问号和逗号,二者之间无空格。

    // 任意的获取属性的运算符,获取User对象中的address对象,address对象中的country属性值
    Expression exp = parser.parseExpression(" address?.country ");
    

    3、集合

    集合这里指存放数据的容器,指数组,Collection,Map。

    3.1   创建

      List集合:格式为{value1,value2,value3},大括号可以互相嵌套。返回List对象

    // {value1,value2,value3}等格式,大括号可以互相嵌套
    Expression exp = parser.parseExpression("{1,2,3,4}");
    

      Map:格式为{key:’value’},相当于JSON字符串。Key值没有单引号,value上有单引号

    // 获取时返回Map对象
    Expression exp = parser.parseExpression("{name:'张三', age:18}");
    

      数组:格式为Java创建数组的格式,new type[length],

    // 创建int数组,大小为4,前两个的值为1,2,后面两个使用默认值0
    Expression exp1 = parser.parseExpression("new int[4]{1,2}");
    

    3.2   遍历

    遍历集合的格式为 coll.?[boolean exp],相当于JS数组的filter方法。其中

    1. Coll:表示遍历的集合
    2. .?:逗号和问号为固定格式。
    3. Exp:将当前遍历的对象作为上下文,编写过滤条件,例如[name == ‘张三’],遍历用户的集合,返回姓名为张三的用户。

    当为map类型时,方括号内部使用key表示当前遍历到的键值,使用value表示当前遍历到的value值。

    当只想获取集合中满足条件的第一个值时,coll.^[Boolean exp],

    当只想获取集合中满足条件的最后一个值是,coll.$[Boolean exp]。

    3.3   投影

    集合投影的格式为coll.![projection expression],相当于JS数组的map方法。其中

    1. Coll:表示遍历的集合
    2. .! :逗号和感叹号为固定格式。
    3. Projection expression:将当前遍历的对象作为上下文,编写投影的表达式,例如

    [‘test’ + name],遍历当前用户,返回当前用户的用户名集合,并且在每个用户名上添加test前缀。

    3.4   引用上下文

    无论是上述提到的遍历,投影操作,都可以通过 #this引用到当前遍历的对象,通过#root访问到上下文对象,例如Role对象有List<User>,那么#root会引用到role对象,#this会引用到当前遍历的User对象。

    4、方法

    4.1   构造器

    在Spel中调用构造器,需要new classFullName,即类全名(包名+类名)。

    4.2   对象方法

    在Spel中调用对象方法时,必须将对象添加到上下文中。

    // 调用User对象的getName方法,返回'your name is 张三'
    Expression exp = parser.parseExpression("your name is getName()");
  • 相关阅读:
    解决UITableView中Cell重用机制导致内容出错的方法总结
    Hdu 1052 Tian Ji -- The Horse Racing
    Hdu 1009 FatMouse' Trade
    hdu 2037 今年暑假不AC
    hdu 1559 最大子矩阵
    hdu 1004 Let the Balloon Rise
    Hdu 1214 圆桌会议
    Hdu 1081 To The Max
    Hdu 2845 Beans
    Hdu 2955 Robberies 0/1背包
  • 原文地址:https://www.cnblogs.com/rain144576/p/14758628.html
Copyright © 2011-2022 走看看