2012-06-20 33 views
22

Giả sử tôi có một Javascript nộpBind gọi phương thức trong kịch bản JavaScript trong Java Scripting

function js_main(args){ 
    /* some code */ 
    var x = api_method1(some_argument); 
    /* some code */ 
} 

Và tôi cố gắng chạy nó với javax.scripting theo cách thông thường

ScriptEngineManager manager = new ScriptEngineManager(); 
ScriptEngine engine = manager.getEngineByName("javascript"); 
engine.eval(...); 

Bây giờ tôi muốn xử lý cuộc gọi đến api_method1 bằng Javascript với lớp Java của tôi. Tôi muốn có một số loại bản đồ/ràng buộc của các cuộc gọi ví dụ: mỗi lần kịch bản cuộc gọi api_method1(arg) một phương pháp

public Object api_method1(Object arg){ ... } 

(đặt trong lớp giống như động cơ) sẽ được gọi.

Tôi có thể đạt được điều này không?

Trả lời

15
  1. sử dụng engine.createBindings() để tạo đối tượng Bindings;
  2. đưa một vật thể phơi bày phương pháp của bạn vào các ràng buộc với một số tên:

    Bindings b = engine.createBindings(); 
    b.put("api", yourApiObject); 
    engine.setBindings(b, ScriptContext.ENGINE_SCOPE); 
    
  3. Sau đó trong JavaScript sẽ có một "api" đối tượng toàn cầu bạn có thể gọi:

    api.method1("foo", 14, "whatever"); 
    

Cơ sở này dễ sử dụng, nhưng hãy cẩn thận với những gì bạn đi qua lại; nó không làm điều đó nhiều để chuyển đổi các loại JavaScript thành các loại Java.

+0

Còn dữ liệu marshaling đến/từ phương thức (bên cạnh các nguyên thủy) thì sao? – emesx

+1

để chuyển dữ liệu qua lại khác với nguyên thủy bạn có thể sử dụng JSON. Mã Java của bạn có thể tuần tự hóa/deserialize JSON bằng cách sử dụng bất kỳ thư viện JSON nào. – sperumal

+1

Bạn đang khá nhiều trên của riêng bạn cho điều đó. Bạn có thể tuần tự hóa thành JSON (dễ dàng từ JavaScript) và sau đó deserialize trong Java (ít dễ dàng hơn, nhưng có thể thực hiện được). Hoặc bạn có thể trưng ra các tiện ích khác nhau để ghép các loại đối tượng Java khác nhau. – Pointy

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