在Java中直接调用js代码

    xiaoxiao2021-03-25  82

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。

    在Java中直接调用js代码

    不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert” is not defined。

      package com.sinaapp.manjushri; 点击打开链接 import javax.script.ScriptEngine;  import javax.script.ScriptEngineManager; import javax.script.ScriptException;   /** * 直接调用js代码 */ public class ScriptEngineTest {     public static void main(String[] args) {  ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try{ engine.eval("var a=3; var b=4;print (a+b);"); // engine.eval("alert(\"js alert\");"); // 不能调用浏览器中定义的js函数 // 错误,会抛出alert引用不存在的异常 }catch(ScriptException e){ e.printStackTrace(); } }   }

    输出结果:7

    在Java中绑定js变量

    在调用engine.get(key);时,如果key没有定义,则返回null

      package com.sinaapp.manjushri;   import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException;   public class ScriptEngineTest2 { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); engine.put("a", 4); engine.put("b", 3); Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); try { // 只能为Double,使用Float和Integer会抛出异常 Double result = (Double) engine.eval("a+b"); System.out.println("result = " + result); engine.eval("c=a+b"); Double c = (Double)engine.get("c"); System.out.println("c = " + c); } catch (ScriptException e) { e.printStackTrace(); } } }

    输出: result = 7.0 c = 7.0

    在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


    java调用脚本语言笔记(jython,jruby,groovy)

     有两种方法 1.Java SE 6以后实现了jsr 223规范 java代码:

    [java] ScriptEngineManager factory = new ScriptEngineManager();   ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"   scriptEngine.eval(code);//执行一段脚本,code是js代码  

     很方便调用脚本

    2.可以使用脚本语方本身提供的与java的集成手段

    jython集成 使用jsr223: 前提下载jython的包,已实现jsr223 (建议在官网上下载,在安装目录下有jython.jar,http://repo2.maven.org/maven2/org/python/jython/2.5.0/ 这里也有,但是这个包里没有jsr223的实现,看包下存不存在org.Python.jsr223)

    [java] ScriptEngineManager factory = new ScriptEngineManager();   ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"   scriptEngine.eval(code);  

    使用PythonInterpreter,可以调用exec(String code)方法:

    [java] PythonInterpreter interpreter = new PythonInterpreter();   interpreter.exec(code);  

    访问数据库 使用jdbc:

    [python]  from oracle.jdbc.driver import OracleDriver   from java.sql import DriverManager      username = 'hr'   password = '123456'   url = 'jdbc:oracle:thin:@localhost:1521:XE'   driver = OracleDriver()   DriverManager.registerDriver(driver)   conn = DriverManager.getConnection(url, username, password)   stmt = conn.createStatement()   sql = "select salary from EMPLOYEES t where t.salary<2300"   rs = stmt.executeQuery(sql)   while (rs.next()):    print rs.getInt('salary')   rs.close()   stmt.close()  

     结果: 2200 2100 2200

    使用zxJDBC :

    [python]  from com.ziclix.python.sql import zxJDBC      url = 'jdbc:oracle:thin:@localhost:1521:XE'   username = 'hr'   password = '123456'   driverName = 'oracle.jdbc.driver.OracleDriver'   mysqlConn = zxJDBC.connect(url,username, password,driverName)   cursor = mysqlConn.cursor()        cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");   #print cursor.fetchone()   list = cursor.fetchall()   for record in list:       print "name:"+record[0]   #print cursor.description[0]   #print cursor.description[1]  

     结果: name:麦克 name:Olson name:Philtanker

    从数据库中查出的中文内容正常的。 而在代码里面的中文全部是乱码或抛异常,未解决。

    与jruby集成 使用jsr223:Java代码

    [java] ScriptEngineManager factory = new ScriptEngineManager();   ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"   scriptEngine.eval(code);  

     访问数据库

    Ruby代码

    [ruby]  require 'java'      module JavaLang     include_package "java.lang"   end      module JavaSql     include_package 'java.sql'   end      begin    username = 'hr'    password = '123456'    url = 'jdbc:oracle:thin:@localhost:1521:XE'    driverName = 'oracle.jdbc.driver.OracleDriver'    JavaLang::Class.forName(driverName).newInstance    conn = JavaSql::DriverManager.getConnection(url, username, password)    stmt = conn.createStatement    sql = "select last_name from EMPLOYEES t where t.salary<2300"    rs = stmt.executeQuery(sql)    while (rs.nextdo     puts "名字:"+rs.getString("last_name")    end    rs.close    stmt.close    conn.close()   rescue JavaLang::ClassNotFoundException    puts "ClassNotFoundException"   rescue JavaSql::SQLException    puts "SQLException"   end  

     

     结果: 名字:楹﹀厠 名字:Olson 名字:Philtanker

     

    从数据库中查出的中文内容为乱码的。 而在代码里面的中文正常。

     

    与groovy集成 使用jsr223:

    Java代码

    [java]  ScriptEngineManager factory = new ScriptEngineManager();   ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"   scriptEngine.eval(code);  

     使用GroovyShell:

    Java代码

    [java]  GroovyShell shell = new GroovyShell();   Script script = shell.parse(code);   Object result = script.run();  

    访问数据库

    Groovy代码

     

    import groovy.sql.Sql      def username = 'hr'   def password = '123456'   def url = 'jdbc:oracle:thin:@localhost:1521:XE'   def driverName = 'oracle.jdbc.driver.OracleDriver'   def sql = Sql.newInstance(url, username, password, driverName)      sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {    println "名字:${it.last_name}"   }  

    结果: 名字:麦克 名字:Olson 名字:Philtanker

     

    在使用groovy过程中碰到了一个异常 Exception in thread "main" java.lang.VerifyError: (class: groovy/runtime/metaclass/java/util/ArrayListMetaClass, method: super$2$invokeMethod signature: (Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;ZZ)Ljava/lang/Object;) Illegal use of nonvirtual function call 这个异常解决花了很长时间 是因为在原来项目中存在json-lib-2.1.jar(有可能名称为json-lib-2.1-jdk15.jar),这个包是用来处理json的,与groovy1.7.5存在冲突,更新为json-lib-2.3.jar即可 (json-lib里有一些groovy运行时处理的内容)

    转载请注明原文地址: https://ju.6miu.com/read-10592.html

    最新回复(0)