Rhino, добавление кода из нескольких файлов javascript

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

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

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


person Philipp    schedule 19.06.2010    source источник
comment
Поместите весь свой код javascript в один файл. Прочитайте файл в StringWriter и используйте его метод toString. Теперь используйте evaluateString, чтобы проанализировать весь код javascript и вернуть объект Scriptable. После этого вы можете просто использовать метод get(String namespace,Scriptable jsObject) Scriptables для доступа к любому объекту в области видимости.   -  person FK82    schedule 25.06.2010
comment
Просто замечание: если вы хотите включить шаблон передачи продолжения (как вы сказали), вам нужно будет иметь все соответствующие функции в пределах области действия и объявить эту область в Function.call(Scriptable context,Scriptable scope,Scriptable thisObject,Object[] args). Поэтому я не вижу особой пользы от разбиения вашего кода на фрагменты.   -  person FK82    schedule 26.06.2010


Ответы (2)


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

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 напрямую, чтобы получить последнюю версию, но Реализация Java 6 может оценивать такие скрипты:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.eval("function foo() { println('Hello, World!'); }");
engine.eval("function bar() { foo(); }");
engine.eval("bar();");
person McDowell    schedule 19.06.2010

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

person TheLQ    schedule 29.07.2010