2012-06-29 3 views
12

Sto provando a chiamare una funzione di script java dal codice java.ReferenceError: "alert" non è definito

Ecco il mio codice Java

public static void main(String[] args) throws FileNotFoundException { 
    try { 
     /** 
     * To call a anonymous function from java script file 
     */ 
     ScriptEngine engine = new ScriptEngineManager() 
       .getEngineByName("javascript"); 
     FileReader fr = new FileReader("src/js/MySpec.js"); 
     engine.eval(fr); 

    } catch (ScriptException scrEx) { 
     scrEx.printStackTrace(); 
    } 
} 

Ecco il mio java file di script:

(function() { 
    alert("Hello World !!!"); 
})(); 

Ma quando ho eseguito il metodo principale della classe di driver che mi sta dando errore come di seguito:

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "alert" is not defined. (<Unknown source>#2) in <Unknown source> at line number 2 
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:110) 
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:232) 
at Java6RhinoRunner.load(Java6RhinoRunner.java:42) 
at Java6RhinoRunner.main(Java6RhinoRunner.java:12) 

Quello che so è che ha bisogno di un motore di script per eseguirlo.

Per questo ho aggiunto il file rhino.jar al mio percorso di classe. Ma questo non funziona.

Non riesco a capire come risolvere questo errore. Please help.Thanks in anticipo.

risposta

27

alert non fa parte di JavaScript, fa parte dell'oggetto window fornito dai browser web. Quindi non esiste nel contesto in cui stai tentando di usarlo. (Questo vale anche per setInterval, setTimeout e altre informazioni relative al timer, FYI.)

Se vuoi solo fare una semplice console in uscita, Rhino fornisce una funzione print per lo script, quindi è possibile sostituire alert con print. Lo script ha anche accesso a tutte le classi Java e simili, quindi ad esempio java.lang.System.out.println('Hello'); funzionerebbe dal tuo script JavaScript (anche se è un po 'ridondante con la funzione print fornita). È inoltre possibile effettuare le variabili Java disponibili allo script facilmente tramite ScriptEngine.put, ad esempio:

engine.put("out", System.out); 

... e poi nello script:

out.println('Hello from JavaScript'); 

... così che è un terzo modo di fare di uscita dalla sceneggiatura. :-)

Vedi la discussione in the javax.script package documentation, in particolare ScriptEngine#put, o per i casi più complessi, Bindings (e SimpleBindings) e ScriptContext.

+1

Molto simile all'utilizzo di qualcosa come NodeJS, è possibile eseguire il codice ma poiché non si esegue in un browser non è possibile avere i vantaggi del browser, ad esempio le finestre di avviso. –