一: 简介<o:p></o:p>
JDK1.6加入了对Script(JSR223)的支持,使Host Application有能力执行Script。这将带来如下便利:
(1) 对程序的定制更加容易灵活:您可以将很容易变化的算法如企业促销返利算法等写到script中
(2) 可以使用您喜爱的script语言完成任务(如Prototype,生成web页面等),同时可以利用强大的Java平台资源
(3) 您的JavaScript可以进行JUnit测试了
二: Script Engine发现机制
Main.java
- package com.rainsoft.execise.script;
-
- import javax.script.*;
- import java.util.List;
-
-
-
-
-
-
- public class Main {
- public static void main(String[] args) {
- ScriptEngineManager mgr = new ScriptEngineManager();
- List
<scriptenginefactory></scriptenginefactory>
factorys = mgr.getEngineFactories();
- for (ScriptEngineFactory factory : factorys) {
- String name = factory.getEngineName();
- String version = factory.getEngineVersion();
- String langName = factory.getLanguageName();
- String langVer = factory.getLanguageVersion();
-
- System.out.printf("Engine:%s(%s), Language:%s(%s)\n",
- name, version, langName, langVer);
- }
- }
- }
运行结果:
- Engine:Mozilla Rhino(1.6 release 2), Language:ECMAScript(1.6)
ScriptEngineManager使用service provider mechanism来实现ScriptEngine的发现.
Sun JDK1.6自带Rhino Javascript Engine,其service描述文件在resources.jar的/META-INF/services/ javax.script.ScriptEngineFactory中,内容为:
resources.jar的/META-INF/services/ javax.script.ScriptEngineFactory文件内容:
- #script engines supported
- com.sun.script.javascript.RhinoScriptEngineFactory #javascript
三: 使用ScriptEngine使程式定制更容易
您已经可以用properties档或xml档configure您的程式,但对于经常变化的算法而言却是不易,有了Script Support,这就容易多了。
比如您为客户开发计算个税的程式,在国家计税方法变化时,您固然可以modify java src, compile, test, deploy完成,但如果仅仅改一下configure档就能搞定也许让人更愉快 :-)
让我们用代码说明:
TaxCalculator.java
- package com.rainsoft.execise.script;
-
- import javax.script.*;
- import java.io.FileReader;
- import java.io.FileNotFoundException;
- import org.apache.log4j.Logger;
-
- public class TaxCalculator {
- Logger logger = Logger.getLogger(TaxCalculator.class);
-
-
- private static final String TAX_CALCULATOR_JS = "TaxCalculator.js";
- private static final String SCRIPT_NAME = "ECMAScript";
- private static final String FUNC_CAL_PERSONAL_TAX = "calPersonalTax";
-
-
- private ScriptEngine engine = null;
- private Invocable invocableEngine = null;
-
-
-
-
- public TaxCalculator() throws FileNotFoundException, ScriptException {
- ScriptEngineManager engineMgr = new ScriptEngineManager();
- engine = engineMgr.getEngineByName(SCRIPT_NAME);
- if (engine == null) {
- throw new ScriptException("Can not initialize ECMAScript engine!");
- }
-
- Object ret = engine.eval(new FileReader(TAX_CALCULATOR_JS));
- if (ret != null && logger.isDebugEnabled()) {
- logger.debug("Following is returned by eval " + TAX_CALCULATOR_JS);
- logger.debug(ret.toString());
- }
-
- if (!(engine instanceof Invocable)) {
- throw new ScriptException("Engine does not support Invocable interface!");
- }
- invocableEngine = (Invocable)engine;
- }
-
-
-
-
- public double calPersonalIncomeTax(Employee emp)
- throws NoSuchMethodException, ScriptException {
- Object ret = invocableEngine.invokeFunction(FUNC_CAL_PERSONAL_TAX, emp);
-
- assert(ret instanceof Double);
- return (Double)ret;
- }
- }
(1) Constructor完成初始化JS引擎的工作
(2) calPersonalIncomeTax完成计算个税工作,方法体仅仅调用js脚本中的相关(同名)function
(3) 代码品质可以进一步提高:实现为Singleton; 将部分const放到properties档中。至于并发,让engine自己管理好了[1]
(4) 程式通过传参让js知晓emp的存在,对于更适合让js当作内建对象的Object来说,可以用如下代码做到
- engine.getContext().setAttribute("BuildinObject", anInstance, ScriptContext.ENGINE_SCOPE);
TaxCalculator.js
-
- function calPersonalTax(emp) {
- taxSalary = emp.salary - emp.the4Money - 1600;
-
- taxRate = 0;
- if (taxSalary > 0 && taxSalary <= 500) {
- taxRate = 0.05;
- }
- else if (taxSalary > 500 && taxSalary <= 2000) {
- taxRate = 0.1;
- }
- else {
- taxRate = 0.15; // just demo
- }
-
- return taxSalary * taxRate;
- }
简单测试一下:
- public static void main(String[] args) throws Exception {
- Employee emp = new Employee(1, 8000, 900);
- double tax = new TaxCalculator().calPersonalIncomeTax(emp);
- System.out.printf("Tax:%.0f", tax);
- }
结果:
Oh,yeah!
四:附录
[1] JSR223 P135: Scripts are executed synchronously. There is no mechanism defined in this specification to execute them asynchronously or to interrupt script execution from another thread. These must be implemented at application level.
五:修订历史
2006-12-12 增加"一:简介"第三条,谢谢网友"抛出异常的爱"的贡献
- src.rar (2 KB)
- 描述: 本文的源程序,JDK6下通过.
- 下载次数: 229
分享到:
- 2006-12-08 17:05
- 浏览 7716
- 评论(9)
- 论坛回复 / 浏览 (9 / 13297)
- 查看更多
相关推荐
tomcat7-jdk1.6+redis session共享所有依赖包: tomcat-redis-session-manager.jar jedis.jar commons-pool.jar 以及Tomcat对应的配置示例,亲测可用
自己写的一个文件名批量转换工具,使用率应该不高,但是有时候可能还是会用到,JDK1.6+ 可以转换文件夹里所有后缀名相同的文件转换成另一后缀 自己用的
安装 MyEclipse+JDK1.6+Tomcat6.0+MySQL5.1 及部署应用 本资源提供了详细的安装和配置指南,涵盖了 JDK1.6、Tomcat6.0、MySQL5.1 和 MyEclipse 的安装、配置和部署。该手册适合初学者和经验丰富的开发者,帮助他们...
标题“jdk1.6+tomcat7.0.90”指的是这个压缩包包含了Java Development Kit(JDK)的1.6版本和Apache Tomcat服务器的7.0.90版本,这两个组件都是IT领域中非常重要的软件工具,主要用于开发和部署Java应用程序。...
在本压缩包中,提供了三个不同版本的JDK:1.6u45、1.7u80和1.8u321,它们都是针对64位Linux系统的。 1. JDK 1.6(也称为Java 6)是Oracle公司在2006年发布的,它的最后一个更新版本是6u45。这个版本引入了一些重要...
JDK1.6 + Tomcat6.0 + MyEclipse7.5 + Oracle XE(10g)
《深入解析JDK 1.6与1.8》 JDK(Java Development Kit)是Java编程语言的核心组件,包含了开发和运行Java应用程序所需的全部工具。JDK 1.6和1.8是两个重要的版本,它们在Java发展历程中扮演着关键角色。本篇文章将...
### Linux + Tomcat 6 + JDK 1.6 + Oracle 9i 安装宝典 #### 一、概述 本文档将详细介绍如何在 Red Hat Linux 9.0 操作系统上安装配置 Tomcat 6、JDK 1.6 和 Oracle 9i 数据库。这些步骤将帮助读者顺利搭建起一个...
本教程将详细介绍如何在MacOS系统上安装和配置JDK 1.6、Eclipse IDE 4.4.2(Luna)以及应用服务器JBoss 4.2.2,并结合SVN进行版本控制。以下是一步步的详细步骤: 1. **JDK 1.6 安装**: - 首先,访问Oracle官方...
mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...
标题中的"jdk1.6+mysql5.0+tomcat6.0+bat免安装说明"揭示了这个压缩包文件包含的是三个核心组件——Java Development Kit(JDK)1.6版本,MySQL数据库5.0版本,以及Apache Tomcat应用服务器6.0版本的免安装版本,...
《Jdk+api+1.6+英文原版 CHM格式》是针对Java开发者的一份重要参考资料,它包含了Java Development Kit (JDK) 1.6版本的API文档,以CHM(Compiled Help Manual)格式呈现。CHM是一种微软开发的帮助文件格式,允许...
**Java Development Kit (JDK) 1.6与1.8详解** JDK,全称为Java Development Kit,是Oracle公司提供的用于开发Java应用程序的核心工具集。JDK包含了Java编译器(javac)、Java虚拟机(JVM)以及一系列的Java开发和...
适合okhttp,okio JDK1.6:okhttp3.8.0-jdk1.6.jar JDK1.6+:okhttp-3.12.13.jar;okio-1.15.0.jar 适用于Java开发环境、使用OkHttp调用
**JDK 1.6 API 中文版:开发者的重要参考资料** JDK(Java Development Kit)是Oracle公司提供的Java编程语言的开发和运行环境,而JDK 1.6是其在2009年发布的一个重要版本。这个版本引入了许多新特性和改进,对Java...
1. **安装JDK 1.6** 使用`sudo apt-get install sun-java6-jdk`命令进行安装。这将自动下载并安装Java Development Kit的6版本。 2. **选择默认Java** 安装完成后,运行`sudo update-alternatives --config java`...
标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...