В чем разница между встроенной версией Java 6 Rhino и пакетом Rhino непосредственно от Mozilla? - PullRequest
12 голосов
/ 09 января 2011

Я знаю, что API очень разные, но есть ли функциональная разница между встроенным JavaScript-компонентом и сборками Rhino, получаемыми из Mozilla?

1 Ответ

17 голосов
/ 09 января 2011

Я не уверен, что вы имели ввиду под 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 Scripting Engine позаботится о контекстах и ​​других операциях настройки , которые вы должны выполнить вручную, если используете Rhino напрямую. Вот пример использования двух. Имейте в виду, что когда вы используете Java6 Scripting Engine, подобные вещи происходят внутри. Используемый здесь 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...