您的位置:首页 > 编程语言 > Ruby

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

2013-08-10 14:45 465 查看


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

有两种方法

1.java se 6以后实现了jsr 223规范

java代码:

[java] view
plaincopy

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] view
plaincopy

ScriptEngineManager factory = new ScriptEngineManager();

ScriptEngineManager scriptEngine = factory.getEngineByName("python");//或者"jython"

scriptEngine.eval(code);

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

[java] view
plaincopy

PythonInterpreter interpreter = new PythonInterpreter();

interpreter.exec(code);

访问数据库

使用jdbc:

[python] view
plaincopy

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] view
plaincopy

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] view
plaincopy

ScriptEngineManager factory = new ScriptEngineManager();

ScriptEngineManager scriptEngine = factory.getEngineByName("jruby");//或者"ruby"

scriptEngine.eval(code);

访问数据库

Ruby代码

[ruby] view
plaincopy

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.next) do

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] view
plaincopy

ScriptEngineManager factory = new ScriptEngineManager();

ScriptEngineManager scriptEngine = factory.getEngineByName("groovy");//或者"Groovy"

scriptEngine.eval(code);

使用GroovyShell:

Java代码

[java] view
plaincopy

GroovyShell shell = new GroovyShell();

Script script = shell.parse(code);

Object result = script.run();

访问数据库

Groovy代码

[plain] view
plaincopy

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

转自:/article/4036344.html 上面还有包 很不错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: