zoukankan      html  css  js  c++  java
  • 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887

    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]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("javascript");//或者"js"  
    3. 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]
    1. ScriptEngineManager factory = new ScriptEngineManager();  
    2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"  
    3. scriptEngine.eval(code);  


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

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

    访问数据库
    使用jdbc:

    [python] 
    1. from oracle.jdbc.driver import OracleDriver  
    2. from java.sql import DriverManager  
    3.   
    4. username = 'hr'  
    5. password = '123456'  
    6. url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    7. driver = OracleDriver()  
    8. DriverManager.registerDriver(driver)  
    9. conn = DriverManager.getConnection(url, username, password)  
    10. stmt = conn.createStatement()  
    11. sql = "select salary from EMPLOYEES t where t.salary<2300"  
    12. rs = stmt.executeQuery(sql)  
    13. while (rs.next()):  
    14.  print rs.getInt('salary')  
    15. rs.close()  
    16. stmt.close()  


     结果:
    2200
    2100
    2200

    使用zxJDBC :

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


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

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

    与jruby集成
    使用jsr223:Java代码

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

     访问数据库

    Ruby代码

    [ruby] 
    1. require 'java'  
    2.   
    3. module JavaLang  
    4.   include_package "java.lang"  
    5. end  
    6.   
    7. module JavaSql  
    8.   include_package 'java.sql'  
    9. end  
    10.   
    11. begin  
    12.  username = 'hr'  
    13.  password = '123456'  
    14.  url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    15.  driverName = 'oracle.jdbc.driver.OracleDriver'  
    16.  JavaLang::Class.forName(driverName).newInstance  
    17.  conn = JavaSql::DriverManager.getConnection(url, username, password)  
    18.  stmt = conn.createStatement  
    19.  sql = "select last_name from EMPLOYEES t where t.salary<2300"  
    20.  rs = stmt.executeQuery(sql)  
    21.  while (rs.next) do  
    22.   puts "名字:"+rs.getString("last_name")  
    23.  end  
    24.  rs.close  
    25.  stmt.close  
    26.  conn.close()  
    27. rescue JavaLang::ClassNotFoundException  
    28.  puts "ClassNotFoundException"  
    29. rescue JavaSql::SQLException  
    30.  puts "SQLException"  
    31. end  


     

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

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

    与groovy集成
    使用jsr223:

    Java代码

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


     使用GroovyShell:

    Java代码

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


    访问数据库

    Groovy代码
    1. import groovy.sql.Sql  
    2.   
    3. def username = 'hr'  
    4. def password = '123456'  
    5. def url = 'jdbc:oracle:thin:@localhost:1521:XE'  
    6. def driverName = 'oracle.jdbc.driver.OracleDriver'  
    7. def sql = Sql.newInstance(url, username, password, driverName)  
    8.   
    9. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {  
    10.  println "名字:${it.last_name}"  
    11. }  

    结果:
    名字:麦克
    名字: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运行时处理的内容)

  • 相关阅读:
    Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
    Microsoft Enterprise Library 5.0 系列(五) Data Access Application Block
    Microsoft Enterprise Library 5.0 系列(八) Unity Dependency Injection and Interception
    Microsoft Enterprise Library 5.0 系列(九) Policy Injection Application Block
    Microsoft Enterprise Library 5.0 系列(三) Validation Application Block (高级)
    软件研发打油诗祝大家节日快乐
    从挖井的故事中想到开发管理中最容易忽视的几个简单道理
    ITIL管理思想的执行工具发布
    管理类软件设计“渔”之演化
    20070926日下午工作流与ITILQQ群 事件管理 讨论聊天记录
  • 原文地址:https://www.cnblogs.com/aoldman/p/4562888.html
Copyright © 2011-2022 走看看