2012-06-29 7 views
12

자바 코드에서 자바 스크립트 함수를 호출하려고합니다. 여기 ReferenceError : "alert"가 정의되지 않았습니다.

내 자바 코드 여기

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(); 
    } 
} 

입니다 내 자바 스크립트 파일 :

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

하지만 드라이버 클래스의 주요 메소드를 실행할 때 나를 아래와 같은 오류주고있다 :

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) 

내가 아는 바로는 그것을 실행하기 위해 스크립트 엔진이 필요하다는 것입니다.

그 때문에 rhino.jar 파일을 내 클래스 경로에 추가했습니다. 그러나 이것은 작동하지 않습니다.

이 오류를 해결하는 방법을 알지 못합니다. 도와주세요. 미리 감사드립니다.

답변

27

alert은 자바 스크립트의 일부가 아니며 웹 브라우저에서 제공하는 window 개체의 일부입니다. 따라서 사용하려는 컨텍스트에는 존재하지 않습니다. (이것은 setInterval, setTimeout 및 기타 타이머 관련 내용, FYI에서도 마찬가지입니다.)

간단한 콘솔 만 수행하려는 경우 Rhino는 스크립트에 print 함수를 제공하므로 alertprint으로 바꿀 수 있습니다. 스크립트는 또한 모든 Java 클래스에 액세스 할 수 있습니다. 예를 들어 java.lang.System.out.println('Hello');은 JavaScript 스크립트에서 작동합니다 (제공된 print 함수를 사용하면 약간 중복 됨). 또한, ScriptEngine.put를 통해 쉽게 스크립트를 사용할 자바 변수를 만들 수 있습니다 예 :

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

... 다음 스크립트 :

out.println('Hello from JavaScript'); 

... 그 출력을 할 수있는 세 번째 방법 그래서 스크립트에서. :-)

Bindings (및 SimpleBindings) 및 ScriptContext을 특정 ScriptEngine#put에, the javax.script package documentation에서 논의를 참조하거나 더 복잡한 경우에.

+1

NodeJS와 비슷한 것을 사용하면 코드를 실행할 수 있지만 브라우저에서 실행되지 않으므로 경고 상자와 같이 브라우저의 이점을 누릴 수 없습니다. –

관련 문제