`
ivan
  • 浏览: 180965 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在java应用中嵌入groovy

    博客分类:
  • java
阅读更多
需求:
某高校博士录取分数线录取算法是这样的:
1、    硕博连读考生为外语45分以上(含45分,下同), 综合成绩(初试总分*0.7+复试分数*0.3)不低于60分;
2、    普通考生(经济管理学院除外)为外语45分以上,专业课60分以上,综合成绩(初试总分/3*0.7+复试分数*0.3)不低于60分;
3、    经济管理学院(001)考生外语55分以上,专业课60分以上,综合成绩(初试总分/3*0.7+复试分数*0.3)不低于60分。

这段算法简单、清楚,用java实现是a piece of cake,但是考虑到我们的招生系统是为全国很多高校服务的,每个学校的录取算法可能有不同,不能在代码里面写死,最好是能让用户自己配置这段算法。这么简单的算法(高校研究生招生明规则还是比较简单的,潜规则就不清楚了)如果用规则引擎,显然是杀鸡用牛刀了。在目前的需求而言,用脚本语言来处理可能是更好的选择。

java里面对脚本语言的支持很好,以前的话beanshell流行一点(印象中shark、jbpm里面都支持beanshell,不过很久没跟踪了,不知道现在这两大workflow engine的情况怎样了),现在groovy是越来越流行了,最新的groovy 1.6更号称性能有了巨大的改进。(http://www.infoq.com/articles/groovy-1-6),所以这里先尝试groovy。

g了一下,发现在应用里嵌入groovy有三种方式(参考http://groovy.codehaus.org/Embedding+Groovy

第一种是比较传统的,通过GroovyShell的方式,跟用beanshell的方式差不多。
Binding binding = new Binding();
binding.setVariable("foo", new Integer(2));
GroovyShell shell = new GroovyShell(binding);

Object value = shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");
assert value.equals(new Integer(20));
assert binding.getVariable("x").equals(new Integer(123));


第二种方式是通过GroovyClassLoader来动态加载groovy类,然后直接使用groovy类。这点得以实现的原因是每一个groovy类编译后都是合法的java类。这种方式没有太多意思,还不如直接集成java编译器,编译java类后动态加载java类?呵呵。
ClassLoader parent = getClass().getClassLoader();
GroovyClassLoader loader = new GroovyClassLoader(parent);
Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy"));

// let's call some method on an instance
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] args = {};
groovyObject.invokeMethod("run", args);


第三种方式是使用GroovyScriptEngine。如果要在应用中提供最完整的脚本支持,GroovyScriptEngine是不二之选。GSE会做依赖性检测,即某脚本依赖的脚本修改过了,整个脚本树都会重新编译、重新加载。
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;

String[] roots = new String[] { "/my/groovy/script/path" };
GroovyScriptEngine gse = new GroovyScriptEngine(roots);
Binding binding = new Binding();
binding.setVariable("input", "world");
gse.run("hello.groovy", binding);
System.out.println(binding.getVariable("output"));


我们的应用暂时只需要简单的执行一段脚本就可以了,所以选用了第一种方式。将embeddable目录下的groovy-all-1.6.0.jar扔进类路径,在界面配置好脚本(见附图

):
result=false;
if(kslym=='12')
{
    zhcj=cszf*0.7+fscj*0.3;
    if(wgy>=45&&zhcj>=60)result=true;
}
else{
    if(yxsm!='001'){
        zhcj=cszf/3*0.7+fscj*0.3;
        if(wgy>=45&&ywk1>=60&&ywk2>=60&&zhcj>=60)result=true;
    }
    else{
         zhcj=cszf/3*0.7+fscj*0.3;
         if(wgy>=55&&ywk1>=60&&ywk2>=60&&zhcj>=60)result=true;
    }
}


后台判断博士考生是否上线的方法:
    public Boolean canPassed(DoctorRecruitScoreObj score)
    {
        Binding binding=new Binding();
        binding.setVariable("kslym",score.getDoctorResignup().getKslym());
        binding.setVariable("wgy",score.getEnglish());
        binding.setVariable("zzll",score.getZzll());
        binding.setVariable("ywk1",score.getCourseA());
        binding.setVariable("ywk2",score.getCourseB());
        binding.setVariable("cszf",score.getEnglish()+score.getZzll()+score.getCourseA()+score.getCourseB());
        binding.setVariable("fscj",score.getCourseC());
        binding.setVariable("yxsm",score.getDoctorResignup().getBkyxsm());

        GroovyShell shell=new GroovyShell(binding);
        DoctorCuttingscore cuttingScore=getCuttingScore();

        if(cuttingScore!=null)
        {
            shell.evaluate(cuttingScore.getRule());
            return (Boolean)binding.getVariable("result");
        }
        return false;
    }


简单说明:我痛恨变量命名采用拼音缩写,但是高校研*部很多的数据结构都是用拼音缩写来命名,所以这里的脚本只能跟他们接轨。脚本最终是要给老师改的。

完工!

执行效率还是不错的,不知道groovy evaluate同样的脚本后是否会用类似执行sql的方式缓存。在我们这里数据也比较少,只有几百条,毕竟博士考生还是比较少的,一般就几百人。不过呢,可能经过几年硕士就业率也不行了,又鼓励大家继续考博,那博士考生会不会上到几千呢?到时看要不要再优化程序吧,呵呵。
  • 大小: 56.8 KB
3
0
分享到:
评论
2 楼 ivan 2009-04-24  
spring里面要嵌入groovy也不算简单,就我以前了解的(参考http://www.ibm.com/developerworks/cn/java/j-groovierspring1.html),其实跟第二种方式差不多;而第二种方式是满足不了我的要求的,我不可能让老师到服务器上打开脚本文件来修改。(或者也可以让老师在系统里面配置,再保存到脚本文件里面?那其实也将问题复杂化了)
1 楼 stevezheng 2009-04-24  
为什么不用spring框架嵌入groovy呢,免得写那么多

相关推荐

    java应用简单嵌入脚本模块

    压缩包中的`Groovy_Script`很可能包含了几个Groovy脚本文件,这些文件可能包含了示例代码,展示了如何在Java应用中嵌入Groovy脚本。文件名可能如`ScriptExample.groovy`,其中包含了具体的脚本代码,如定义函数、...

    java在嵌入运行groovy代码1

    Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...

    java 动态脚本语言 精通 Groovy

    9. **Scripting in Java Applications**:Groovy可以嵌入到Java应用中作为脚本语言使用,例如在服务器端处理HTTP请求,或者作为配置文件来动态改变应用行为。 10. **持续集成与构建工具**:Groovy也是构建工具如...

    groovy-all.jar-生成JasperReport所要包含的包

    在Java开发中,`groovy-all.jar`是至关重要的,因为它允许你在Java应用程序中无缝地集成Groovy代码。这个单一的JAR文件包含了大量的Groovy模块,包括编译器、类加载器、标准库以及Groovy语言的其他相关组件。这样,...

    groovy经典_资料

    3. **对象和API兼容**:在Groovy中,对象是Java对象,可以使用相同的JDK API,这使得Java开发者能够轻松过渡到Groovy。 4. **在项目中的应用**:Groovy可以作为中小型项目的替代语言,也可以嵌入到大型Java项目中,...

    groovy入门经典,groovyeclipse 插件

    闭包在Groovy中的定义形式通常为`{参数列表 -> 代码块}`。闭包的this指针在闭包内部指向创建它的上下文对象,而`@delegate`注解可以将闭包的未定义方法委托给外部对象处理。 函数式编程在Groovy中也得到了很好的...

    groovy-all-1.8.1.jar.zip

    "`在Groovy中即可实现,而在Java中则需要`System.out.println("Hello, World!");`。 2. 动态类型:Groovy支持动态类型,变量的类型在运行时确定,这使得编码更快速,但可能会带来一些潜在的类型错误。 3. 函数式...

    如何在Android应用中嵌入 AdMob 广告

    在Android应用开发中,嵌入AdMob广告是增加收入、实现应用商业化的一种常见方式。AdMob是Google提供的一款强大的移动广告平台,它允许开发者在自己的应用程序中展示各种类型的广告,如横幅广告、插屏广告和原生广告...

    groovy基础语法.pdf

    在Groovy中,基本语法包括变量、属性、方法和闭包的定义,控制结构如if-else、for循环、while循环、switch语句,以及类和对象的操作等。 变量和数据类型: Groovy是动态类型语言,变量无需声明类型即可直接赋值使用...

    The Groovy Programming Language

    2. **脚本片段**:可以在模板中嵌入Groovy脚本,用于控制逻辑。 3. **可扩展性**:可以通过自定义标记库来扩展Groovy Markup的功能。 #### 额外功能 除了上述核心功能外,Groovy还提供了一系列额外的工具和支持: ...

    Introduction to Groovy

    这意味着开发者可以在Groovy程序中使用任何Java库,也可以将Groovy嵌入到桌面Java应用程序或J2EE应用程序中。此外,Groovy程序还可以使用JUnit进行测试,使用Eclipse、JSwat或IntelliJ等IDE进行调试,并且可以使用...

    Groovy in Action[文字版][中文]

    在Groovy中,开发者可以利用闭包(Closure)和面向切面编程(AOP)等特性,编写出更加简洁和可维护的代码。 1. **Groovy语法特性**:Groovy的语法比Java更为宽松,它支持方法和变量的自动类型推断,可以省略分号和...

    自己挣点油钱__AdMob:在android应用中嵌入广告的方案

    【标题】:“自己挣点油钱__AdMob:在Android应用中嵌入广告的方案” 在Android应用开发中,为了实现盈利或者补贴开发成本,许多开发者会选择在自己的应用中嵌入广告。AdMob是Google提供的一个强大的移动广告平台,...

    Groovy 学习资料

    - **GString**:GString是Groovy中的动态字符串,支持表达式嵌入,类似于Java的`String.format()`。 - **集合操作**:Groovy提供了丰富的集合操作,如`each`、`collect`、`find`等,使得处理集合更加简便。 5. **...

    groovy 1.8.6

    8. **Grails**:一个基于Groovy的Web应用框架,利用Groovy的强大功能简化了Web开发流程,是Groovy在企业级应用中的重要应用之一。 9. **Gant**:Gant是构建自动化工具,使用Groovy脚本替代Ant的XML配置,使得构建...

    jetty6 嵌入到 javaproject中

    1. 简化部署:通过嵌入Jetty,开发者可以直接在Java应用程序中运行Web服务,无需额外配置独立的服务器实例。 2. 快速启动:Jetty设计为快速启动和响应,这对于开发和测试环境尤其有用。 3. 动态更新:在嵌入式模式下...

    groovy in action

    书中会介绍如何在Groovy中使用Java类库,以及如何在Java项目中嵌入Groovy脚本,这对于企业级开发尤其有用,因为很多现有的系统都是基于Java构建的。同时,Groovy的Grails框架也是其应用领域的重要部分,该框架用于...

Global site tag (gtag.js) - Google Analytics