2010-06-19 8 views
5

Estoy incrustando algunos javascript en una aplicación Java usando Rhino. Estoy siguiendo el ejemplo en el sitio web de Rhino, ejecutando una secuencia de comandos llamando al método evaluateString del contexto y pasando la secuencia de comandos real como una cadena.Rhino, agregando código desde varios archivos javascript

Tengo un montón de código javascript existente que me gustaría utilizar. No quiero concatenarlo todo en una cadena enorme y pasarlo a evaluarString. Prefiero ser capaz de cargar el código para poder llamarlo desde el código que transfiero a evaluateString (algo así como que el método AddCode funciona en el control de scripting de Microsoft). Me gustaría agregar un código como actualmente puedo agregar variables usando el método ScriptableObject.putProperty.

¿Hay alguna manera de hacerlo? ¿Alguien puede proporcionar un fragmento de código o un enlace a la documentación? ¡Gracias!

+0

Ponga todo su código javascript en un solo archivo. Lea el archivo en un 'StringWriter' y use su método' toString'. Ahora usa 'evaluateString' para analizar todo el código javascript y devolver un objeto' Scriptable'. Después de eso, simplemente puede usar el método 'get (String namespace, Scriptable jsObject)' de Scriptables para acceder a cualquier objeto en el alcance. – FK82

+0

Solo una observación: si desea habilitar un patrón de paso de continuación (como ha indicado) necesitará tener todas las funciones relevantes dentro del alcance y declarar dicho alcance en 'Function.call (contexto de script, ámbito de script, script de este objeto, Object [] args) '. Por lo tanto, realmente no veo el beneficio de dividir tu código en fragmentos. – FK82

Respuesta

2

De documentation y examples parece que las referencias a los objetos previamente evaluados están controladas por 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 versión 2)


Sé que algunas personas usan Rhino directamente para obtener la última versión, pero el Java 6 implementation puedo evaluar las secuencias de comandos de esta manera:

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

En mi código tenía esa necesidad (scripts de utilidad y demás), y simplemente los concatenaba en un StringBuilder gigante y lo evadía (Jav a 6). Es la única forma que javascript no puede hacer (sin objetos envoltorios de Java) otherJSScript.someUsefulFunction().

Cuestiones relacionadas