Java中调用js方法

时间:2023-02-06 12:17:20

一. 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);
}
}

效果

Java中调用js方法