`
berdy
  • 浏览: 509616 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MVEL 简单介绍

阅读更多
MVEL是一种基于java语法的表达式语言,为java提供更便捷灵活的动态性。

这里简单介绍一些MVEL的操作:

new 创建一个java对象,new String("foo"),当然这里是举个栗子,String的创建一般是不同这个构造函数的。
对于java.lang.*中的类,无需手动导入。如果是创建自定义的对象,就需要写明类全路径名,或者手动导入。

当需要针对同一个对象进行多次操作时,可以是with语句块来高效操作,
with(user = new User()) {
name = 'jacker',age = 18,sex = Sex.FEMALE
}
更便捷是可以使用点号操作
user = new User().{
name="jack";
parent = new User().{
name = "jack\'s parent";
}
}

动态脚本的一个头痛问题就是变量的作用域问题,经常在调试的时候发现一个局部变量覆盖了全局变量导致程序出错。
mvel提供 isdef 来判断某个变量在当前作用域内是否已经定义。defined = isdef var; 或者 if (isdef var) { doSomething();}

MVEL对正则表达式匹配做了简化,只需要通过 ~= 操作符判断即可,if(var ~= '[a-z].+') {doSomething();}

对集合的一些操作也进行了简化,var contains 'test' 判断var集合中是否包含'test'字符串,var可以是一个array,list或者map,
map的话就是判断keyset中是否包含指定的值。var也可以为string,在MVEL中string被认为是一个数组。
支持 in 操作符对list进行遍历,names = (name in users) 上面的操作可以很快的得到 users集合中每个元素的name属性。
同样支持调用集合中元素的方法(静态方法或者实例方法),(sayHello() in users) ,另外可以在子句后面加上if判断对list中
的元素过滤。 $ 用作占位符,($ in users if $.name contains 'jack')

==操作与java中的不用,MVEL中的使用equals()方法判断的。

list 创建
["Jim", "Bob", "Smith"]
map 创建
['Bob' : new Person('Bob'), 'Michael' : new Person('Michael')]
Array 创建
{"Jim", "Bob", "Smith"}
同时支持 lambda 表达式
threshold = def (x) { x >= 10 ? x : 0 }; result = cost + threshold(lowerBound);
更多的详细内容可以参考MVEL Language Guide
http://mvel.codehaus.org/Language+Guide+for+2.0

下面介绍一下例子:
表达式的执行有两种模式
一种是编译模式,就是先编译表达式并缓存,执行的时候传入对应的参数
一种是解析模式,跟其他脚本语言一样,边解析边执行

编译模式
ExpressionCompiler compiler = new ExpressionCompiler("x + y");
CompiledExpression exp = compiler.compile();
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", 10);
params.put("y", 20);
Object result = MVEL.executeExpression(exp, params);
System.out.println(result);

解析模式
Map<String, Object> params = new HashMap<String, Object>();
params.put("x", 10);
params.put("y", 20);
Object result = MVEL.eval("x+y", params);
System.out.println(result);

调用脚本文件中的函数
File scriptFile = new File("src/main/java/com/test/mvel/test.el");
VariableResolverFactory resolverFactory = new MapVariableResolverFactory();
MVEL.evalFile(scriptFile, ParserContext.create(), resolverFactory);
resolverFactory.createVariable("x", 10);
resolverFactory.createVariable("y", 20);
Object result = MVEL.eval("add(x,y);", resolverFactory);
System.out.println(result);

test.el 文件内容
引用

def add(a,b){
a + b;
}

0
1
分享到:
评论

相关推荐

    MVEL 2.0表达式语言

    MVEL 2.0表达式语言MVEL 2.0表达式语言MVEL 2.0表达式语言

    mvel14-1.2.21.jar

    mvel14-1.2.21.jar mvel14-1.2.21.jar

    MVEL 2.doc

    mvel2.0语法指南,MVEL通常用于执行用户(程序员)通过配置XML文件或注释等定义的基本逻辑。它也可以用来解析简单的JavaBean表达式。Runtime(运行时)允许MVEL表达式通过解释执行或者预编译生成字节码后执行。

    mvel2.0语法指南.pdf

    mvel2.0语法指南中文版

    MVEL脚本语言语法

    很好的MVEL基础语法学习资料,希望能帮到你~

    mvel 2.0.15

    MVEL is very easy to use, and just as easy to integrate into your application. Let's take a quick look at a simple MVEL expression: foo.name == "Mr. Foo" This simple expression asks MVEL if the value...

    mvel-repl:MVEL 的简单复制

    介绍 这是一个用于测试表达式的简单 Repl(Read-Eval-Print-Loop)。 用法 由于这是一个简单的 Maven 项目,因此可以使用 &gt; mvn install 项目配置了Maven exec插件,直接调用即可启动repl &gt; mvn exec:java

    mvel2-2.0.18

    功能强大的基于Java应用程序的表达式语言.

    mvel2-2.1.6.Final-javadoc.jar

    mvel2-2.1.6.Final-javadoc

    \\(^_^)/ 表达式解析器(MVEL)

    NULL 博文链接:https://yanguz123.iteye.com/blog/2146176

    mvel2-2.3.0.Final.jar

    java运行依赖jar包

    mvel-maven-plugin:MVEL 模板 maven 插件

    mvel-maven-插件 使用 MVEL 渲染模板的 Maven 插件。 用法 &lt; groupId&gt;uk.co.codezen &lt; artifactId&gt;mvel-maven-plugin &lt; version&gt;1.0 &lt; goal&gt;render &lt; template

    mvel2-2.1.0.drools16.jar

    mvel2-2.1.0.drools16.jar mvel2-2.1.0.drools16.jar

    MVel 2.0.15 doc

    MVEL is an expression language – similar to OGNL – and a templating engine. I’d like to give you an example of MVEL Templates in this post so you can find out if MVEL might work for you. Templating...

    easyrulesplusmvel:一个结合 Easy Rules 和 MVEL 的 Java 项目

    简单规则 结合和Java 项目演示了如何在 Java 中实现轻量级规则引擎并使决策能够表示为字符串,从而在属性文件或数据库中外部化,或通过 JMX 使用和。

Global site tag (gtag.js) - Google Analytics