2012-06-20 11 views
22

Supponiamo che io abbia un file JavaScriptBind chiamata nello script JavaScript Scripting Java

function js_main(args){ 
    /* some code */ 
    var x = api_method1(some_argument); 
    /* some code */ 
} 

E io provo a farlo funzionare con javax.scripting solito modo

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
engine.eval(...); 

Ora il mi piacerebbe gestire la chiamata a api_method1 in Javascript con la mia classe Java. Mi piacerebbe avere una sorta di mappatura/legame di chiamate vale a dire ogni volta che lo script chiama api_method1(arg) un metodo

public Object api_method1(Object arg){ ... } 

(collocato nella stessa classe come il motore) sarebbe chiamato.

Posso ottenere questo?

risposta

15
  1. utilizzare engine.createBindings() per creare un oggetto Associazioni;
  2. mettere un oggetto di esporre il metodo nelle rilegature con qualche nome:

    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  3. Poi in JavaScript che ci sarà un oggetto globale "api" si può chiamare:

    api.method1("foo", 14, "whatever"); 
    

La struttura è facile da usare, ma fai attenzione a ciò che passi avanti e indietro; non fa così tanto per convertire i tipi JavaScript in tipi Java.

+0

E i dati di marshalling a/dal metodo (oltre ai primitivi)? – emesx

+1

per passare i dati avanti e indietro per altro oltre che primitivo è possibile utilizzare JSON. Il codice Java può serializzare/deserializzare JSON utilizzando qualsiasi libreria JSON. – sperumal

+1

Sei praticamente da solo per quello. È possibile serializzare su JSON (facile da JavaScript) e quindi deserializzare in Java (meno facile, ma fattibile). Oppure puoi esporre varie utilità per mettere insieme altri tipi di oggetti Java. – Pointy