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

猜你喜欢

转载自blog.csdn.net/Roger_CoderLife/article/details/83857015
今日推荐