2010-06-19 27 views
5

Tôi đang nhúng một số javascript vào một ứng dụng Java bằng Rhino. Tôi đang làm theo ví dụ trên trang web Rhino, thực hiện một kịch bản bằng cách gọi phương thức evaluateString của Context và truyền kịch bản thực tế vào như một String.Tê giác, thêm mã từ nhiều tệp javascript

Tôi có toàn bộ chuỗi mã javascript hiện tại mà tôi muốn sử dụng. Tôi không muốn ghép tất cả thành một chuỗi khổng lồ và chuyển nó vào evalString. Tôi thà có thể nạp mã vào để tôi có thể gọi nó từ mã mà tôi chuyển vào trong evalString (giống như phương thức AddCode hoạt động trong điều khiển kịch bản của Microsoft). Tôi muốn thêm mã như tôi hiện có thể thêm các biến bằng cách sử dụng phương thức ScriptableObject.putProperty.

Có cách nào để thực hiện việc này không? Ai đó có thể cung cấp đoạn mã hoặc liên kết đến tài liệu. Cảm ơn!

+0

Đặt tất cả mã javascript của bạn vào một tệp. Đọc tệp này thành một 'StringWriter' và sử dụng phương thức' toString' của nó. Bây giờ sử dụng 'evalString' để phân tích cú pháp toàn bộ mã javascript và trả về một đối tượng' Scriptable'. Sau đó, bạn có thể sử dụng phương thức 'get (String namespace, Scriptable jsObject)' của Scriptables để truy cập bất kỳ đối tượng nào trong phạm vi. – FK82

+0

Chỉ cần một chú thích: nếu bạn muốn kích hoạt một mô hình chuyển tiếp tiếp tục (như bạn đã nói), bạn sẽ cần phải có tất cả các hàm có liên quan trong phạm vi và khai báo phạm vi đó trong 'Function.call (Ngữ cảnh có thể đọc được, Phạm vi Scriptable, Scriptable thisObject, Đối tượng [] args) '. Vì vậy, tôi không thực sự thấy lợi ích của việc chia nhỏ mã của bạn thành các đoạn. – FK82

Trả lời

2

Từ documentationexamples có vẻ như tham chiếu đến các đối tượng được đánh giá trước đây được kiểm soát bởi scopes.

Context context = Context.enter(); 
try { 
    ScriptableObject scope = context.initStandardObjects(); 
    Object out = Context.javaToJS(System.out, scope); 
    ScriptableObject.putProperty(scope, "out", out); 
    context.evaluateString(scope, 
     "function foo() { out.println('Hello, World!'); }", "<1>", 1, null); 
    context 
     .evaluateString(scope, "function bar() { foo(); }", "<2>", 1, null); 
    context.evaluateString(scope, "bar();", "<3>", 1, null); 
} finally { 
    Context.exit(); 
} 

(Rhino 1,7 phát hành 2)


Tôi biết một số người sử dụng Rhino trực tiếp để có được phiên bản mới nhất, nhưng Java 6 implementation có thể đánh giá các kịch bản như thế này:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js"); 
engine.eval("function foo() { println('Hello, World!'); }"); 
engine.eval("function bar() { foo(); }"); 
engine.eval("bar();"); 
0

Trong mã của tôi, tôi đã có nhu cầu (kịch bản tiện ích và như vậy), và tôi chỉ đơn giản là ghép chúng lại với nhau trong một StringBuilder khổng lồ và đánh giá nó (Jav 6). Cách duy nhất của nó kể từ khi javascript không thể làm (không có các đối tượng bao bọc Java) khácJSScript.someUsefulFunction().

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