使用Rhino在Java中调用Javascript脚本
    
转自:http://www.iteye.com/topic/87423
?
前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式。
 结果方案五花八门:
 1.jakarta commons JEXL. 
 2.Beanshell
 3.Java Math Expression Parser jep 
 4.parse combinator jparsec 
 5.jdk 6.0的 script
 6.利用SQL 
 7.自己写语法分析
 如果自己写语法分析,没有个2000行估计搞不定。有人用sql来运行数学表达式,比较另类。
 不过由于前段时间较深入的学习了一些java的javascript引擎,我给出的方案就是用javascript来计算了。
 java中比较著名的js引擎当属mozilla开源的rhino,不过jdk6已经把它收归帐下,成了正规军。
- public?class?MathEval ??
 
- { ??
 
- 
????public?static?void?main(String[]?args) ??
 
- ????{ ??
 
- ????????Context?cx?=?Context.enter(); ??
 
- 
????????try??
 
- ????????{ ??
 
- ????????????Scriptable?scope?=?cx.initStandardObjects(); ??
 
- 
????????????String?str?=?"9*(1+2)"; ??
 
- 
????????????Object?result?=?cx.evaluateString(scope,?str,?null,?1,?null); ??
 
- 
????????????double?res?=?Context.toNumber(result); ??
 
- ????????????System.out.println(res); ??
 
- ????????} ??
 
- 
????????finally??
 
- ????????{ ??
 
- ????????????Context.exit(); ??
 
- ????????} ??
 
- ????} ??
 
- }??
 
 
下面总结一下前段时间学习rhino的心得(给自己的程序添加脚本功能,其实是很酷的):
一:环境配置及运行js脚本:
 在 http://www.mozilla.org/rhino/ 下载rhino:
 把js.jar加入系统CLASSPATH中
 可以以交互模式调用js解释器:
 java org.mozilla.javascript.tools.shell.Main
 然后您应该会看到解释器的版本号,后面跟着提示符 js> 
 用法如下:
 比如:有一个js文件:
 D:\eclipse-workshop\rhinoExample\src\isPrime.js
 内容如下:
js 代码
- function?isPrime?(num) ??
 
- { ??
 
- 
????if?(num?<=?1)?{ ??
 
- 
????????print("Please?enter?a?positive?integer?>=?2.") ??
 
- 
????????return?false??
 
- ????} ??
 
- ???? ??
 
- 
????var?prime?=?true??
 
- 
????var?sqrRoot?=?Math.round(Math.sqrt(num)) ??
 
- ???? ??
 
- 
????for?(var?n?=?2;?prime?&?n?<=?sqrRoot;?++n)?{ ??
 
- ????????prime?=?(num?%?n?!=?0) ??
 
- ????} ??
 
- ???? ??
 
- 
????return?prime ??
 
- }??
 
 
 如何运行呢:
 1:在命令行下键入:
 java org.mozilla.javascript.tools.shell.Main
 2:在js〉下键入:
 load("D:/ecli