一. JS文件
Hello.js
function sayHello(name) {
return name + "你好,恭喜你成功使用java调用了js中的方法!"
}
二. 创建一个与JS对接的Java接口
/**
* 创建一个对接JavaScript的接口,接口中的方法与JavaScript中的方法对应
*
*/
public interface JavaScriptInterface {
public String sayHello(String name);
}
三. 执行方法
import java.io.FileReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import org.springframework.stereotype.Service;
import com.qfx.modules.js.service.JavaScriptInterface;
import com.qfx.modules.js.service.TestService;
@Service
public class TestServiceImpl implements TestService {
/**
* 执行js中的方法sayHello
*/
@Override
public String hello(String name) {
String str="";
// 1.创建一个JavaScript引擎
ScriptEngineManager manager = new ScriptEngineManager();
// 2.获取一个指定的名称的JavaScript引擎实例
ScriptEngine engine = manager.getEngineByName("JavaScript");
//ScriptEngine engine = manager.getEngineByName("js");
try {
// 3.获取文件路径
String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();
// 4.加载要执行的js文件(可多个),FileReader的参数为所要执行的js文件的路径(如果是.jar格式,建议文件与.jar分离,采用绝对路径)
engine.eval(new FileReader(path+ "../classes/static/js/Hello.js"));
if (engine instanceof Invocable) {
//5.从脚本引擎中返回一个给定接口的实现
Invocable invocable = (Invocable) engine;
// 从脚本引擎中获取JavaScriptInterface接口对象(实例). 该接口方法由具有相匹配名称的脚本函数实现。
JavaScriptInterface executeMethod = invocable.getInterface(JavaScriptInterface.class);
// 调用这个js接口
str = executeMethod.sayHello(name);
}
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
}
四. 测试
可以直接使用junit单元测试,也可以编写成WEB项目,通过Controller进行调用
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.qfx.modules.js.service.impl.TestServiceImpl;
@SpringBootTest
class RunAppTests {
@Autowired
TestServiceImpl testService;
@Test
void sss() {
String msg = testService.hello("琳琳");
System.out.println(msg);
}
}
效果