由于业务要求,想在java程序中使用脚本引擎执行脚本代码,来提高程序的实现能力,满足灵活的业务需求。并且脚本代码中需要连接访问数据库,和数据库有些交互操作,得到结果,再将结果和JAVA程序做交互,不知广大的朋友们有没有实现的方法,请不吝赐教,在下不胜感激。

解决方案 »

  1.   

    这样可以不,用java Runtime.exex调用执行脚本,然后将结果写到一个文件中去,再用java程序去读这个文件得到结果。
      

  2.   


    javax.script包可供参考,但是关键就是想实现,脚本代码中直接的数据库操作,这点不知有何实现方式?
      

  3.   

    javax.script包调用js脚本,js脚本中又可以调用java,访问数据库当然不在话下
      

  4.   

    首先,装jdk6,配置环境。
    安装编译组件junit4,ant1.6等。
    源文件:
    简单的helloword测试类:
    package com.hy.testScript;public class HelloWorld {
    String s = "Hello World!我爱苏小雨~~~";
      public void sayHello(){
      System.out.println(s);
      }
    }
    hello.js文件
    print("Hello World!\n");
    MaxMin.java接口文件
    package com.hy.testScript;public interface MaxMin {
    public int max(int a, int b);
      public int min(int a, int b);
    }Test.java 测试类文件
    package com.hy.testScript;
    //导入需要的包
    import java.io.FileNotFoundException;
    import java.io.FileReader;import javax.script.Compilable;
    import javax.script.CompiledScript;
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineFactory;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    //junit4测试jar包要导入的哦~~~
    import org.junit.Assert;public class Test {/**
    * @param args
    * @throws ScriptException
    * @throws FileNotFoundException
    * @throws InterruptedException
    * @throws NoSuchMethodException
    */
    public static void main(String[] args) throws ScriptException,
    FileNotFoundException, InterruptedException, NoSuchMethodException {
    // TODO Auto-generated method stub
      // 测试你的jdk可支持的脚本类型
    // ScriptEngineManager factory = new ScriptEngineManager();
    // for (ScriptEngineFactory available : factory.getEngineFactories()) {
    // System.out.println(available.getEngineName());
    // }
      // 构造脚本引擎管理工厂
    ScriptEngineManager factory = new ScriptEngineManager();
      //构造脚本引擎
    ScriptEngine engine = factory.getEngineByName("JavaScript");
      //测试js的输出语句,输出Hello World!并换行
    engine.eval("print('Hello World!\\n')");
    // /engine.eval("if(true){println ('hello')");
    int i = 0;
    System.out.println("开始循环执行hello.js文件:");
    while (i < 5) {
    // 寻找文件从工程根开始。注意:路径是很重要的,从工程根开始。
    engine.eval(new FileReader("src/com/hy/testScript/hello.js"));
      // 加入睡眠可以看的更清楚
    Thread.sleep(1000);
    i++;
    }
      // 不一样的调用,这里通过脚本引擎调用java类
    System.out.println("开始调用类HelloWorld的对象hello的方法:sayHello");
    HelloWorld hello = new HelloWorld();
    engine.put("script_hello", hello);
    engine.eval("script_hello.sayHello()");
    System.out.println("开始调用js脚本方法say:");
    String script = "function say(first,second){ print(first +' '+ second+'\\n'); }";
    engine.eval(script);
    Invocable inv = (Invocable) engine;
    inv.invokeFunction("say", "Hello", "Tony");
    script = "function max(first,second) "
    + "{ return (first > second) ?first:second;}";
    engine.eval(script);
      //js与java接口的调用
    Object obj = inv.invokeFunction("max", "1", "0");
      //利用junit4进行测试
    Assert.assertEquals("1", obj.toString());
    System.out.println(obj.toString());
    //接口调用,用js实现java接口,呵呵~~~
    script = "function max(first,second) "
    + "{ return (first > second) ?first:second;}";
    script += "function min(first,second) { return (first < second) ?first:second;}";
    engine.eval(script);
    MaxMin maxMin = inv.getInterface(MaxMin.class);
    Assert.assertEquals(1, maxMin.max(1, 0));
    Assert.assertEquals(0, maxMin.min(1, 0));
    //脚本的编译执行,测试外部js正则表达式的应用,请注意中文标点在你调试的时候,适当修改下代码哦
    script = "var email=/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]"  
    + "+(\\.[a-zA-Z0-9_-]+)+$/;";
    script += "var ip = /^(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])"
    +"(\\.(\\d{1,2}|1\\d\\d|2[0-4]\\d|25[0-5])){3}$/;";
    script += "if(email.test(str)){println('it is an email')}"
    + "else if(ip.test(str)){println('it is an ip address')}"
    + "else{println('I don\\'t know')}";
    engine.put("str", "[email protected]");
    Compilable compilable = (Compilable) engine;
    CompiledScript compiled = compilable.compile(script);
    compiled.eval();}}
    记得给分哦