java程序中执行脚本代码
由于业务要求,想在java程序中使用脚本引擎执行脚本代码,来提高程序的实现能力,满足灵活的业务需求。并且脚本代码中需要连接访问数据库,和数据库有些交互操作,得到结果,再将结果和JAVA程序做交互,不知广大的朋友们有没有实现的方法,请不吝赐教,在下不胜感激。 --------------------编程问答-------------------- 这样可以不,用java Runtime.exex调用执行脚本,然后将结果写到一个文件中去,再用java程序去读这个文件得到结果。 --------------------编程问答-------------------- 你可以参考javax.script包 --------------------编程问答--------------------javax.script包可供参考,但是关键就是想实现,脚本代码中直接的数据库操作,这点不知有何实现方式? --------------------编程问答-------------------- 这样的问题 还不如定义个规则 自己代码去实现
--------------------编程问答--------------------
之所以增加嵌入脚本,就是因为好多业务规则是多变的,不可能抽象成出一个规则,之所以想在脚本中实现数据库的访问,是因为有些业务规则可能需要在数据库中增加新的表,存储过程等,不可能总是去改核心代码 --------------------编程问答-------------------- javax.script包调用js脚本,js脚本中又可以调用java,访问数据库当然不在话下 --------------------编程问答--------------------
能来段示例代码吗? --------------------编程问答--------------------
首先,装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 inte易做图ce 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.getInte易做图ce(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@address.tony");
Compilable compilable = (Compilable) engine;
CompiledScript compiled = compilable.compile(script);
compiled.eval();
}
}
记得给分哦 --------------------编程问答--------------------
非常感谢,楼上回复这么多,我主要是想解决,在脚本中对数据库进行访问,如果楼上能给出一段脚本中访问数据库的代码,我将不胜感激!
补充:Java , Java EE