Java调用JS脚本里的方法

Java调用JS脚本里的方法,第1张

   本例子使用了JDK 以上的javax script包 通过Invocable接口实现JAVA调用JS脚本里的方法 本例中调用分为内部执行脚本和外部执行脚本 外部执行脚本分为不带参数调用和带参数调用 主要采用invokeFunction方法调用         ObjectinvokeFunction(String name Object… args)        用于调用脚本中定义的顶层程序和函数         ObjectinvokeMethod(Object thiz String name Object… args)        对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法         package de javase        import javax script Invocable        import javax script ScriptEngineManager        import javax script ScriptEngine        import java io File        import java io Reader        import java io FileReader        public class AjavaInvokingFunction {        public static void main(String[] args) {        // 获得一个JavaScript脚本引擎 也可以是ECMAScript脚本引擎        ScriptEngineManager manager = new ScriptEngineManager()         ScriptEngine engine = manager getEngineByName( JavaScript )         String titlescript = function sayTitle() {         +    println( 源码实例 使用javax script调用JS脚本里的方法 )         +    println( )         + }         try {   

    // 调用内部脚本执行         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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12273768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存