java执行js java后台执行js ScriptEngineManager

实现的功能

  1. java构建js执行环境
  2. java调用js函数,传参数
  3. js调用java静态方法,静态变量
  4. js创建java对象
  5. js导入java包,实现更多可扩展功能,导包的方式有两种,分别看test.js和test_2.js
  6. java定义接口,js来实现java接口

上代码
JS.java

package com.js;

import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JS {
	ScriptEngineManager engineManager = null;
	ScriptEngine engine = null;
	Invocable invocable = null;
	
	
	private void init(){
		engineManager =  new ScriptEngineManager();;
		engine = engineManager.getEngineByName("JavaScript");
		invocable = (Invocable) engine; 
	}
	public JS(){
		this.init();
	}
	public Object eval(String script){
		try {
			return this.engine.eval(script);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		return null;
	}
	public Object invokeFunction(String name,Object... args){
		try {
			return invocable.invokeFunction(name, args);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	public Object toJsObj(Object obj){
		return this.eval("("+JSONObject.toJSONString(obj)+")");
	}
	public <T> T getInterfase(Class<T> clz){
		return (T) invocable.getInterface(clz);
	}
	public void bind(String var,Object obj){
		Bindings bindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
		bindings.put(var, obj);
	}
}

JSLib.java 

package com.js;


public interface JSLib {
	public String render(Object value,Object display,Object obj);
}

 ScriptTest.java

package com.js;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;

public class ScriptTest{
	public static String NAME = "SCRIPT_TEST";
	@Test
	public void test() throws Exception {
		String testJs = this.getText("test_2.js");
		JS js = new JS();
		js.eval(testJs);
		Object rs = js.invokeFunction("test", "as");
		System.out.println(rs);
		
		rs = js.invokeFunction("javaName");
		System.out.println(rs);
		
		rs = js.invokeFunction("testBean");
		System.out.println(rs);
		
		rs = js.invokeFunction("println","sssskk");
		
		rs = js.invokeFunction("createObj");
		
		js.bind("myTest", new ScriptTest());
		
		js.invokeFunction("bindTest");
		
		rs = js.invokeFunction("importPackageTest");
		System.out.println(rs);
		
		JSLib jsLib = js.getInterfase(JSLib.class);
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("id", "123");
		item.put("name", "张三");
		rs = jsLib.render("1", null, js.toJsObj(item));
		System.out.println(rs);
	}
	
	public static String run(){
		System.out.println("runn");
		return "runname";
	}
	
	public void ok(String s){
		System.out.println(s+":ok");
	}
	
	public String getText(String fileName) throws Exception{
		BufferedReader reader = this.getReader(fileName);
		StringBuffer s = new StringBuffer();
		String line = null;
		while((line = reader.readLine()) != null){
			s.append(line+"\n");
		}
		reader.close();
		return s.toString();
	}
	//获取文本文件流
	public BufferedReader getReader(String fileName) throws Exception{
		return new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(fileName)));
	}
	
	
}

test.js

var app = JavaImporter();
app.importPackage(Packages.com.js);

function test(a){
	return a+":hello";
}
function javaName(){
	return com.js.ScriptTest.NAME;
}

function testBean(){
	return com.js.ScriptTest.run();
}

function createObj(){
	var obj = new com.js.ScriptTest();
	obj.ok("createObj");
}

function bindTest(){
	myTest.ok("bind");
	myTest.run();
}

function importPackageTest(){
	with(app){
		return ScriptTest.NAME;
	}
}

function render(value,display,obj){
	return "render:"+value+",name="+obj.name;
}

test_2.js

importPackage(com.qssh.base.test.init);
function test(a){
	return a+":hello";
}
function javaName(){
	return com.qssh.base.test.init.ScriptTest.NAME;
}

function testBean(){
	return com.qssh.base.test.init.ScriptTest.run();
}

function createObj(){
	var obj = new com.qssh.base.test.init.ScriptTest();
	obj.ok("createObj");
}

function bindTest(){
	myTest.ok("bind");
	myTest.run();
}

function importPackageTest(){
	return ScriptTest.NAME;
}

function render(value,display,obj){
	return "render:"+value+",name="+obj.name;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值