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代码:

  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)

  1. ScriptEngineManager factory = new ScriptEngineManager();
  2. ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"
  3. scriptEngine.eval(code);

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

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

访问数据库
使用jdbc:

  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 :

  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代码

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

访问数据库

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代码

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

使用GroovyShell:

Java代码

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

访问数据库

  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运行时处理的内容)

在Java中直接调用js代码的更多相关文章

  1. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  2. android 中webview调用js

    1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  3. iOS中UIWebView执行JS代码(UIWebView)

    iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被 ...

  4. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  5. Java&Selenium自动化测试调用JS实现单击

    Java&Selenium自动化测试调用JS实现单击 /* * the method of invoking js to do something * * @author davieyang ...

  6. 在wxml中直接写js代码(wxs)

    我们在h5开发中,很多时候要在html中写到js代码,这个很容易实现.但是在微信小程序开发中,是不能直接在wxml中写js代码的,因此就有了wxs.在wxml中用wxs代码,有以下几种方式(在小程序文 ...

  7. Java中如何调用静态方法

    Java中如何调用静态方法: 1.如果想要调用的静态方法在本类中,可直接使用方法名调用 2.调用其他类的静态方法,可使用类名.方法名调用 关于静态方法能被什么调用 1.实例方法 2.静态发放

  8. <a>标签中的href如何调用js代码

    在HTML中,<a>标签的href属性用于指定超链接的目标的URL.在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接 ...

  9. java调用js代码

    jdk8里使用脚本引擎调用js 1.定义一个js方法: function getRouteInfo(province){ //注意,参数不要带var..在java里执行会报错.. if (provin ...

随机推荐

  1. JS语句循环(100以备奇偶数、100以内与7先关的数、100以内整数的和、10以内阶乘、乘法口诀、篮球弹起高度、64格子放东西)

    3.循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都 ...

  2. ExtJS与jQuery的一点细节上的对比

    首先说明这不是一篇完整解读ExtJS和jQuery所有方面差异的文章,只是针对我个人刚看了两天的jQuery产生的一些疑问的整理.之前用过一段时间ExtJS,了解ExtJS的一些机制.现在做移动开发, ...

  3. 偏序集的Dilworth定理

    定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链.其对偶定理称为Dilworth定理:定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小. ...

  4. mybatis sql注入安全

    1.mybatis语句 SELECT * FROM console_operator WHERE login_name=#{loginName} AND login_pwd=#{loginPwd} 2 ...

  5. 就地交叉数组元素[a1a2b1b2]->[a1b1a2b2]

    问题描述: If [a1,a2,a3...,an,b1,b2...bn] is given input change this to [a1,b1,a2,b2.....an,bn] , solutio ...

  6. POJ 2752 Seek the Name, Seek the Fame (KMP的next函数,求前缀和后缀的匹配长度)

    给一个字符串S,求出所有前缀,使得这个前缀也正好是S的后缀.升序输出所有情况前缀的长度.KMP中的next[i]的意义就是:前面长度为i的子串的前缀和后缀的最大匹配长度.明白了next[i],那么这道 ...

  7. Action Bar详解

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  8. Java 动态代理机制分析及扩展

    Java 动态代理机制分析及扩展,第 1 部分 王 忠平, 软件工程师, IBM 何 平, 软件工程师, IBM 简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟 ...

  9. 基础DOM和CSS操作(二)

    元素样式操作 元素样式操作包括了直接设置CSS样式.增加CSS类别.类别切换.删除类别这几种操作方法.而在整个jQuery使用频率上来看,CSS样式的操作也是极高的,所以需要重点掌握. CSS操作方法 ...

  10. C# winform post请求数据

    刚到公司混的时候,老板要求实现一个从C#的windows应用程序传参数到一个网页,然后这个网页不显示出来,但能把数据返回给应用程序的功能,问了好多人,找了好多资料,都搞不定,后来还是在老板的帮助下搞定 ...