Rhino, добавление кода из нескольких файлов javascript - PullRequest
5 голосов
/ 19 июня 2010

Я встраиваю некоторый javascript в приложение Java, используя Rhino.Я следую примеру на веб-сайте Rhino, выполняя скрипт, вызывая метод контекстаvaluString и передавая фактический скрипт в виде строки.

У меня есть целый набор существующего кода JavaScript, который я хотел бы сделатьиспользование.Я не хочу объединять все это в огромную строку и передавать ее для оценки строки.Я предпочел бы иметь возможность загружать код так, чтобы я мог вызывать его из кода, который я действительно передаю в valuString (вроде как метод AddCode работает в элементе управления сценариями Microsoft).Я хотел бы добавить код, как я могу в настоящее время добавить переменные с помощью метода ScriptableObject.putProperty.

Есть ли способ сделать это?Может кто-нибудь предоставить фрагмент кода или ссылку на документацию.Спасибо!

Ответы [ 2 ]

2 голосов
/ 19 июня 2010

Из документации и примеров похоже, что ссылки на ранее оцененные объекты контролируются областями .

Context context = Context.enter();
try {
  ScriptableObject scope = context.initStandardObjects();
  Object out = Context.javaToJS(System.out, scope);
  ScriptableObject.putProperty(scope, "out", out);
  context.evaluateString(scope,
      "function foo() { out.println('Hello, World!'); }", "<1>", 1, null);
  context
      .evaluateString(scope, "function bar() { foo(); }", "<2>", 1, null);
  context.evaluateString(scope, "bar();", "<3>", 1, null);
} finally {
  Context.exit();
}

(Rhino 1.7, выпуск 2)


Я знаю, что некоторые люди используют Rhino напрямую для получения последней версии, но реализация 1016 * может оценивать сценарии следующим образом:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.eval("function foo() { println('Hello, World!'); }");
engine.eval("function bar() { foo(); }");
engine.eval("bar();");
0 голосов
/ 29 июля 2010

В моем коде у меня была такая потребность (служебные скрипты и тому подобное), и я просто просто соединил их вместе в гигантском StringBuilder и избежал его (Java 6). Это единственный способ, так как javascript не может обойтись (без объектов-оболочек Java) otherJSScript.someUsefulFunction ().

...