您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > mvel20语法指南
mvel2.0语法指南虽然mvel吸收了大量的Java语法,但作为一个表达式语言,还是有着很多重要的不同之处,以达到更高的效率,比如:mvel像正则表达式一样,有直接支持集合、数组和字符串匹配的操作符。除了表达式语言外,mvel还提供了用来配置和构造字符串的模板语言。mvel2.x表达式包含以下部分的内容:属性表达式,布尔表达式,方法调用,变量赋值,函数定义。一、基本语法MVEL是一种基于java语法,但又有着显著不同的表达式语言。与java不同,MVEL是动态类型(带有可选分类),也就是说在源文件中是没有类型限制的。一条MVRL表达式,简单的可以是单个标识符,复杂的则可能是一个充满了方法调用和内部集合创建的庞大的布尔表达式。1、简单的属性表单式:user.name在这个表达式中,我们只是有一个标识符(user.name),这就是我们所说的MVEL的AA级属性表达式,该表达式的唯一目的是获取一个变量或上下文对象的属性。属性表达式是MVEL的最常见的用途之一,通过它,MVEL可以用来作为一个高性能,易使用的反射优化器。2、布尔表达式:MVEl也可以用来表示一个布尔表达式,如:user.name=='JohnDoe'.像java一样,MVEL支持所有优先级规则,包括通过括号来控制执行顺序,如:(user.name=='JohnDoe')&&((x*2)-1)203、复合语句表达式:在一段脚本里,你可以写任意多个语句,但注意要用分号来作为每个语句的结束符,只有一个语句时或最后一个语句时除外。例如:statement1;statement2;statement3注意最后一个语句没有分号。另外,换行不能替代分号来作为一个语句的结束标识。4、返回值:比如,MVEL使用了输出最后值原则,也就是说,尽管MVEL定义了return关键字,但却没有必要用它。例如;a=10;b=(a=a*2)+10;a;这段脚本将最后一个表达式的值a作为自己的值返回,功能上它与下面这段脚本等价:a=10;b=(a=a*2)+10;returna;二、操作符下面列出了MVEL中所有的操作符:一元操作符:new,用来实例化对象,例:newString(foo)with,对单个对象执行多个操作,例:with(value){name='Foo',age=18,sex=Sex.FEMALE}assert,用一个AssertionError断言一个值的对错,例:assertfoo!=nullisdef,用来判断一个变量在某个范围内是否定义,例:isdefvariableName!,布尔取反操作符,例:!true==false比较运算符;常见的比较运算符==,!=,,,=,=等不再赘述contains,判断左边的值是否包含右边的值,如:varcontainsFoois/instanceof,判断左边的值是否是右边的类的实例,如:varinstanceofIntegerstrsim,比较两个字符串的相似度,返回一个百分数,如;foobiestrsimfoobarsoundslike,比较两个字符串的发音,如:foobarsoundslikefubar逻辑运算符:&&,||略or,用于多个值间进行逻辑或运算,如:fooorbarorbarfooor'N/A'~=,正则表达式匹配符,如:foo~='[a-z].+'按位运算符:&,|,^等数学运算符:+,-,*,/等其它运算符:+,字符串连接运算,如:foo+bar#,字符连接运算,如:1#2返回12in,投影整个项目集合,如:(fooinlist)=,赋值运算符,如:var=foobar三、值判断在MVEL中所有的判断是否相等都是对值的判断,而没有对引用的判断,因此表达式foo=='bar'等价于java中的foo.equals(bar).1、判断值是否为emptiness(需要解释emptiness)MVEL提供了一个特殊的字符来表示值为emptiness的情况,叫作empty,如:foo==empty,若foo满足emptiness的任何条件,这个表达式值都为true2、为null测试MVEL中,null和nil都可以用来表示一个空值,如:foo==null;foo==nil;3、强制转换当两个不同类型且没有可比性的值进行比较时,需要将左边的值强制转换成右边的值的类型时,MVEL会应用类型强制转换系统,反之亦然。如:123==123;这个表达式的值为true,因为为了执行比较,强制类型转换系统会隐式的将数字123转换成字符串。四、列表、map和数组在MVEL中你可以使用非常简单的语法来描述列表、map、数组,且看下面的例子:['Bob':newPerson('Bob'),'Michael':newPerson('Michael')]这个表达式在等价于以下语句:Mapmap=newHashMap();map.put(Bob,newPerson(Bob));map.put(Michael,newPerson(Michael));用这种结构描述MVEL内部数据结构,功能非常强大,你可以在任何地方使用它,甚至可以作为参数使用,如:something.someMethod(['foo':'bar']);1、列表列表用下面的格式来描述:[item1,item2,...],如:[Jim,Bob,Smith]2、mapmap的描述格式:[key1:value1,key2:value2,...],如:[Foo:Bar,Bar:Foo]3、数组,格式:{item1,item2,...},如:{Jim,Bob,Smith}4、数组的强制转换关于数组,需要知道的一个非常重要的方面是,它可以被强制转换成其它类型的数组,当你声明一个数组时,是不直接指定其类型的,但你可以通过将其传递给一个接收int[]类型参数的方法来指定。如:foo.someMethod({1,2,3,4});在这种情况下,当MVEL发现目标方法接收的是一个int[],会自动的将{1,2,3,4}转换成int[]类型。五、属性访问对于bean属性的访问,在Groovy,OGNL,EL等脚本语言的bean属性表达式中已经形成了一个相对比较稳定的方式,MVEL也采用了这一方式。和其它语言必须通过底层的方法来控制权限不同的是,MVEL提供了一套独立的,统一的语法来访问属性,静态字段还有map。1、beanproperties大多数java开发者都熟悉getter/setter模式,并在java对象中用它来封装属性的访问权限。例如,你可能会通过下面的方式访问一个对象的属性:user.getManager().getName();简便起见,在MVEL中你也可以用下面的表达式来访问:user.manager.name注意:当一个对象中的字段的作用域是public时,MVEL仍然倾向于通过get方法来访问其属性。2、Null-SafeBeanNavigation有时,当你的表达式中会含有null元素时,这时就需要你进行一个为空判断,否则就会发生错误。当你使用null-safe操作符时你可以简化这个操作:user.?manager.name它相当于:if(user.manager!=null){returnuser.manager.name;}else{returnnull;}3、集合集合的遍历也可以通过简单的语法来实现:List:可以像访问数组一样访问List,如:user[5],这等价与java代码中的user.get(5);Map:Map的访问和访问数组也非常相似,不同的是,在访问Map时索引值可以是任意对象,如:user[foobar]这等价于java代码中的user.get(foobar);当Map的key是String类型时,还可以使用特殊的方式来访问,如:user.foobar,也就是允许你把map本身看成一个虚拟的对象,来访问其属性4、字符串作数组为了能使用属性的索引(迭代也是如此),所有的字符串都可以看成是一个数组,在MVEL中你可以用下面的方式来获取一个字符串变量的第一个字符:foo=MyString;foo[0];//returns'M'六、常量在脚本语言中,一段文字用来代表一个固定的值1、字符串常量:字符串常量可以用一对单引号或一对双引号来界定。如:Thisisastringliteral'Thisisalsostringliteral'字符串中的特殊字符://-代表一个反斜杠./n-换行符/r-回车符/u####-Unicode字符(如:/uAE00)/###-Octal字符(如:/73)2、数字常量整数可以表示为十进制(基数为10),8进制(基数为8),或十六进制(基数为16)。一个十进制数字,不从零开始(相对于8进制、16进制而言),可以表示任意数,如:125一个八进制数,以0为前缀,后面跟着0到7内的数字一个十六进制,以0X为前缀,后面可以跟着0-9,A-F范围内的数字3、浮点型常量如:10.503//adouble94.92d//adouble14.5f//afloat4、BigInteger和BigDecimal型常量如:104.39484B//BigDecimal8.4I//BigInteger5、布尔型常量布尔型常量用保留关键字true和false来表示。6、空常量用null或nil来表示七、程序控制事实上,MVEL的强大已经超出了简单的表达式。它提供了一系列的程序控制操作符来提高你的脚本操作,1、If-Then-ElseMVEL提供了完整的C/Java式的if-then-else块,如:spanclass=code-keywordspanstyle=color:rgb(119,0,0);if/span/span(spanclass=code-keywordspanstyle=color:rgb(119,0,0);var/span/span0){spanclass=code-objectspanstyle=color:rgb(145,0,145);System/span/span.out.println(spanclass=code-quotespanstyle=color:rgb(0,0,119);Greaterthanzero!/span/span);}spanclass=code-keywordspanstyle=color:rgb(119,0,0);else/span/spanspanclass=code-keywordspanstyle=color:rgb(119,0,0);if/span/span(spanclass=code-keywordspanstyle=color:rgb(119,0,0);var/span/span==-1){spanclass=code-objectspanstyle=color:rgb(145,0,145);System/span/span.out.println(spanclass=code-quotespanstyle=color:rgb(0,0,119);Minusone!/span/span);}spanclass=code-keywordspanstyle=color:rgb(119,0,0);else/span/span{spanclass=code-objectspanstyle=color:rgb(145,0,145);System/span/span.out.println(spanclass=code-quotespanstyle=color:rgb(0,0,119);Something/spanspanclass=code-keywordspanstyle=color:rg
本文标题:mvel20语法指南
链接地址:https://www.777doc.com/doc-2889222 .html