`
xinyu_yang77
  • 浏览: 13540 次
  • 来自: SH
社区版块
存档分类
最新评论

Script Support (JDK1.6+)

阅读更多
: 简介<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
  1. package com.rainsoft.execise.script;   
  2.   
  3. import javax.script.*;   
  4. import java.util.List;   
  5.   
  6. /**  
  7.  * List all available script engine  
  8.  * @author RainS.Y  
  9.  * @version 1.0  
  10.  */  
  11. public class Main {   
  12.     public static void main(String[] args) {   
  13.         ScriptEngineManager mgr = new ScriptEngineManager();   
  14.         List <scriptenginefactory></scriptenginefactory>  factorys = mgr.getEngineFactories();   
  15.         for (ScriptEngineFactory factory : factorys) {   
  16.             String name     = factory.getEngineName();   
  17.             String version  = factory.getEngineVersion();   
  18.             String langName = factory.getLanguageName();   
  19.             String langVer  = factory.getLanguageVersion();   
  20.   
  21.             System.out.printf("Engine:%s(%s), Language:%s(%s)\n",    
  22.                               name, version, langName, langVer);   
  23.         }   
  24.     }   
  25. }  

运行结果:

  1. 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文件内容:
  1. #script engines supported   
  2. com.sun.script.javascript.RhinoScriptEngineFactory #javascript  

: 使用ScriptEngine使程式定制更容易

    您已经可以用properties档或xml档configure您的程式,但对于经常变化的算法而言却是不易,有了Script Support,这就容易多了。

    比如您为客户开发计算个税的程式,在国家计税方法变化时,您固然可以modify java src, compile, test, deploy完成,但如果仅仅改一下configure档就能搞定也许让人更愉快 :-)
    让我们用代码说明:
TaxCalculator.java
  1. package com.rainsoft.execise.script;   
  2.   
  3. import javax.script.*;   
  4. import java.io.FileReader;   
  5. import java.io.FileNotFoundException;   
  6. import org.apache.log4j.Logger;   
  7.   
  8. public class TaxCalculator {   
  9.     Logger  logger = Logger.getLogger(TaxCalculator.class);   
  10.        
  11.     // const   
  12.     private static final String TAX_CALCULATOR_JS = "TaxCalculator.js";   
  13.     private static final String SCRIPT_NAME = "ECMAScript";   
  14.     private static final String FUNC_CAL_PERSONAL_TAX = "calPersonalTax";   
  15.        
  16.     // private   
  17.     private ScriptEngine engine = null;   
  18.     private Invocable    invocableEngine = null;   
  19.        
  20.     /**  
  21.      * Constructor intializing script engine  
  22.      */  
  23.     public TaxCalculator() throws FileNotFoundException, ScriptException {   
  24.         ScriptEngineManager engineMgr = new ScriptEngineManager();   
  25.         engine = engineMgr.getEngineByName(SCRIPT_NAME);   
  26.         if (engine == null) {   
  27.             throw new ScriptException("Can not initialize ECMAScript engine!");   
  28.         }   
  29.   
  30.         Object ret = engine.eval(new FileReader(TAX_CALCULATOR_JS));   
  31.         if (ret != null && logger.isDebugEnabled()) {   
  32.             logger.debug("Following is returned by eval " + TAX_CALCULATOR_JS);   
  33.             logger.debug(ret.toString());   
  34.         }   
  35.            
  36.         if (!(engine instanceof Invocable)) {   
  37.             throw new ScriptException("Engine does not support Invocable interface!");   
  38.         }   
  39.         invocableEngine = (Invocable)engine;   
  40.     }   
  41.        
  42.     /**  
  43.      * Calculate personal income tax  
  44.      */  
  45.     public double calPersonalIncomeTax(Employee emp)    
  46.             throws NoSuchMethodException, ScriptException {   
  47.         Object ret = invocableEngine.invokeFunction(FUNC_CAL_PERSONAL_TAX, emp);   
  48.            
  49.         assert(ret instanceof Double); // VM parameter "-ea" to enable "assert"   
  50.         return (Double)ret;   
  51.     }   
  52. }  

(1) Constructor完成初始化JS引擎的工作

(2) calPersonalIncomeTax完成计算个税工作,方法体仅仅调用js脚本中的相关(同名)function

(3) 代码品质可以进一步提高:实现为Singleton; 将部分const放到properties档中。至于并发,让engine自己管理好了[1]

(4) 程式通过传参让js知晓emp的存在,对于更适合让js当作内建对象的Object来说,可以用如下代码做到

  1. engine.getContext().setAttribute("BuildinObject",  anInstance, ScriptContext.ENGINE_SCOPE);      

TaxCalculator.js

  1. /* Personal income tax algrithm demo */  
  2. function calPersonalTax(emp) {   
  3.     taxSalary = emp.salary - emp.the4Money - 1600;   
  4.        
  5.     taxRate = 0;   
  6.     if (taxSalary > 0 && taxSalary <= 500) {   
  7.         taxRate = 0.05;   
  8.     }   
  9.     else if (taxSalary > 500 && taxSalary <= 2000) {   
  10.         taxRate = 0.1;   
  11.     }   
  12.     else {   
  13.         taxRate = 0.15; // just demo
  14.     }   
  15.   
  16.     return taxSalary * taxRate;   
  17. }  

简单测试一下:

  1. public static void main(String[] args) throws Exception {   
  2.     Employee emp = new Employee(18000900);   
  3.     double tax = new TaxCalculator().calPersonalIncomeTax(emp);   
  4.     System.out.printf("Tax:%.0f", tax);   
  5. }  

结果:

  1. Tax:825  

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
分享到:
评论
9 楼 heyu 2006-12-14  
若是真的就好了,,写JS文件有提示功能吗?
8 楼 gao277 2006-12-13  
我觉得大家应该更加深入的讨论一下mustang在架构设计、应用开发上带来的改变和作用。
在JDK以前的版本中加入JS引擎也是可以调用JavaScript的
7 楼 歆渊 2006-12-12  
mustang 的js支持是fork了mozilla的rhino, 这个事儿被不少人批评. 不过有标准的脚本执行界面终究是好事, 但是我大概看了一下jdk6版rhino的封装, 感觉从原生的mozilla rhion界面封装到javax.scripting界面有点生硬, 因为两个管理执行上下文和环境的思路不太以致, 似乎封装中间有一些速度和内存的牺牲. 不过只是感觉, 哪位有实践经验的不妨评比一下, 我现在也有点东西直接通过mozilla rhino支持js, 正在考虑是不是改到javax.scripting接口.
6 楼 edge_hh 2006-12-12  
只支持js吗?
有没有ruby之类的规则?
5 楼 anders0913 2006-12-12  
不错不错,可以实现很多东西的动态的配置和更改了。
4 楼 抛出异常的爱 2006-12-12  
在我这里就可以用junit测试页面JS文件了...
3 楼 huangpengxiao 2006-12-11  
JAVA解析JS文件的意义是什么? 是不是有什么更深奥的意义?
2 楼 xinyu_yang77 2006-12-11  
谢谢关注
是原创,可以转贴但希望能注明出处
(http://xinyu-yang77.iteye.com/)
1 楼 抛出异常的爱 2006-12-11  
是否原创?
可否转贴?

xinyu_yang77 写道
谢谢关注
是原创,可以转贴但希望能注明出处
(http://xinyu-yang77.iteye.com/)

谢谢....正在试验...(不过下载jdk比较慢...)

相关推荐

    tomcat7-jdk1.6+redis session共享以及Tomcat对应的配置示例

    tomcat7-jdk1.6+redis session共享所有依赖包: tomcat-redis-session-manager.jar jedis.jar commons-pool.jar 以及Tomcat对应的配置示例,亲测可用

    文件名批量转换工具JDK1.6+

    自己写的一个文件名批量转换工具,使用率应该不高,但是有时候可能还是会用到,JDK1.6+ 可以转换文件夹里所有后缀名相同的文件转换成另一后缀 自己用的

    安装myeclipse+JDK1.6+tomcat6.0+mysql5.1及部署应用

    安装 MyEclipse+JDK1.6+Tomcat6.0+MySQL5.1 及部署应用 本资源提供了详细的安装和配置指南,涵盖了 JDK1.6、Tomcat6.0、MySQL5.1 和 MyEclipse 的安装、配置和部署。该手册适合初学者和经验丰富的开发者,帮助他们...

    jdk1.6+tomcat7.0.90

    标题“jdk1.6+tomcat7.0.90”指的是这个压缩包包含了Java Development Kit(JDK)的1.6版本和Apache Tomcat服务器的7.0.90版本,这两个组件都是IT领域中非常重要的软件工具,主要用于开发和部署Java应用程序。...

    jdk1.6+jdk1.7+jdk1.8的官方最新tar版本,目前jdk1.6,1.7已在Oracle官网下架了哦

    在本压缩包中,提供了三个不同版本的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)

    JDK1.6 + Tomcat6.0 + MyEclipse7.5 + Oracle XE(10g)

    jdk1.6+1.8.zip

    《深入解析JDK 1.6与1.8》 JDK(Java Development Kit)是Java编程语言的核心组件,包含了开发和运行Java应用程序所需的全部工具。JDK 1.6和1.8是两个重要的版本,它们在Java发展历程中扮演着关键角色。本篇文章将...

    linux+tomcat6+jdk1.6+oracle9i安装宝典

    ### Linux + Tomcat 6 + JDK 1.6 + Oracle 9i 安装宝典 #### 一、概述 本文档将详细介绍如何在 Red Hat Linux 9.0 操作系统上安装配置 Tomcat 6、JDK 1.6 和 Oracle 9i 数据库。这些步骤将帮助读者顺利搭建起一个...

    MacOS下jdk1.6+Eclipse4.4.2+JBoss4.2.2+SVN开发环境搭建

    本教程将详细介绍如何在MacOS系统上安装和配置JDK 1.6、Eclipse IDE 4.4.2(Luna)以及应用服务器JBoss 4.2.2,并结合SVN进行版本控制。以下是一步步的详细步骤: 1. **JDK 1.6 安装**: - 首先,访问Oracle官方...

    苹果电脑安装jdk1.6 mac for jdk1.6 jdk6 安装版

    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免安装说明

    标题中的"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格式

    《Jdk+api+1.6+英文原版 CHM格式》是针对Java开发者的一份重要参考资料,它包含了Java Development Kit (JDK) 1.6版本的API文档,以CHM(Compiled Help Manual)格式呈现。CHM是一种微软开发的帮助文件格式,允许...

    JDK1.6+1.8.zip

    **Java Development Kit (JDK) 1.6与1.8详解** JDK,全称为Java Development Kit,是Oracle公司提供的用于开发Java应用程序的核心工具集。JDK包含了Java编译器(javac)、Java虚拟机(JVM)以及一系列的Java开发和...

    okhttp包含okio(亲测可在jdk1.6环境运行)

    适合okhttp,okio JDK1.6:okhttp3.8.0-jdk1.6.jar JDK1.6+:okhttp-3.12.13.jar;okio-1.15.0.jar 适用于Java开发环境、使用OkHttp调用

    jdk1.6+API,中文+工具书

    **JDK 1.6 API 中文版:开发者的重要参考资料** JDK(Java Development Kit)是Oracle公司提供的Java编程语言的开发和运行环境,而JDK 1.6是其在2009年发布的一个重要版本。这个版本引入了许多新特性和改进,对Java...

    Ubuntu下配置java环境(JDK1.6+eclipse+myeclipse+tomcat)

    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的问题

    标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...

Global site tag (gtag.js) - Google Analytics