2012-06-29 33 views
12

Tôi đang cố gắng gọi một hàm java script từ mã java.Tham chiếuGỗi: "cảnh báo" không được xác định

Đây là mã Java của tôi

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

Dưới đây là tập tin của tôi java script:

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

Nhưng khi tôi chạy phương pháp chính của lớp điều khiển nó được đem lại cho tôi lỗi như sau:

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) 

Điều tôi biết là nó cần một số công cụ tập lệnh để thực thi nó.

Đối với điều đó tôi đã thêm tệp rhino.jar vào đường dẫn lớp của tôi.Nhưng điều này không hoạt động.

Tôi không nhận được cách giải quyết lỗi này. Xin vui lòng giúp đỡ. Cảm ơn trước.

Trả lời

27

alert không phải là một phần của JavaScript, là một phần của đối tượng window do trình duyệt web cung cấp. Vì vậy, nó không tồn tại trong bối cảnh bạn đang cố gắng sử dụng nó. (Điều này cũng đúng với setInterval, setTimeout và các công cụ liên quan đến bộ đếm thời gian khác, FYI.)

Nếu bạn chỉ muốn làm điều khiển đơn giản đầu ra, Rhino cung cấp chức năng print cho tập lệnh của bạn, vì vậy bạn có thể thay thế alert bằng print. Kịch bản của bạn cũng có quyền truy cập vào tất cả các lớp Java và như vậy, ví dụ: java.lang.System.out.println('Hello'); sẽ hoạt động từ tập lệnh JavaScript của bạn (mặc dù nó hơi dư thừa với chức năng print được cung cấp). Bạn cũng có thể làm cho Java biến sẵn cho kịch bản của bạn một cách dễ dàng thông qua ScriptEngine.put, ví dụ:

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

... và sau đó trong kịch bản của bạn:

out.println('Hello from JavaScript'); 

... vì vậy đó là một cách thứ ba để làm ra từ kịch bản. :-)

Xem các cuộc thảo luận trong the javax.script package documentation, đặc biệt ScriptEngine#put, hoặc đối với trường hợp phức tạp hơn, Bindings (và SimpleBindings) và ScriptContext.

+1

Giống như sử dụng một cái gì đó như NodeJS, bạn có thể thực thi mã nhưng vì bạn không chạy trong trình duyệt, bạn không thể có lợi ích của trình duyệt, chẳng hạn như hộp cảnh báo. –

Các vấn đề liên quan