SmartJob sẽ không nói về tê giác hay một lớp tăng thiết giáp của Đức có tên là Nashhorn. Chúng tôi nói về một Javascript engine. JavaScript engine nghe có vẻ lạ lẫm, nhưng thực ra đã có trước đó, ví dụ như Rhino (cũng được đặt tên theo một loài tê giác) do Mozilla Foundation xây dựng những năm về trước [1]. JDK 8 phát hành vào đầu quý II/2014, kèm theo một Javascript engine có tên Nashorn.

Javascript engine trong JDK 8 được đặt theo tên một loài tê giác sắp tuyệt chủng – Nashorn.
Javascript engine đặt trong Java Development Kit (Bộ công cụ phát triển Java) để làm gì? Để cho phép lập trình viên Java viết mã nguồn theo phong cách tuần tự của ngôn ngữ lập trình kịch bản (scripting language) giống như Javascript, Python hay PHP. Ngôn ngữ lập trình kịch bản (scripting language) là ngôn ngữ lập trình cho phép ứng dụng thực thi ngay (thông dịch) mà không cần biên dịch. Tất nhiên dù bạn sử dụng Java Nashorn, thì bạn vẫn phải biên dịch. Tuy nhiên cách viết mã nguồn sẽ theo phong cách “tuần tự” (scripting, chạy từ trên xuống dưới, nếu bị lỗi ở dòng code nào thì chương trình dừng lại ở đó).
Kiểm tra rằng biến môi trường JAVA đã khai báo đúng cách, gọi cmd và chạy lệnh:
1
|
javac –version
|
Nếu câu lệnh trên trả về kết quả, bạn có thể chạy ngay Nashorn engine của JDK 8, gõ lệnh
1
|
jjs
|
Sau đó tại dấu nhắc lệnh của jjs gõ lệnh:
1
|
print(‘SmartJob – mang tuyen dung hang dau VN’);
|
Bạn thấy kết quả là một xâu ký tự (String) đã được in ra màn hình console. Lần đầu tiên bạn đã sử dụng lệnh Java để gọi sinh mã JavaScript. Và có thể là lần đầu tiên lập trình kịch bản (scripting programming) trên máy ảo Java (JVM).
TỪ CODE JAVA GỌI HÀM JAVASCRIPT
Để xây dựng các ứng dụng phức tạp hơn, bạn cần mở IDE lên để code, ví dụ Eclipse IDE for Java developer. Tạo class Java có tên Example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package vn.smartJob.nashorn;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Example {
public static void main(String[] args) throws ScriptException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”);
engine.eval(“print(‘SmartJob is smart choice’);”);
}
}
// Kết quả:
// SmartJob is smart choice
|
Tại dòng 11, chúng ta đã gọi đến một đoạn mã tuần tự, đó là lối lập trình kịch bản.
Ứng dụng ngày càng trở lên phức tạp hơn, chúng ta không thể gọi các đoạn mã script trong code Java mãi được, chúng ta sẽ tách riêng các script này ra một file riêng. Tạo tập tin script1.js đặt ngang cấp với thư mục mã nguồn Java (src), có 2 phương thức là
displayInfo và
getTypeOfObject
1
2
3
4
5
6
7
8
|
var displayInfo = function(info) {
print(‘Nội dung này được gọi ra bởi JavaScript, nói rằng: ‘ + info);
return “Tê giác sắp bị tuyệt chủng”;
};
var getTypeOfObject = function(object) {
print(“Kiểu đối tượng là: “ + Object.prototype.toString.call(object));
};
|
Tạo mới class Example2 để tương tác, gọi đến các phương thức đặt trong file script.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package vn.smartJob.nashorn;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.time.LocalDateTime;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Example2 {
public static void main(String[] args) throws ScriptException, FileNotFoundException, NoSuchMethodException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”);
engine.eval(new FileReader(“script1.js”));
Invocable invocable = (Invocable) engine;
Object WildAnimal = invocable.invokeFunction(“displayInfo”, “Tê giác có một hoặc nhiều sừng”);
System.out.println(WildAnimal);
System.out.println(“Kiểu Object của WildAnimal là “ + WildAnimal.getClass());
LocalDateTime now = LocalDateTime.now();
invocable.invokeFunction(“getTypeOfObject”, now);
}
}
// Kết quả:
// Nội dung này được gọi ra bởi JavaScript, nói rằng: Tê giác có thể có một hoặc nhiều sừng
// Tê giác sắp bị tuyệt chủng
// Kiểu Object của WildAnimal là class java.lang.String
// Kiểu đối tượng là: [object java.time.LocalDateTime]
|
Tại dòng 18, chúng ta gọi đến phương thức
displayInfo (hàm Javascript), tại dòng 23 gọi đến phương thức
getTypeOfObject (hàm Javascript).
Tải về mã nguồn: Nashorn (từ server SmartJob) hoặc https://github.com/SmartJobVN/java8 (từ server GitHub)
[1] https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino
Đỗ Như Vý – developer tại SmartJob
java,
Java 7,
Java 8,
Nashorn,
scripting language,