java运行javascript_java调用执行javascript中的方法

我们用到的类:ScriptEngineManager,ScriptEngine,InputStream,Invocable。

InputStream类 : 输入流。这个大家都是知道的吧,我在这里就不多说了。

ScriptEngineManager和ScriptEngine类:

javax.script,始于JDK1.6,不过现在只有sun实现的javascript的解析器.

创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。

script包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口

ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。

通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,

直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。

只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。

Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。

例子:

try{

ScriptEngine engine =newScriptEngineManager().getEngineByName("javascript");

Compilable compilable = (Compilable) engine;

Bindings bindings = engine.createBindings();//Local级别的Binding

String script ="function add(op1,op2){return op1+op2} add(a, b)";//定义函数并调用

CompiledScript JSFunction = compilable.compile(script);//解析编译脚本函数

bindings.put("a",1);bindings.put("b",2);//通过Bindings加入参数

Object result = JSFunction.eval(bindings);

System.out.println(result);//调用缓存着的脚本函数对象,Bindings作为参数容器传入

}

catch(ScriptException e) {}

Invocable接口:

这个是javax.script下的接口,该接口用于对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法。

下面是我写好的一个例子:

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjavax.script.Invocable;

importjavax.script.ScriptEngine;

importjavax.script.ScriptEngineManager;

importjavax.script.ScriptException;

publicclassTest {

publicstaticvoidmain(String[] args)throwsException {

String path ="d://aa.js";

try{

//流得到js

InputStream input =newFileInputStream(path);

//ScriptEngineManager 为 ScriptEngine 类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。

ScriptEngineManager scriptmanager =newScriptEngineManager();

//创建引擎

ScriptEngine script = scriptmanager.getEngineByName("js");

//绑定引擎

script.put("script", script);

//执行io流中的javascript代码

script.eval(newInputStreamReader(input));

Invocable inv = (Invocable) script;

Object[] object = {"123456"};

Object bb=inv.invokeFunction("isPasswd", object);

System.out.println(bb);

}catch(FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

下面是js脚本:

//校验密码:只能输入6-15个字母、数字

functionisPasswd(s)

{

varpatrn=/^[a-zA-Z0-9]{6,15}$/;

if(!patrn.exec(s))returnfalse

returntrue

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值