1. 程式人生 > >Java呼叫JavaScript指令碼的例子

Java呼叫JavaScript指令碼的例子

Java中提供了一個指令碼引擎管理器:ScriptEngineManager,它會在虛擬機器啟動時發現可用的指令碼引擎。

指令碼引擎管理器

構造一個 ScriptEngineManager,呼叫它的 getEngineFactories 方法,可用獲取到當前Java環境所有支援的引擎工廠,可用通過迴圈去獲取每個引擎工廠的屬性。請參考以下程式碼:

public static void main(String[] args) {
        // 構造一個指令碼引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 遍歷所有的引擎工廠,輸出引擎工廠的資訊
        for (ScriptEngineFactory factory : manager.getEngineFactories()) {
            String engineName = factory.getEngineName();
            String engineVersion = factory.getEngineVersion();
            String languageName = factory.getLanguageName();
            String languageVersion = factory.getLanguageVersion();
            ScriptEngine engine = factory.getScriptEngine();
            System.out.println(String.format("引擎名稱:%s\t引擎版本:%s\t語言名稱:%s\t語言版本:%s\t",
                    engineName, engineVersion, languageName, languageVersion));
        }
    }

以上程式可能會輸出以下結果:

引擎名稱:Oracle Nashorn    引擎版本:1.8.0_152    語言名稱:ECMAScript    語言版本:ECMA - 262 Edition 5.1    

 

Java呼叫JavaScript指令碼

首先通過構造指令碼引擎管理器 ScriptEngineManager,得到所有支援的引擎工廠,並判斷是否支援JS引擎,如果支援,才可以執行JS指令碼。
請參考以下完整程式碼:

package me.zebe.cat;

import javax.script.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

/**
 * 呼叫JavaScript指令碼演示
 * @author Zebe
 */
public class CallJavaScriptDemo {

    /**
     * 執行入口
     * @param args 執行引數
     */
    public static void main(String[] args) {
        // 構造一個指令碼引擎管理器
        ScriptEngineManager manager = new ScriptEngineManager();
        // 遍歷所有的引擎工廠,輸出引擎工廠的資訊
        for (ScriptEngineFactory factory : manager.getEngineFactories()) {
            String engineName = factory.getEngineName();
            String engineVersion = factory.getEngineVersion();
            String languageName = factory.getLanguageName();
            String languageVersion = factory.getLanguageVersion();
            ScriptEngine engine = factory.getScriptEngine();
            System.out.println(String.format("引擎名稱:%s\t引擎版本:%s\t語言名稱:%s\t語言版本:%s\t",
                    engineName, engineVersion, languageName, languageVersion));
            // 如果支援JavaScript
            if ("ECMAScript".equals(languageName)) {
                callSimpleJavaScript(engine);
                callJavaScriptFromFile(engine);
            }
        }
    }

    /**
     * 從簡單字串執行JavaScript指令碼
     * @param engine 指令碼引擎
     */
    private static void callSimpleJavaScript(ScriptEngine engine) {
        try {
            final String script1 = "var k = 0;";
            final String script2 = "k + 5;";
            System.out.println(script1 + " 的執行結果是:" + engine.eval(script1));
            System.out.println(script2 + " 的執行結果是:" + engine.eval(script2));
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    /**
     * 從JavaScript檔案執行JavaScript指令碼
     * @param engine 指令碼引擎
     */
    private static void callJavaScriptFromFile(ScriptEngine engine) {
        try {
            final String fileName = "test.js";
            File file = new File(fileName);
            if (file.exists()) {
                System.out.println("從 " + fileName + " 的執行結果是:" + engine.eval(new FileReader(file)));
            } else {
                System.err.println(fileName + " 不存在,無法執行指令碼");
            }
        } catch (ScriptException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}


小結

指令碼引擎是一個可以執行用某種特定語言編寫的指令碼的類庫。Java不僅可以支援對 JavaScript 的呼叫,還支援對其他型別的指令碼呼叫,包括 GroovyRuby,甚至是更加奇異的諸如 SchemeHaskell 等語言編寫的指令碼。本文僅作簡單演示,內容中沒有演示 Java 對 JavaScript 函式的呼叫,請讀者自行研究學習。

 

本文原文地址:https://blog.csdn.net/zebe1989/article/details/82692160