// 调用内部脚本执行 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
随着java 的出现 向java嵌入javascript脚本变的特别容易 java 引入了一个新的javax script包 为脚本化语言提供了一个通用接口
案例 小说 网java中嵌入javascript脚本的思路
取得脚本解释器的管理器Manager
从管理器中取得js的解释器实例ScriptEngine
取得存储javascript变量的Bindings实例
把一个java io Reader流及Bindings传递给ScriptEngine的eval()方法 从而运行存储在外部文件中的脚本 eval()方法返回脚本缺扮运行结果 如果执行中发生错误 会抛出ScriptException异常
例 运行javascript脚本的一个java程序
import java io * import javax script Bindings import javax script ScriptEngine import javax script ScriptEngineManager import javax script ScriptException /**author by ?id= */public class RunScript { public static void main(String[] args) throws IOException{ ScriptEngineManager scriptManager = new ScriptEngineManager()//得到解释器的管理器 里面有很多种脚本解释器 ScriptEngine js = scriptManager getEngineByExtension( js )//从管理器中获取js的解释器 //定义我们要运行的颤扮胡脚本文件 String filename = null //通过解释器来获得存储javascript变量的Bindings的实例 使它们提供给脚本 Bindings bindings = js createBindings() 茄拦 //处理参数 参数是定义的脚本的变量 参数可能包括 Dname/value对 我们要进行处理 任何参数不能以 D 为文件名开始 for(int i = i<args lengthi++){ String arg = args[i] if(arg startsWith( D )){//如果参数是以 D 开头 则进行处理 int pos = arg indexOf( = ) if(pos == ) usage() String name=arg substring( pos) String value= arg substring(pos+ ) //注意 我们定义的所有的变量是字符串 如果必要的话 我们可以通过java lang Number 一个java lang Boolean 任何Java对象或NULL 将脚本转换为其他类型 bindings put(name value)//脚本中的变量存入bindings实例中 }else{ if(filename!=null)usage() filename=arg } } //这里是为了确保我们得到了一个文件的参数 if(filename==null){ usage() } //增加一个具有约束力的使用特殊的保留变量名称 告诉脚本引擎的文件的名称将执行 这使它能够提供更好的错误信息 bindings put(ScriptEngine FILENAME filename) //读取文件的流 Reader in = new FileReader(filename) try{ //执行脚本并取得结果 注意in就相当于js中的脚本 而bindings是脚本执行所需要的变量 Object result = js eval(in bindings) System out println(result) }catch(ScriptException ex){ //执行过程中出异常则显示一个错误信息 System out println(ex) } } static void usage(){ System err println( Usage: java RunScript[ Dname=value] script js ) System exit( )//异常退出程序 如果正常退出程序用System exit( ) } }
这段代码中所创建的Bindings对象不是静态的 JavaScript脚本所创建的所有的变量都存储在这里 下面是一个脚本化Java的更加实用的例子 它将它的Bindings对象存储在一个具有较高的作用域的ScriptContext对象中 以便可以读取其变量 但是新的变量就不存储到Binhdings对象中 这个例子实现了一个简单的配置文件工具 即一个文本文件 用来定义名字/值对 可以通过这里定义的Configuration类来查询它们 值可能是字符串 数字或布尔值 并且 如果一个值包含在花括号中 那么它就会传递给一个JavaScript解释器去计算 java util Map对象保存了这些包装在一个SimpleBindings对象中的值 这样一来 JavaScript解释器也可以访问同一个文件中定义的其他变量的值
lishixinzhi/Article/program/Java/JSP/201311/19250在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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)