Я знаю, что API очень разные, но есть ли какая-либо функциональная разница между встроенным материалом JavaScript и сборками Rhino, доступными из Mozilla?
Какая разница между встроенной версией Rhino и Rhino для Java 6 прямо из Mozilla?
Ответ 1
Я не уверен, что вы имели в виду API. Java 6 имеет механизм сценариев, в котором одним из доступных движков является Rhino, обозначаемый "js". Таким образом, единственная разница между включенным Mozilla Rhino ECMAScript и тем, который вы можете получить с их сайта, будет отличаться от версий. Я считаю, что в комплекте версия Mozilla Rhino ECMAScript составляет 1,6 оборота2.
Это похоже на работу библиотек XML. Существует "движок", который имеет реализацию по умолчанию.
Пример использования клиента
==========
| Client |
==========
|
===============================
| |
========================= =============
| Java Scripting Engine | | Rhino API |
========================= =============
|
==================
| |
============= =============
| Rhino API | | Other API |
============= =============
Обновление
Просто, чтобы ответить на ваш вопрос немного больше, да, Java 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();
}
}