2010-06-19 7 views
5

Osadzam niektóre javascript w aplikacji Java za pomocą Rhino. Podążam za przykładem na stronie Rhino, wykonuję skrypt wywołując metodę evaluateString Context i przekazując aktualny skrypt jako ciąg.Rhino, dodawanie kodu z wielu plików javascript

Mam cały pakiet istniejącego kodu javascript, z którego chciałbym skorzystać. Nie chcę łączyć tego wszystkiego w ogromny łańcuch i przekazywać go do ocenyString. Wolałbym ładować kod w taki sposób, żebym mógł go wywołać z kodu, który przekazuję do evaluationString (coś w rodzaju metody AddCode działa w skrypcie Microsoftu). Chciałbym dodać kod jak mogę obecnie dodawać zmienne za pomocą metody ScriptableObject.putProperty.

Czy istnieje sposób, aby to zrobić? Czy ktoś może podać fragment kodu lub link do dokumentacji? Dzięki!

+0

Umieść cały kod javascript w jednym pliku. Odczytaj plik do 'StringWriter' i użyj jego metody' toString'. Teraz użyj 'evaluateString', aby przeanalizować cały kod javascript i zwróć obiekt' Scriptable'. Następnie możesz po prostu użyć metody get (String names, Scriptable jsObject) Scriptables, aby uzyskać dostęp do dowolnego obiektu w zakresie. – FK82

+0

Tylko uwaga: jeśli chcesz włączyć kontynuację-mijanie-wzorca (tak jak to określiłeś), będziesz musiał mieć wszystkie odpowiednie funkcje w zakresie i zadeklarować ten zakres w 'Function.call (kontekst skryptowalny, zakres skryptów, Scriptable toObject, Object [] args) '. Dlatego nie widzę korzyści z dzielenia kodu na fragmenty. – FK82

Odpowiedz

2

Od documentation i examples wygląda na to, że odniesienia do wcześniej ocenianych obiektów są kontrolowane przez 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 release 2)


Wiem, że niektórzy ludzie używają Rhino bezpośrednio pobrać najnowszą wersję, ale Java 6 implementation mogą oceniać skrypty tak:

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

W moim kodzie miałem taką potrzebę (skrypty narzędziowe itp.) I po prostu połączyłem je razem w gigantyczny StringBuilder i oceniłem (Jav a 6). Jest to jedyny sposób, ponieważ javascript nie może wykonać (bez obiektów wrapperów Java) innych JSScript.someUsefulFunction().