java调用javascript脚本

前些天写代码遇到了调用脚本的问题,今天总结总结吧!java从jdk1.6开始支持调用脚本,它的底层实现是Mozilla Rhino,这是一个完全使用java语言编写的开源javascript引擎实现  。  

好了,废话不多说了,直接上步骤和代码。

            1、获得一个ScriptEngineManager

                        ScriptEngineManager mgr = new ScriptEngineManager();

            2、生成一个ScriptEngine脚本引擎,有三种方法可以获得

                    a)ScriptEngine engine = mgr.getEngineByExtension(String extension);

                           其中Extension只可取js,代表JavaScript

                     b)mgr.getEngineByMineType(String mine)

                             其中mine可取值有 1>application/javascript 2>application/ecmascript

                                                             3>test/javascript   4>test/ecmascript

                    c)mgr.getEngineByName(String Name)

                                其中Name可取值有 1>js 2>rhino

                                                                 3>javascript  4>JavaScript

                                                                 5>ECMAScript(JavaScript是ECMA-262标准的实现和扩展)

                                                                 6>ecmascript

实际上可以通过以下代码找出当前环境支持的脚本引擎

package ex.jstest;

import java.util.List;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;

public class ParamType {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        ScriptEngineManager mgr = new ScriptEngineManager();  
        List<ScriptEngineFactory> factories = mgr.getEngineFactories();  
        
        for (ScriptEngineFactory f : factories) {  
     
            System.out.println(  
                    "egine name:"+f.getEngineName() +  "\n" +
                    "engine version:"+f.getEngineVersion()+  "\n" +
                    "language name:"+f.getLanguageName()+  "\n" +
                    "language version:"+f.getLanguageVersion()+  "\n" +
                    "names:"+f.getNames()+  "\n" +
                    "mime:"+f.getMimeTypes()+  "\n" +
                    "extension:"+f.getExtensions());  
        } 
    }
}

输出如下:

125020_tSxU_1446623.png

            3、调用eval()方法执行脚本                     

package ex.jstest;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class ExecJs {
        public static void main(String[] args) {
    
        ScriptEngineManager mgr = new ScriptEngineManager();  
        ScriptEngine engine = mgr.getEngineByName("js");  
        
        String js = "function hello(){return 'Hello World';} hello()";
        
        try {  
            // Object value = engine.eval("function hello(){return 'Hello World';} hello()");  
            Object value = engine.eval(js);  
            System.out.println(value);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } 
    }
}

            I)当然在我们调用函数的时候还要传递一些参数此时可以这样做

        ScriptEngineManager mgr = new ScriptEngineManager();  
        ScriptEngine engine = mgr.getEngineByName("js");  
    
        engine.put("name", "Mr Lee");  
        
        try {  
            Object value = engine.eval("function hello(p){return 'Hello world,' + p;} hello(name);" );  
            System.out.println(value);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }

输出:Hello World,Mr Lee

        II)如果想要更灵活的调用脚本,我们可以用到Invocable接口。例子如下:

        ScriptEngineManager  mgr = new ScriptEngineManager();
	ScriptEngine engine = mgr.getEngineByName("JavaScript");
		
	try {
		String js = "function test(p){return 'this is a test!' + p}";  、
		
		engine.eval(js);
		
		} catch (ScriptException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Invocable inv = (Invocable) engine;
		
		try {
		        //可以多次的调用,动态的设置参数(这里执行了两次)
			String value1 = (String) inv.invokeFunction("test", "Mr Lee");
			System.out.println(value1);
			
			String value2 = (String) inv.invokeFunction("test", "Mr Wong");
			System.out.println(value2);
			
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ScriptException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

  有人可能要问了,能不能调用外部的js脚本呢?答案是肯定的

往这里看(文档原文)133115_KjhT_1446623.png

    eval()是接受Reader类型的参数的,看代码

package ex.jstest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.Reader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
 * 
 * @author Eswin
 *
 *读取文件中的js脚本
 */
public class JsTest3 {
    public static void main(String[] args) throws FileNotFoundException {
        // TODO Auto-generated method stub
        ScriptEngineManager  mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        
        File f = new File("F:/test.js");
        Reader r = new InputStreamReader(new FileInputStream(f));
            
        try {
            engine.eval(r);
        } catch (ScriptException e) {
            // TODO Auto-generated catch block
                e.printStackTrace();
        }
        
        Invocable inv = (Invocable) engine;
        
        try {
                String value = (String) inv.invokeFunction("test", "Mr Lee");
                System.out.print(value);
        } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        } catch (ScriptException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
     }
}

这是js代码

133654_IbJa_1446623.png

好吧,暂时到这里,学到更多后续内容我会慢慢补充!加油!↖(^ω^)↗

转载于:https://my.oschina.net/v5871314/blog/205676

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值