java rhino 运行 js_使用Rhino在Java中调用Javascript脚本
转自:http://www.iteye.com/topic/87423
前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式。
结果方案五花八门:
1.jakarta commons JEXL.
2.Beanshell
3.Java Math Expression Parser jep
4.parse combinator jparsec
5.jdk 6.0的 script
6.利用SQL
7.自己写语法分析
如果自己写语法分析,没有个2000行估计搞不定。有人用sql来运行数学表达式,比较另类。
不过由于前段时间较深入的学习了一些java的javascript引擎,我给出的方案就是用javascript来计算了。
java中比较著名的js引擎当属mozilla开源的rhino,不过jdk6已经把它收归帐下,成了正规军。
publicclassMathEval
{
publicstaticvoidmain(String[] args)
{
Context cx = Context.enter();
try
{
Scriptable scope = cx.initStandardObjects();
String str ="9*(1+2)";
Object result = cx.evaluateString(scope, str,null,1,null);
doubleres = Context.toNumber(result);
System.out.println(res);
}
finally
{
Context.exit();
}
}
}
下面总结一下前段时间学习rhino的心得(给自己的程序添加脚本功能,其实是很酷的):
一:环境配置及运行js脚本:
在 http://www.mozilla.org/rhino/ 下载rhino:
把js.jar加入系统CLASSPATH中
可以以交互模式调用js解释器:
java org.mozilla.javascript.tools.shell.Main
然后您应该会看到解释器的版本号,后面跟着提示符 js>
用法如下:
比如:有一个js文件:
D:\eclipse-workshop\rhinoExample\src\isPrime.js
内容如下:
js 代码
functionisPrime (num)
{
if(num <= 1) {
print("Please enter a positive integer >= 2.")
returnfalse
}
varprime =true
varsqrRoot = Math.round(Math.sqrt(num))
for(varn = 2; prime & n <= sqrRoot; ++n) {
prime = (num % n != 0)
}
returnprime
}
如何运行呢:
1:在命令行下键入:
java org.mozilla.javascript.tools.shell.Main
2:在js〉下键入:
load("D:/eclipse-workshop/rhinoExample/src/isPrime.js");
注意:是“/”而不是“\”
3:键入:
isPrime(77);
可看见返回结果为false。
键入:
isPrime(71);返回true
再给个例子,脚本如下:
person = {
name:"Mike Squillace",
age:37,
position:"software engineer",
getFirstName:function() {returnthis.name.split(" ")[0]}
}
person.getFirstName()
js产生swing的例子:
load("D:/eclipse-workshop/rhinoExample/src/SwingApplication.js");
怎么样?看见效果没?是不是很强悍?其中SwingApplication.js是rhnio自带的例子。
Rhino还有一个js脚本的调试器:
Rhino JavaScript Debugger:
java org.mozilla.javascript.tools.debugger.Main [options] [filename.js] [script-arguments]
只须运行java org.mozilla.javascript.tools.debugger.Main,就可以看到调试器的界面了。
为了加快js文件运行的速度,可以把它编译为class文件:
compile:
java org.mozilla.javascript.tools.jsc.Main D:/eclipse-workshop/rhinoExample/src/FirstCompile.js
编译产生FirstCompile.class文件
在D:/eclipse-workshop/rhinoExample/src/下运行该class文件:
java FirstCompile
二:在实际应用中不可避免的需要遇到java代码如何和javascript脚本相互访问的问题:
这是一个最简单的例子:(liveConnect.js是rhnio自带的例子):
load("D:/eclipse-workshop/rhinoExample/src/liveConnect.js");
在给个复杂点的例子, 没有什么逻辑,纯技术展示,呵呵:
JSFunction.java:
java 代码
packageco.test;
importorg.mozilla.javascript.Function;
publicclassJSFunction//extends ScriptableObject
{
privateString name;
privateFunction handle;
publicvoidsetHandler(Function func)
{
this.handle = func;
}
publicFunction getHandler()
{
returnthis.handle;
}
publicJSFunction(String s)
{
this.name = s;
}
publicstaticvoidprint(String s)
{
System.out.println(s);
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name = name;
}
}
JSExploration.java:
java 代码
packageco.test;
importjava.io.FileReader;
importjava.io.LineNumberReader;
importorg.mozilla.javascript.Context;
importorg.mozilla.javascript.Function;
importorg.mozilla.javascript.Scriptable;
publicclassJSExploration
{
privateContext cx;
privateScriptable scope;
publicJSExploration()
{
this.cx = Context.enter();
this.scope = cx.initStandardObjects();
}
publicObject runJavaScript(String filename)
{
String jsContent =this.getJsContent(filename);
Object result = cx.evaluateString(scope, jsContent, filename,1,null);
returnresult;
}
privateString getJsContent(String filename)
{
LineNumberReader reader;
try
{
reader =newLineNumberReader(newFileReader(filename));
String s =null;
StringBuffer sb =newStringBuffer();
while((s = reader.readLine()) !=null)
{
sb.append(s).append("\n");
}
returnsb.toString();
}
catch(Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
returnnull;
}
}
publicScriptable getScope()
{
returnscope;
}
publicstaticvoidmain(String[] args)
{
String filename = System.getProperty("user.dir") +"/jsmap.js";
JSExploration jsExploration =newJSExploration();
Object result = jsExploration.runJavaScript(filename);
Scriptable scope = jsExploration.getScope();
Scriptable obj = (Scriptable) scope.get("obj", scope);
System.out.println("obj.a == "+ obj.get("a", obj));
Scriptable b = (Scriptable) obj.get("b", obj);
System.out.println("b[0] == "+ b.get(0, b));
Boolean flag = (Boolean) scope.get("flag", scope);
System.out.println(flag);
Scriptable myobj = (Scriptable) scope.get("obj", scope);
Boolean myflag = (Boolean) scope.get("flag", scope);
System.out.println(myflag);
Scriptable jsFunction = (Scriptable) scope.get("jsFunction", scope);
Function fc = (Function) jsFunction.get("handler", jsFunction);
Object isPrime = fc.call(Context.getCurrentContext(), jsFunction, fc,newObject[] {"this is my test"});
}
}
js脚本:jsmap.js
js 代码
varswingNames = JavaImporter();
swingNames.importPackage(Packages.java.lang);
swingNames.importPackage(Packages.co.test);
obj = {a:1, b:['x','y']}
next = isPrime
flag = isPrime(5)
with(swingNames) {
System.out.println("in javascript");
JSFunction.print("in JSFunction");
jsFunction =newJSFunction("lichunlei");
varname = jsFunction.getName();
System.out.println("get name from java source: "+ name);
jsFunction.setHandler(log);
}
java.lang.System.out.println("not use swingNames");
functionisPrime (num)
{
java.lang.System.out.println("in isPrime(num)");
if(num <= 1) {
java.lang.System.out.println("Please enter a positive integer >= 2.")
returnfalse
}
varprime =true
varsqrRoot = Math.round(Math.sqrt(num))
for(varn = 2; prime & n <= sqrRoot; ++n) {
prime = (num % n != 0)
}
returnprime
}
functionlog(msg)
{
java.lang.System.out.println("in function log: "+ msg);
}
js 代码
java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
java rhino 运行 js_使用Rhino在Java中调用Javascript脚本相关推荐
- java 调用js脚本_Java中使用JavaScript脚本的方法步骤
简介 Nashorn Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引 ...
- Mac笔记本中是用Idea开发工具在Java项目中调用python脚本遇到的环境变量问题解决...
问题描述: mac笔记本本身会自带几个python版本,比如python2.7版本,我没有改动mac默认的python版本,只是安装了python3.7版本. 使用Pycharm开发Python项目没 ...
- java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本
举例有一个Python脚本叫test.py,现在想要在Java里调用这个脚本.假定这个test.py里面使用了拓展的包,使得pythoninterpreter之类内嵌的编译器无法使用,那么只能采用ja ...
- 在Spark Scala/Java应用中调用Python脚本,会么?
摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...
- 教你如何在Spark Scala/Java应用中调用Python脚本
摘要:本文将介绍如何在 Spark scala 程序中调用 Python 脚本,Spark java程序调用的过程也大体相同. 本文分享自华为云社区<[Spark]如何在Spark Scala/ ...
- 【Groovy】Groovy 脚本调用 ( Java 类中调用 Groovy 脚本 )
文章目录 前言 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 a ...
- java多线程运行结果写入文件错误java.io.IOException: Stream closed
今天在写多线程程序的时候,需要将每个线程运行的结果写入同一个文件,用的是FileWriter,最后在关闭写入流的时候出现如下问题: java.io.IOException: Stream closed ...
- java程序运行5步骤_浅析Java程序的执行过程
一 .jdk内容概述 当安装好jdk后(本示例jdk版本为11.0.1,不同版本,目录有细微差别,但bin目录包含的exe是一样的),打开bin目录,有两个重要的exe文件:javac.exe(编译器 ...
- java 执行javascript_说说如何在 Java 中执行 JavaScript 脚本
Java 是强类型的静态语言,即所有的代码在运行之前都必须先进行严格的类型检查并编译为 JVM 字节码.这样做虽然保证了安全与性能,但却牺牲了灵活性.而那些动态语言(JavaScript .Pytho ...
最新文章
- 单链表建立(头插法,头插法,用数组),求长,插入,删除,输出,释放(递归释放和循环释放),归并(递增和递减)
- 【 随笔 】 财源滚滚
- Team Leader你会带团队吗?你懂合作吗?你好像都不会啊!(上)
- numpy 矩阵乘法_一起学习Python常用模块——numpy
- CSLA .Net学习资料
- Easy Problem 2 奇妙的数字
- CNN-4: GoogLeNet 卷积神经网络模型
- php变量前下滑_PHP变量
- Linux虚拟机的替代品:Docker与WSL2上手笔记
- 16.了解如何把vector和string数据传给旧的API
- android的JNI标准 android的NDK
- eclipse adt 安卓开发配置
- 人口增长模型——基于matlab语言
- 有限差分法及matlab实现,有限差分法与matlab实现
- 买服务器做网站 镜像选什么,云服务器做网站镜像类型选啥
- 接口测试常用文档模板介绍
- PostgreSQL中创建空间拓展(创建空间数据库)并连接到空间数据库,导入数据表操作
- HEX文件和BIN文件的区别及HEX的代码转换
- 关于readyState
- Usage of API documented as @since 1.8+ less... (Ctrl+F1) Inspection info: This inspection finds all