由于业务要求,想在java程序中使用脚本引擎执行脚本代码,来提高程序的实现能力,满足灵活的业务需求。并且脚本代码中需要连接访问数据库,和数据库有些交互操作,得到结果,再将结果和JAVA程序做交互,不知广大的朋友们有没有实现的方法,请不吝赐教,在下不胜感激。
解决方案 »
- java读取一个文件夹下的所有文件,不要读子文件
- 麻烦给个好的分页方法
- 谁能推荐struts2+spring+hibernate的书
- JAAS如何在cmd中设置两个config file
- 各位都说说web.xml可以做的事情吧。大家都来列上吧谢谢
- 如何编写WebService客户端?
- 关于servlet链
- 请问一下在java中怎么读取一个access数据库的所有表名?
- 用JBuilder把EJB发布成Web Service是出错,大家来看看为什么?
- 最简单的sturts出问题了
- 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();}}
记得给分哦