2010-04-25 6 views
5

मैं जावा के माध्यम से जावास्क्रिप्ट में एक फ़ंक्शन कॉल करने का प्रयास कर रहा हूं। स्ट्रिंग के रूप में सीधे एक स्क्रिप्ट पढ़ने पर यह ठीक काम करता है लेकिन मैं संकलित नियंत्रण का उपयोग कर रहा हूं।javax स्क्रिप्ट जावा से जावास्क्रिप्ट में फ़ंक्शन को कॉल करने के लिए कैसे करें

जब मैं इसे संकलित स्क्रिप्ट के साथ करता हूं तो यह मुझे विधि नहीं मिला है अगर मैं बाइंडिंग भी जोड़ता हूं। बाइंडिंग के बिना यह काम करता है लेकिन निश्चित रूप से फ़ंक्शन विफल रहता है क्योंकि इसे बाइंडिंग की आवश्यकता होती है।

कोई भी विचार?

CompiledScript script = ... get script.... 

Bindings bindings = script.getEngine().createBindings(); 

Logger scriptLogger = LogManager.getLogger("TEST_SCRIPT"); 

bindings.put("log", scriptLogger); 

//script.eval(bindings); -- this way fails 
script.eval(); // -- this way works 
Invocable invocable = (Invocable) script.getEngine(); 
invocable.invokeFunction(methodName); 

TIA

उत्तर

10

यहाँ समाधान है कि अगर किसी और किसी भी एक इस में मुलाकात।

import java.util.*; 
import javax.script.*; 

public class TestBindings { 
    public static void main(String args[]) throws Exception { 
     String script = "function doSomething() {var d = date}"; 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 
     Compilable compilingEngine = (Compilable) engine; 
     CompiledScript cscript = compilingEngine.compile(script); 

     //Bindings bindings = cscript.getEngine().createBindings(); 
     Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); 
     for(Map.Entry me : bindings.entrySet()) { 
      System.out.printf("%s: %s\n",me.getKey(),String.valueOf(me.getValue())); 
     } 
     bindings.put("date", new Date()); 
     //cscript.eval(); 
     cscript.eval(bindings); 

     Invocable invocable = (Invocable) cscript.getEngine(); 
     invocable.invokeFunction("doSomething"); 
    } 
}