在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. username = ‘hr‘
  4. password = ‘123456‘
  5. url = ‘jdbc:oracle:thin:@localhost:1521:XE‘
  6. driver = OracleDriver()
  7. DriverManager.registerDriver(driver)
  8. conn = DriverManager.getConnection(url, username, password)
  9. stmt = conn.createStatement()
  10. sql = "select salary from EMPLOYEES t where t.salary<2300"
  11. rs = stmt.executeQuery(sql)
  12. while (rs.next()):
  13. print rs.getInt(‘salary‘)
  14. rs.close()
  15. stmt.close()

结果:
2200
2100
2200

使用zxJDBC :

[python]

  1. from com.ziclix.python.sql import zxJDBC
  2. url = ‘jdbc:oracle:thin:@localhost:1521:XE‘
  3. username = ‘hr‘
  4. password = ‘123456‘
  5. driverName = ‘oracle.jdbc.driver.OracleDriver‘
  6. mysqlConn = zxJDBC.connect(url,username, password,driverName)
  7. cursor = mysqlConn.cursor()
  8. cursor.execute("select last_name from EMPLOYEES t where t.salary<2300");
  9. #print cursor.fetchone()
  10. list = cursor.fetchall()
  11. for record in list:
  12. print "name:"+record[0]
  13. #print cursor.description[0]
  14. #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. module JavaLang
  3. include_package "java.lang"
  4. end
  5. module JavaSql
  6. include_package ‘java.sql‘
  7. end
  8. begin
  9. username = ‘hr‘
  10. password = ‘123456‘
  11. url = ‘jdbc:oracle:thin:@localhost:1521:XE‘
  12. driverName = ‘oracle.jdbc.driver.OracleDriver‘
  13. JavaLang::Class.forName(driverName).newInstance
  14. conn = JavaSql::DriverManager.getConnection(url, username, password)
  15. stmt = conn.createStatement
  16. sql = "select last_name from EMPLOYEES t where t.salary<2300"
  17. rs = stmt.executeQuery(sql)
  18. while (rs.next) do
  19. puts "名字:"+rs.getString("last_name")
  20. end
  21. rs.close
  22. stmt.close
  23. conn.close()
  24. rescue JavaLang::ClassNotFoundException
  25. puts "ClassNotFoundException"
  26. rescue JavaSql::SQLException
  27. puts "SQLException"
  28. 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. def username = ‘hr‘
  3. def password = ‘123456‘
  4. def url = ‘jdbc:oracle:thin:@localhost:1521:XE‘
  5. def driverName = ‘oracle.jdbc.driver.OracleDriver‘
  6. def sql = Sql.newInstance(url, username, password, driverName)
  7. sql.eachRow("select last_name from EMPLOYEES t where t.salary<2300") {
  8. println "名字:${it.last_name}"
  9. }

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

时间: 2024-10-18 00:07:26

在Java中直接调用js代码(转载)的相关文章

iOS中UIWebView执行JS代码(UIWebView)

iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被人卡出来. 如网页中的这个导航 通常我们不需要WebView中的 导航栏,也不需要里面的返回上一级的交互.. 对WebView常用的另外一种功能就是对某个点击添加对用function实现JS调用OC的交互功能. 下面一一介绍: 1. UIWebView 调用JS代码 OC调用JS通常是,在webVi

java中成员变量、代码块、构造函数执行顺序

1.java虚拟机运行程序,首先需要装载类,安装现装载父类,初始化父类的静态代码块和静态成员变量 再load子类.初始化子类静态代码块和成员变量 2.load完毕父类与子类后,从main函数入口执行程序,先输出,接着new实例化Beetle类,则先实例化父类Insect,实例化父类时,先初始化非静态成员变量和非静态代码块,接着执行父类构造方法 再实例化子类,实例化子类时,先初始化非静态成员变量和非静态代码块,接着执行子类构造方法. package it.xiangnan.test; public

js代码从页面移植到文件中失效或js代码修改后不起作用的解决办法

最近在做关于网站的项目,总是发生这样的问题 写的javascript代码在页面上没有问题,但是将js代码移植到.js的文件中,在页面上进行调用,总是出现失效等错误 另外修改后的js代码,重新刷新网页仍然不起作用 经过大量搜索并经过验证,可以用下面方法来解决 将js代码封装到js文件中失效的原因可能是js文件中存在中文注释,导致在执行的时候中断,在js文件尽量不要写中文注释 修改后的js代码刷新网页后不起效果可能是因为你所用的浏览器使用缓存的问题,可在浏览器中设置取消使用缓存,并删除临时文件,重启

java通过JNI调用c++代码

java通过JNI调用c++代码 1 用java约定接口,生成头文件 创建JniHelloWorld.java public class JniHelloWorld { public JniHelloWorld(){ } public native void sayHello(String name); } 生成头文件供c++使用 javah-jni JniHelloWorld 产生JniHelloWorld.h文件,里面是用c++代码规定了接口形式. 2生成动态链接库文件(http://blo

java中多线程的实例代码

今天开始学习java中的多线程,在看书的过程中写了一个实例来练习多线程的用法,下面把代码放到博文里,里面很多的注释,可以帮助理解.     运行结果如下: main:启动MessageLoop线程...main:等待MessageLoop线程结束...main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息1main:继续等待.main:继续等待.main:继续等待.main:继续等待.Thread-0:消息2main:继续等待.main:继续等待.

在JSP中的java代码中调用js代码

out.println(str)方法就是在JSP服务端运行的时候把str输出到服务端返回给客户端的HTML页面 可以通过out.print()这种方式输出一段JS代码,这段JS代码先声明一个JS函数,声明结束后再调用一下这个方法. 例如: out.println("<script>function showMessage() {alert('set_afterlogin()');}</script>");//声明showMessage方法 out.println

浅析Java中的final关键字(转载)

自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承.也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰.final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方

Java中的static关键字解析 转载

原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字, 也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关 于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试

java中方法调用

JAVA中方法的调用[基础] 一.调用本类中的方法 方法一.被调用方法声明为static ,可以在其他方法中直接调用.示例代码如下: public class HelloWord { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String str="HelloWord!"; int a=0; int b=a+1; int result=