本文将分以下几个小节来学习:

  • Java的JavaScript脚本引擎
  • 脚本开发中涉及到的类和接口简介
  • 开发步骤
  • 脚本与java数据传递
  • 脚本执行上下文
  • 作用域
  • 方法的调用
  • 编译脚本

脚本与java数据传递

脚本语言支持API的一个很大的优势在于它规范了Java语言与脚本语言之间的交互方式,使Java语言编写的程序可以和脚本之间进行双向的方法调用和数据传递。

数据传递是通过Bindings接口来实现的,其实Bindings对象就是一个简单的哈希表,用来存放和获取所需的共享数据。所有数据都对应这个哈希表中的一个条目,是简单的键值对。

ScriptEngine对象中有个默认的Bindings对象,提供了put和get方法对脚本引擎中特定作用域的数据传递。

Demo:

package net.oseye;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;public class ScriptTest {public static void main(String[] args) throws ScriptException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");se.put("name", "kevin");se.eval("var msg='my name is '+name;println(msg);");System.out.println(se.get("msg"));}
}

输出:

my name is kevin
my name is kevin

ScriptEngine对象通过put方法向脚本默认Bindings对象添加键为"name",值为"kevin"的字符串,然后eval中可直接使用name。在java中可通过ScriptEngine对象的get方法获取到脚本的变量msg。这样就完成了Java和脚本预言的双向数据传递。

在大多说情况下使用ScriptEngine的默认Bindings对象就足够的,但如果不够,你可以使用自己的Bindings对象。可以使用ScriptEngine对象的creteBindings方法或new一个javax.script.SimpleBindings对象来创建。Demo:

package net.oseye;
import javax.script.*;
public class ScriptTest {public static void main(String[] args) throws ScriptException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");
//      Bindings bindings=new SimpleBindings();Bindings bindings=se.createBindings();bindings.put("name", "kevin");se.eval("var msg='my name is '+name;println(msg);",bindings);System.out.println(bindings.get("msg"));}
}

脚本执行上下文

脚本引擎通过ScriptContext接口对象获取与脚本执行相关的信息,也允许开发人员通过此对象来配置脚本引擎的行为。

  • 输入与输出
    在默认情况下,脚本的输入和输出都发生在标准的控制台中,但可以用ScriptContext接口对象让脚本在执行中用java.io.Reader对象来输入,用java.io.Writer对象来输出。例如把脚本的输出写入到一根文件中,就可以利用setWriter方法把脚本输出重定向到一个文件中。

    package net.oseye;
    import java.io.*;
    import javax.script.*;public class ScriptTest {public static void main(String[] args) throws ScriptException, IOException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");ScriptContext sc=se.getContext();sc.setWriter(new FileWriter("out.txt"));se.eval("println('test')");}
    }

    通过ScriptContext的setReader和setErrorWriter方法可以分别设置脚本执行时的数据输入来源和产生错误时出错信息的输出目的。

  • 自定义属性
    ScriptContext也有获取和设置属性的方法,这点类似SeverletContext,即setAttribute和getAttribute。

    package net.oseye;
    import java.io.*;
    import javax.script.*;public class ScriptTest {public static void main(String[] args) throws ScriptException, IOException {ScriptEngineManager factory=new ScriptEngineManager();ScriptEngine se=factory.getEngineByName("JavaScript");ScriptContext sc=se.getContext();sc.setAttribute("name", "kevin", ScriptContext.GLOBAL_SCOPE);se.eval("println(name)");}
    }

    输出:

    kevin

转载于:https://www.cnblogs.com/zhaiqianfeng/archive/2013/01/07/4618252.html

JAVA的嵌入式脚本开发(中)相关推荐

  1. JAVA的嵌入式脚本开发(上)

    Java是一种静态类型的编程语言.Java代码中的每个变量的类型都需要显示地进行声明,所以所有的变量.方法的参数以及返回值等在程序运行前,它们的类型都是已经确定的.这种静态类型特性使编译器可以在编译时 ...

  2. 嵌入式C开发中编程模型——重点事件驱动和表驱动

    嵌入式C开发中编程模型 事件驱动 消息驱动 事件驱动vs消息驱动 数据驱动 1. 表驱动法(Table-Driven) 用表驱动法来实现 Unix设计原则中的"分离原则"和&quo ...

  3. Java在游戏服务器开发中的应用

     Java在游戏服务器开发中的应用 width="22" height="16" src="http://hits.sinajs.cn/A1/we ...

  4. java backbone_[Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合

    [Java教程]移动前端开发中的Backbone之一:Backbone中的模型和集合 0 2015-09-24 17:00:04 当我们开发含有大量Javascript的web应用程序时,首先你需要做 ...

  5. 嵌入式开发-浅谈嵌入式MCU开发中的三个常见误区

    浅谈嵌入式MCU开发中的三个常见误区 原创 2017-09-30 胡恩伟 汽车电子expert成长之路 目录 (1)嵌入式MCU与MPU的区分 (2)误区一:MCU的程序都是存储在片上Flash上,然 ...

  6. 嵌入式Qt开发中配置文件的尝试——TOML

    嵌入式Qt开发中配置文件的尝试--TOML 1 起因 2 关于 QSetting 3 重新寻找方案 TOML 3.1 TOML 初体验 4 后话 1 起因 在大多数项目中,系统启动时都需要读取一份配置 ...

  7. 如何解决嵌入式培训开发中的PCB设计问题?

    不管是嵌入式培训开发还是学习嵌入式的过程中肯定都是或多或少都能遇到一些小问题的,但是不管这个问题有多小如果说你不解决好的话那么你就很难能够进行到下一步的.今天粤嵌科技就也来给大家说下如何解决嵌入式培训 ...

  8. java 调用js脚本_Java中使用JavaScript脚本的方法步骤

    简介 Nashorn Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引 ...

  9. java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解

    Java开发 前言 在Java的日常开发中静态方法引用和实例方法引用在很多地方都会用到,可以说是万金油,但是你真的掌握了吗?下面就由小编给大家做一个比较细想的讲解,废话不多说现在开始把. 正文 大家对 ...

最新文章

  1. python语言属于哪一种语言_Python与Java:你应该学习哪种语言,他们有什么区别?...
  2. echart 数据点可以加链接吗_地理可视化就这么简单、酷炫,蚂蚁金服AntV 空间数据可视化引擎 L72.0发布...
  3. 唯品会:在 Flink 容器化与平台化上的建设实践
  4. 20145326蔡馨熠《信息安全系统设计》第2周学习总结
  5. [Hadoop in China 2011] 淘宝OceanBase打造结构化NoSQL数据库
  6. 小白用python处理excel文件-python处理excel文件
  7. FeedDemon获共享软件年度大奖
  8. MATLAB R2016b + VS2017专业版安装spams
  9. 在华为 Kylin V10 SP1操作系统,HUAWEI,Kunpeng 920 CPU(4Cores)单机上模拟部署生产环境TiDB集群...
  10. 关于css 中的dl dt dd
  11. GBT22239-2019信息安全技术网络安全等级保护基本要求第三级安全要求管理部分表格版
  12. 名牌记之wifi共享精灵
  13. 银行信贷管理系统(C#)
  14. 网上投票作弊的技术实现(纯技术交流,勿用作他途!!)
  15. PyQt5随笔:QSettings 的简单使用详说,进行软件的设置状态数据储存与初始化
  16. 《二》微信小程序中的 WXML
  17. javaScript 美元符號$
  18. 想成为电脑高手必须掌握的八个cmd 命令
  19. cdo t63grid插值
  20. 2022年传染病护理学习题

热门文章

  1. oracle获取下级函数,从oracle获取函数和过程签名列表
  2. nohup命令_后台任务与nohup命令
  3. 验证回文串Python解法
  4. id3决策树_信息熵、信息增益和决策树(ID3算法)
  5. android lcd驱动框架,LCD驱动及Framebuffer相关(转载)
  6. php xmlreader 读xml,PHP中使用xmlreader读取xml数据示例
  7. tp5分布式redis_TP5通过缓存数据到Redis
  8. cookie放在请求头_Web安全:你必须知道的“Cookie安全”
  9. 国家电网是“围城”?辞职吗?
  10. 秀操作:函数宏的三种封装方式