java程序中执行脚本代码 由于业务要求,想在java程序中使用脚本引擎执行脚本代码,来提高程序的实现能力,满足灵活的业务需求。并且脚本代码中需要连接访问数据库,和数据库有些交互操作,得到结果,再将结果和JAVA程序做交互,不知广大的朋友们有没有实现的方法,请不吝赐教,在下不胜感激。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这样可以不,用java Runtime.exex调用执行脚本,然后将结果写到一个文件中去,再用java程序去读这个文件得到结果。 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 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();}}记得给分哦 基于aglet平台的数据库连接(求助) 菜鸟求教 java中有没有透明贴图??就像C中那种图片中指定颜色透明?? 大家说 www.ij2ee.com 这个站点做什么内容好呢 有关Junit测试 二进制转换 关于重复登陆的问题,如何使得先前登录的用户强制退出。 Tomcat高手请进。。能否停止或启动虚拟主机中的单个网站? 有关jndi的设置 动态EJB-QL的问题,高手请进来(解决后立即结账,在线等待) Log4j原理疑问--关于系统自己写的那些信息 根据数据库里的数据,如何在jsp中显示排名上升下降时用的向上向下箭头
javax.script包可供参考,但是关键就是想实现,脚本代码中直接的数据库操作,这点不知有何实现方式?
安装编译组件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();}}
记得给分哦