yxhxj2006

          導航

          <2015年11月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(7)

          隨筆分類

          文章分類

          隨筆檔案

          閱讀排行榜

          評論排行榜

          常用鏈接

          統計

          最新評論

          在Java中直接調用js代碼

          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運行時處理的內容)

          posted on 2015-11-19 00:25 奮斗成就男人 閱讀(2935) 評論(0)  編輯  收藏 所屬分類: java

          主站蜘蛛池模板: 丹阳市| 比如县| 秦安县| 汉川市| 明光市| 达拉特旗| 调兵山市| 龙里县| 宣武区| 邵武市| 金门县| 驻马店市| 石林| 珲春市| 安乡县| 上林县| 德兴市| 柘荣县| 平陆县| 科技| 德格县| 微山县| 双辽市| 库车县| 沅江市| 和龙市| 壤塘县| 象山县| 固镇县| 安塞县| 闽清县| 田林县| 绥芬河市| 阿瓦提县| 普安县| 昌江| 石家庄市| 宣城市| 许昌市| 菏泽市| 江西省|