2012-06-29 32 views
12

Estoy tratando de llamar a una función de script java desde el código java.ReferenceError: "alerta" no está definido

Aquí está mi código 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(); 
    } 
} 

Aquí está mi java script:

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

Pero cuando corro principal método de clase del controlador que está dando me error de la siguiente manera:

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) 

Lo que sé es que necesita algún motor de script para ejecutarlo.

Para eso agregué el archivo rhino.jar en mi ruta de clase. Pero esto no está funcionando.

No sé cómo resolver este error. Por favor ayuda.Gracias de antemano.

Respuesta

27

alert no es parte de JavaScript, es parte del objeto window que proporciona el navegador web. Por lo que no existe en el contexto que estamos tratando de usarlo en. (Esto también es cierto de setInterval, setTimeout, y otras cosas relacionadas con temporizador, para tu información.)

Si lo que desea es hacer simple consola salida, Rhino proporciona una función print a su secuencia de comandos, por lo que puede reemplazar alert con print. Su secuencia de comandos también tiene acceso a todas las clases de Java y tal, por ejemplo, java.lang.System.out.println('Hello'); funcionaría desde su script de JavaScript (aunque es un poco redundante con la función print proporcionada). También puede hacer que las variables de Java disponibles para su script fácilmente a través de ScriptEngine.put, por ejemplo:

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

... y luego en el script:

out.println('Hello from JavaScript'); 

... así que eso es una tercera forma de hacerlo de salida del guion :-)

Véase la discusión en the javax.script package documentation, en particular ScriptEngine#put, o para casos más complejos, Bindings (y SimpleBindings) y ScriptContext.

+1

Al igual que con algo como NodeJS, puede ejecutar código, pero como no se está ejecutando en un navegador no puede tener los beneficios del navegador, como cuadros de alerta. –