2010-06-19 6 views
5

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

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

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

+0

Включите все ваши javascript-коды в одном файле. Прочитайте файл в 'StringWriter' и используйте его метод toString. Теперь используйте 'valuString' для анализа всего кода JavaScript и возврата объекта Scriptable. После этого вы можете просто использовать метод «get (String namespace, Scriptable jsObject)» для Scriptables для доступа к любому объекту в области видимости. – FK82

+0

Просто замечание: если вы хотите включить шаблон продолжения-передачи (как вы заявили), вам нужно будет иметь все соответствующие функции в пределах области видимости и объявить эту область в 'Function.call (контекст сценария, область Scriptable, Scriptable thisObject, Object [] args) '. Поэтому я действительно не вижу преимущества разделения кода на фрагменты. – FK82

ответ

2

От documentation и examples похоже, что ссылки на ранее оцененные объекты контролируются scopes.

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 implementation может оценивать сценарии, как это:

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

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

Смежные вопросы