// 调用内部脚本执行 engine eval(titlescript) // 转换为Invocable Invocable invocableEngine = (Invocable) engine // 不带参数调用sayTitle方法 invocableEngine invokeFunction( sayTitle ) // 调用外部脚本执行 // 创建JS文件的File对象 并读入流 File functionscript = new File( ajava js ) Reader reader = new FileReader(functionscript) // 开始执行ajava js里的程序 engine eval(reader) // 不带参数调用sayHello方法 invocableEngine invokeFunction( sayHello ) // 带参数调用sayHello方法 invocableEngine invokeFunction( sayHello mark ) } catch (Exception e) { e printStackTrace() } } } ajava js文件 function sayHello(){ sayHello(null) } function sayHello(name){ if(name==null){ println( 欢迎你!请注册Ajava会员 ) }else{ println(name+ 独立JAVA社区欢迎你 ) } } 运行结果(控制台) 源码实例 使用javax script调用JS脚本里的方法 lishixinzhi/Article/program/Java/hx/201311/26436
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class ExecJs {
/**
* 记录日志类
*/
private Logger log = Logger.getLogger(ExecJs.class)
/**
* 后置处理,执行js脚本
* @param js
* @throws Exception
*/
public void execJs(String js, Map<String,Object>map) throws Exception {
if (log.isDebugEnabled()) {
log.debug("execJs js : " + js)
Iterator<Entry<String, Object>>it = map.entrySet().iterator()
while (it.hasNext()) {
Entry<String, Object>entry = (Entry<String, Object>) it.next()
log.info("EXECJS MAP : " + entry.getKey() + "---" + entry.getValue())
}// end while
}// end if
if ("".equals(js) || js == null) {
log.info("EXECJS ERROR : JAVASCRIPT CONTENT IS NULL")
} else if(map == null || map.size()<=0){
log.info("EXECJS ERROR : MAP CONTENT IS NULL")
} else {
// 获取脚本引擎
ScriptEngineManager mgr = new ScriptEngineManager()
ScriptEngine engine = mgr.getEngineByName("javascript")
// 绑定数据
ScriptContext newContext = new SimpleScriptContext()
Bindings bind = newContext.getBindings(ScriptContext.ENGINE_SCOPE)
bind.putAll(map)
try {
engine.setBindings(bind, ScriptContext.ENGINE_SCOPE)
engine.eval(js)
} catch (Exception e) {
log.info("EXECJS EXCEPTION : EXECUTE JAVASCRIPT EXCEPTION", e)
throw (e)
}// end try
}// end if
}
}
在Java中调用js文件中的function,传入调用参数,并获取返回值
js文件中的merge函数将两个参数a,b相加,并返回c。
// expression.js
function merge(a, b) {
c = a * b
return c
}
在Java代码中读取js文件,并参数两个参数,然后回去返回值。
package com.sinaapp.manjushri
import java.io.FileReader
import javax.script.Invocable
import javax.script.ScriptEngine
import javax.script.ScriptEngineManager
/** * Java调用并执行js文件,传递参数,并活动返回值 * * @author manjushri */
public class ScriptEngineTest {
public static void main(String[] args) throws Exception {
ScriptEngineManager manager = new ScriptEngineManager()
ScriptEngine engine = manager.getEngineByName("javascript")
String jsFileName = "expression.js" // 读取js文件
FileReader reader = new FileReader(jsFileName) // 执行指定脚本
engine.eval(reader)
if(engine instanceof Invocable) {
Invocable invoke = (Invocable)engine // 调用merge方法,并传入两个参数
// c = merge(2, 3)
Double c = (Double)invoke.invokeFunction("merge", 2, 3)
System.out.println("c = " + c)
}
reader.close()
}
}
输出结果:
c = 5.0