`
xupo
  • 浏览: 215726 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java调用javascript :js引擎rhino

阅读更多

前段时间,在浏览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已经把它收归帐下,成了正规军。


public class MathEval   
{   
    public static void main(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);   
            double res = 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 代码
function isPrime (num)   
{   
    if (num <= 1) {   
        print("Please enter a positive integer >= 2.")   
        return false  
    }   
       
    var prime = true  
    var sqrRoot = Math.round(Math.sqrt(num))   
       
    for (var n = 2; prime & n <= sqrRoot; ++n) {   
        prime = (num % n != 0)   
    }   
       
    return prime   
}  

如何运行呢:
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 () {return this.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 代码
package co.test;   
  
import org.mozilla.javascript.Function;   
  
public class JSFunction  //extends ScriptableObject   
{   
 private String name;    
    
 private Function handle;   
    
 public void setHandler(Function func)   
 {   
  this.handle = func;   
 }   
    
 public Function getHandler()   
 {   
  return this.handle;   
 }   
  
    
 public JSFunction(String s)   
 {   
  this.name = s;   
 }    
    
 public static void print(String s)   
 {   
  System.out.println(s);   
 }   
  
 public String getName() {   
  return name;   
 }   
 public void setName(String name) {   
  this.name = name;   
 }   
  
}   
  
JSExploration.java:

java 代码
package co.test;   
  
import java.io.FileReader;   
import java.io.LineNumberReader;   
  
import org.mozilla.javascript.Context;   
import org.mozilla.javascript.Function;   
import org.mozilla.javascript.Scriptable;   
  
public class JSExploration   
{   
    private Context cx;   
  
    private Scriptable scope;   
  
    public JSExploration()   
    {   
        this.cx = Context.enter();   
        this.scope = cx.initStandardObjects();   
    }   
  
    public Object runJavaScript(String filename)   
    {   
        String jsContent = this.getJsContent(filename);   
        Object result = cx.evaluateString(scope, jsContent, filename, 1, null);   
        return result;   
    }   
  
    private String getJsContent(String filename)   
    {   
        LineNumberReader reader;   
        try  
        {   
            reader = new LineNumberReader(new FileReader(filename));   
            String s = null;   
            StringBuffer sb = new StringBuffer();   
            while ((s = reader.readLine()) != null)   
            {   
                sb.append(s).append("\n");   
            }   
            return sb.toString();   
        }   
        catch (Exception e)   
        {   
            // TODO Auto-generated catch block   
            e.printStackTrace();   
            return null;   
        }   
    }   
  
  
    public Scriptable getScope()   
    {   
        return scope;   
    }   
  
    public static void main(String[] args)   
    {   
        String filename = System.getProperty("user.dir") + "/jsmap.js";   
        JSExploration jsExploration = new JSExploration();   
        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, new Object[] { "this is my test" });   
    }   
}   
  
js脚本:jsmap.js

js 代码
var swingNames = 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 = new JSFunction("lichunlei");   
 var name = jsFunction.getName();   
 System.out.println("get name from java source: " + name);   
 jsFunction.setHandler(log);    
}    
  
java.lang.System.out.println("not use swingNames");   
function isPrime (num)   
{   
 java.lang.System.out.println("in isPrime(num)");   
    if (num <= 1) {   
        java.lang.System.out.println("Please enter a positive integer >= 2.")   
        return false  
    }   
       
    var prime = true  
    var sqrRoot = Math.round(Math.sqrt(num))   
       
    for (var n = 2; prime & n <= sqrRoot; ++n) {   
        prime = (num % n != 0)   
    }   
       
    return prime   
}   
  
function log(msg)   
{   
 java.lang.System.out.println("in function log: " + msg);   
}   


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhengyuanting/archive/2008/09/24/2973972.aspx

分享到:
评论

相关推荐

    Java调用javaScript代码

    本文将深入探讨“Java调用JavaScript代码”的技术实现,以及它在实际项目中的应用场景。 Java和JavaScript虽然名字相似,但它们是两种完全不同的编程语言,各自有其特定的用途。Java是一种静态类型的、面向对象的...

    深入浅出Rhino:Java与JS互操作

    《深入浅出Rhino:Java与JS互操作》是一本专注于探讨如何在Java环境中使用Rhino JavaScript引擎进行交互的书籍。Rhino是Mozilla基金会开发的一个开源JavaScript解释器,它完全用Java编写,使得JavaScript能够在Java...

    FF的js引擎rhino源码,java编写

    3. **Java与JavaScript交互**:Rhino允许JavaScript直接调用Java对象和方法,反之亦然,这使得开发者可以用JavaScript控制Java应用程序,或者用Java扩展JavaScript的功能。这种互操作性是通过JavaScript的`Packages`...

    Rhino脚本引擎技术介绍

    Rhino脚本引擎是JavaScript的一个开源实现,它能够运行JavaScript风格的脚本代码,并且可以通过这个引擎调用Java语言编写的方法。Rhino脚本引擎可以嵌入Java应用程序中执行,其最大的特点是脚本的修改不需要重启Java...

    效率非常快的java读取javascript,附带源码和js.jar

    2. **JavaScript到Java的互操作性**:Rhino允许JavaScript代码直接调用Java对象和方法,反之亦然,极大地增强了两种语言的交互性。 3. **嵌入到Java应用程序**:Rhino可以轻易地被嵌入到Java应用程序中,作为动态...

    java运行js脚本引擎-----rhino

    Java运行JavaScript脚本引擎——Rhino,是一种在Java平台上执行JavaScript代码的重要工具。Rhino是Mozilla基金会的一个开源项目,它实现了ECMAScript标准,也就是JavaScript的标准化版本。Rhino以其高性能和深度集成...

    使用Rhino让java执行javascript的方法实例

    本篇文章将深入探讨如何在Java项目中使用Rhino来执行JavaScript,并展示从Java调用JavaScript函数以及从JavaScript调用Java方法的实例。 首先,你需要下载Rhino的jar包。你可以在Mozilla的开发者网站上找到它...

    java执行JavaScript代码

    要在Java中运行JavaScript,首先需要引入支持JavaScript的引擎,如Nashorn(在Java 8中默认提供,但在Java 11后被废弃)或Rhino。如果使用Nashorn,通常不需要额外的库,因为它已经包含在Java标准版中。若选择Rhino...

    Java直接运行JS代码

    Nashorn是Java 8中的默认JavaScript引擎,它是基于Rhino引擎的一个轻量级、高性能的实现。不过,由于Nashorn在Java 11中被标记为不推荐使用,并在Java 15中被移除,因此在较新的Java版本中,我们通常会转向GraalVM。...

    Java和JavaScript库进行交互

    7. **Node.js和Java Bridge**:Node.js是基于V8 JavaScript引擎的服务器端运行环境,可以通过一些库(如J2V8或NodeJava)搭建桥梁,使Java和Node.js能够互相调用。 8. **JavaScript Native Interface (JSNI)**:在...

    org.mozilla.javascript-1.7.2.jar.zip

    总结,"org.mozilla.javascript-1.7.2.jar.zip"是Mozilla Rhino引擎的一个重要版本,它在Java平台上实现了高性能的JavaScript解释和执行,为开发者提供了丰富的功能和广泛的适用场景。无论是Web开发、服务器脚本,...

    java如何与脚本(javaScript)之间相互调用二

    在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...

    java 混淆、加密js代码

    Java可以调用本地的JavaScript引擎,如Rhino或Nashorn来执行JavaScript代码。例如,使用Nashorn,你可以在Java中这样执行JavaScript: ```java import javax.script.ScriptEngineManager; import javax.script....

    java 调用执行 JS 的源码

    在Java中调用JavaScript代码是跨语言交互的一个常见需求,特别是在服务器端开发中,我们可能希望利用JavaScript的灵活性和丰富的库资源。Java提供了多种方式来实现这一目标,其中最常用的库是Rhino和Nashorn,以及...

    Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS

    Rhino是Mozilla开发的一个开源JavaScript引擎,它允许JavaScript在Java平台上运行,而Rhino Shell则是一个命令行工具,可以用来交互式地执行JavaScript脚本。Debugger则是用于检查和优化代码的工具,这对于理解和...

    一个java的jar包可以集成到IDE中做JAVASCRIPT的测试。

    2. **编写Java代码调用JavaScript**: 通过引擎提供的API,Java代码能够执行JavaScript脚本,读取和分析测试结果。例如,可以使用`ScriptEngine`接口来执行JavaScript代码并获取返回值。 3. **创建测试框架**: 设计...

    Java 8 Nashorn 脚本引擎

    Nashorn引擎首次引入于Java 8,作为对之前Rhino JavaScript引擎的升级,旨在提供更快的速度和更现代的JS语法支持。 Nashorn引擎的主要特性包括: 1. **高性能**:Nashorn比Rhino更快,因为它基于Java的HotSpot...

    如何在java中使用javascript,官方指南

    3. 使用脚本引擎:在Java中,可以通过脚本引擎API来调用JavaScript。Java提供了ScriptEngine接口,允许Java应用程序执行JavaScript代码,就如同在浏览器中运行的那样。脚本引擎通常由第三方库提供,如Mozilla Rhino...

Global site tag (gtag.js) - Google Analytics