我们用到的类:ScriptEngineManager,ScriptEngine,InputStream,Invocable。

InputStream类 : 输入流。这个大家都是知道的吧,我在这里就不多说了。

ScriptEngineManager和ScriptEngine类:
javax.script,始于JDK1.6,不过现在只有sun实现的javascript的解析器.
创造一个就像java的函数一样存在于内存中随时可以被调用的函数,更可以将js中的对象直接转换成java对象。
script包下最主要的是ScriptEngineManager、ScriptEngine、CompiledScript和Bindings 4个类或接口

ScriptEngineManager是一个工厂的集合,可以通过name或tag的方式获取某个脚本的工厂并生成一个此脚本的ScriptEngine,目前只有javascript的工厂。
通过工厂函数得到了ScriptEngine之后,就可以用这个对象来解析脚本字符串了,
直接调用Object obj = ScriptEngine.eval(String script)即可,返回的obj为表达式的值,比如true、false或int值。

CompiledScript可以将ScriptEngine解析一段脚本的结果存起来,方便多次调用。
只要将ScriptEngine用Compilable接口强制转换后,调用compile(String script)就返回了一个CompiledScript对象,要用的时候每次调用一下CompiledScript.eval()即可,一般适合用于js函数的使用。

Bindings的概念算稍微复杂点,我的理解Bindings是用来存放数据的容器。它有3个层级,为Global级、Engine级和Local级,前2者通过ScriptEngine.getBindings()获得,是唯一的对象,而Local Binding由ScriptEngine.createBindings()获得,很好理解,每次都产生一个新的。
Global对应到工厂,Engine对应到ScriptEngine,向这2者里面加入任何数据或者编译后的脚本执行对象,在每一份新生成的Local Binding里面都会存在。
例子:
 

  1. try {    
  2.     ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");    
  3.     Compilable compilable = (Compilable) engine;    
  4.     Bindings bindings = engine.createBindings(); //Local级别的Binding     
  5.     String script = "function add(op1,op2){return op1+op2} add(a, b)"//定义函数并调用     
  6.     CompiledScript JSFunction = compilable.compile(script); //解析编译脚本函数     
  7.     bindings.put("a"1);bindings.put("b"2); //通过Bindings加入参数     
  8.     Object result = JSFunction.eval(bindings);    
  9.     System.out.println(result); //调用缓存着的脚本函数对象,Bindings作为参数容器传入     
  10. }    
  11. catch (ScriptException e) {}    

Invocable接口:
这个是javax.script下的接口,该接口用于对以前的脚本执行中已经编译的脚本对象(以 ScriptEngine 的状态保持)调用某一方法。

 

下面是我写好的一个例子:

 

  1. import java.io.FileInputStream;  
  2. import java.io.FileNotFoundException;  
  3. import java.io.InputStream;  
  4. import java.io.InputStreamReader;  
  5.  
  6. import javax.script.Invocable;  
  7. import javax.script.ScriptEngine;  
  8. import javax.script.ScriptEngineManager;  
  9. import javax.script.ScriptException;  
  10.  
  11.  
  12. public class Test {  
  13.       
  14.     public static void main(String[] args) throws Exception {  
  15.         String path ="d://aa.js";  
  16.           
  17.         try {  
  18.             //流得到js  
  19.             InputStream input = new FileInputStream(path);  
  20.             //ScriptEngineManager 为 ScriptEngine 类实现一个发现和实例化机制,还维护一个键/值对集合来存储所有 Manager 创建的引擎所共享的状态。  
  21.             ScriptEngineManager scriptmanager = new ScriptEngineManager();  
  22.             //创建引擎  
  23.             ScriptEngine script = scriptmanager.getEngineByName("js");  
  24.             //绑定引擎  
  25.             script.put("script", script);  
  26.             //执行io流中的javascript代码  
  27.             script.eval(new InputStreamReader(input));  
  28.             Invocable inv = (Invocable) script;  
  29.             Object[] object = {"123456"};  
  30.             Object bb=inv.invokeFunction("isPasswd", object);  
  31.             System.out.println(bb);  
  32.         } catch (FileNotFoundException e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.         }  
  36.               
  37.         }  
  38.  
  39. }  

 

下面是js脚本:

  1. //校验密码:只能输入6-15个字母、数字  
  2. function isPasswd(s)  
  3. {  
  4. var patrn=/^[a-zA-Z0-9]{6,15}$/;  
  5. if (!patrn.exec(s)) return false 
  6. return true 
  7. }