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 函数的调用,请读者自行研究学习。


本文首发于个人独立博客,文章链接:http://www.zebe.me/java-call-java-script

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值