【问题标题】:What's the difference between Java 6's built-in version of Rhino and the Rhino package direct from Mozilla?Java 6 的 Rhino 内置版本和 Mozilla 直接提供的 Rhino 包有什么区别?
【发布时间】:2011-06-06 02:37:37
【问题描述】:

我知道 API 非常不同,但是内置的 JavaScript 内容和可从 Mozilla 获得的 Rhino 构建之间是否有任何功能差异?

【问题讨论】:

    标签: java javascript rhino


    【解决方案1】:

    我不确定您所说的 API 是什么意思不同。 Java 6 有一个脚本引擎,其中可用的引擎之一是 Rhino,用“js”表示。因此,捆绑的 Mozilla Rhino ECMAScript 与您可以从他们的网站获得的唯一区别在于版本之间的差异。我相信 Mozilla Rhino ECMAScript 的捆绑版本是 1.6 rev2。

    这类似于 XML 库的工作方式。有一个具有默认实现的“引擎”。

    客户端使用示例

                           ==========
                           | Client |
                           ==========   
                               |
                 ===============================
                 |                             |
     =========================           =============
     | Java Scripting Engine |           | Rhino API |
     =========================           =============
                 |
          ==================
          |                |
     =============   =============    
     | Rhino API |   | Other API |
     =============   =============
    

    更新

    再回答一下您的问题,是的,Java 6 脚本引擎会处理上下文和其他设置操作,如果直接使用 Rhino,您必须手动执行这些操作。这是使用两者的示例。请记住,当您使用 Java6 脚本引擎时,类似的事情正在底层发生。此处使用的 ScriptingEngine 不必得到 Rhino 的支持。它可以有一个自定义的脚本实现。

    public class Main {
    
        static class Shell extends ScriptableObject {
    
            @Override
            public String getClassName() {
                return "global";
            }
    
            public static void print(Context cx, Scriptable thisObj, Object[] args, Function funObj) {
                for (int i = 0; i < args.length; i++) {
                    String s = Context.toString(args[i]);
                    System.out.print(s);
                }
            }
        }
    
        public static void useJava6ScriptingEngine() throws Exception {
            ScriptEngineManager mgr = new ScriptEngineManager();
            ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
            jsEngine.eval("print('Hello, world!')");
        }
    
        public static void useRhinoDirectly() throws Exception {
            Context context = Context.enter();
            try {
                Shell shell = new Shell();
                String[] names = {"print"};
                shell.defineFunctionProperties(names, Shell.class, ScriptableObject.DONTENUM);
                Scriptable scope = context.initStandardObjects(shell);
                context.evaluateString(scope, "print('Hello, world!')", null, 0, null);
            } finally {
                Context.exit();
            }
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws Exception {
            useJava6ScriptingEngine();
            useRhinoDirectly();
        }
    }
    

    【讨论】:

    • 我所指的 API 的不同之处在于 Mozilla 的 Rhino 包使用了大量对上下文和作用域的显式处理,但是从我看到的所有示例中Java 6 中的内置实现看起来好像这些细节可能被扫到了后台,这样您就不必担心它们?
    • @Jeremy 据我所知,我不会认为他们被扫地出门。您将需要了解 Java 6 中的 ScriptEngine 是如何工作的。就像我说的那样,Java 6 引入了脚本引擎框架。 Mozilla Rhino ECMAScript 具有该脚本引擎的实现。这意味着 Mozilla Rhino ECMAScript 在 Java 6 脚本框架的上下文中运行。你有两个选择,直接使用 Rhino API,或者学习新的 Java 6 Scripting engine API。
    猜你喜欢
    • 2012-11-18
    • 2010-10-02
    • 2012-02-12
    • 2010-12-01
    • 1970-01-01
    • 2012-04-02
    • 2016-07-26
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多