• Java中使用JavaScript脚本


    简介 Nashorn

    Nashorn 一个 javascript 引擎。
    从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。
    它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。
    与先前的Rhino实现相比,这带来了2到10倍的性能提升。

    使用方式
    1. 编写JavaScript脚本
      列:JavaScript方法使用Java对象执行方法获取返回值。
    function scriptFunction(obj){
    	var a = 1;
    	var b = 2;
    	return obj.sum(a,b);
    }
    scriptFunction(obj);//调用该方法
    

    该脚本变量定义为 String script1;
    2. 创建JavaScript容器用户存储脚本 ScirptContainer.java

    public class ScirptContainer {
    	
    	
    	public static ScriptEngine engine;//脚本引擎
    	
    	static {
    		ScriptEngineManager manager = new ScriptEngineManager();//脚本引擎管理
    		engine = manager.getEngineByName("nashorn");//获取nashorn脚本引擎
    		engine.getContext().getWriter();//获取正文并且写入
    	}
    	
    	private ConcurrentHashMap<Integer, CompiledScript> scripts = new ConcurrentHashMap<>();//脚本存储容器
    	
    	
    	public CompiledScript getCompiledScript(String script) throws ScriptException{
    		//判断脚本是否为空
    		if(script == null || "".equals(script)){
    			throw new ScriptException("JavaScript empty");
    		}
    		//获取脚本Hash
    		int hashCode = script.hashCode();
    		//从容器中获取脚本
    		CompiledScript compiledScript = scripts.get(hashCode);
    		if(compiledScript == null){
    			//容器中无脚本创建脚本对象
    			Compilable compilable = (Compilable) engine;
    			//编译JavaScript脚本
    			compiledScript = compilable.compile(script);
    			//脚本对象存入容器中
    			scripts.put(hashCode, compiledScript);
    		}
    		return compiledScript;
    	}
    	
    }
    
    1. Java执行JavaScript脚本
    public class ScriptHandler {
    	
    	//创建容器对象
    	private ScirptContainer scirptContainer = new ScirptContainer();
    	
    	//需要执行的对象
    	String js1 = "function scriptFunction(obj){  var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);";
    	
    	@Test
    	public void test() throws ScriptException{
    		//获取脚本对象
    		CompiledScript c1 = scirptContainer.getCompiledScript(js1);
    		//创建参数绑定
    		Bindings bindings = scirptContainer.engine.createBindings();
    		//obj参数绑定SumTest类
    		bindings.put("obj", new SumTest());
    		//执行JavaScript脚本并且打印返回值
    		System.out.println(c1.eval(bindings));
    	}
    }
    

    注意事项:

    1. 脚本中scriptFunction(obj);是必须存在,否则不会执行方法.
    2. 脚本中可以创建Java对象,需要全类名如var map = new java.util.HashMap();
  • 相关阅读:
    ECMall模板开发文档
    ECmall错误:Call to a member function get_users_count() on a non-object
    剖析ECMALL的登录机制
    分析ECMall的注册与登录机制
    ECMall的MySQL数据调用的简单方法
    ECMall系统请求跳转分析
    Ecmall系统自带的分页功能
    ECMall注册机制简要分析
    [Ecmall]ECMALL目录结构设置与数据库表
    [ecmall]Ecmall 后台添加模板编辑区
  • 原文地址:https://www.cnblogs.com/SimpleWu/p/12598442.html
Copyright © 2020-2023  润新知