java调用javascript
package com.efun.tools;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* javascript工具类,用于调用js方法
*
* @author leng
* @since jdk1.6
*
*/
public class JavaScriptUtil {
public static void main(String[] args) throws ScriptException,
NoSuchMethodException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
try {
Double result = (Double) engine
.eval("var a=3; var b=44; c=a+b;f=a-b; ");
// engine.getContext().getScopes()
System.out.println(engine.getContext().getAttribute("a"));
engine.get("c");
System.out.println(engine.get("c"));
System.out.println(result);
// engine.eval("alert(\"js alert\");"); // 不能调用浏览器中定义的js函数 //
// 错误,会抛出alert引用不存在的异常
} catch (ScriptException e) {
e.printStackTrace();
}
String jsCode = "function test123(a,b){ return a+b}";
System.out.println(jsCalculateFunction(jsCode, "test123", 1, 2));
// String jsCode="c=a+b;f=a-b;";
//
// String aaa="c=(a*b)+(2*(a+1))/3";
// Map m=new HashMap();
// m.put("a", 1);
// m.put("b", 3);
// ScriptEngine engine=jsCalculate(jsCode, m);
// System.out.println(engine.get("a"));
// System.out.println(engine.get("b"));
// System.out.println(engine.get("c"));
// System.out.println(engine.get("f"));
// System.out.println(engine.get("g"));
System.out.println(encodeURIComponent("test asd"));
}
/**
* 使用指定的js代码,计算结果
*
* @param jsCode
* js代码
* @param functionName
* 需要调用的功能名
* @param params
* 参数
* @return
* @throws ScriptException
* @throws NoSuchMethodException
*/
public static Object jsCalculateFunction(String jsCode,
String functionName, Object... params) throws ScriptException,
NoSuchMethodException {
Object result = null;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
engine.eval(jsCode);
if (engine instanceof Invocable) {
Invocable invoke = (Invocable) engine; // 调用merge方法,并传入两个参数
Object obj = invoke.invokeFunction(functionName, params);
return obj;
}
return result;
}
/**
* 调用js的encodeURIComponent方法
* @param str 需要encode的内容
* @return 编码后的内容
* @throws ScriptException
*/
public static String encodeURIComponent(String str) throws ScriptException{
String jsCode="result=encodeURIComponent(str)";
Map m=new HashMap();
m.put("str",str);
ScriptEngine engine=jsCalculate(jsCode,m);
String result=(String) engine.get("result");
return result;
}
/**
* 执行js代码,需要从ScriptEngine内自行获取结果
*
* @param jsCode
* js代码
* @param params
* 参数
* @return
* @throws ScriptException
*/
public static ScriptEngine jsCalculate(String jsCode,
Map<String, Object> params) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
if (null != params && params.size() > 0) {
Set<Entry<String, Object>> set = params.entrySet();
Iterator<Entry<String, Object>> it = set.iterator();
while (it.hasNext()) {
Entry<String, Object> e = it.next();
String key = e.getKey();
Object valueObj = e.getValue();
engine.put(key, valueObj);
}
}
engine.eval(jsCode);
return engine;
}
public static ScriptEngine getScripteEngine() throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
return engine;
}
}