上一篇                     
               
			  如何在Java中执行JavaScript?
- 后端开发
- 2025-06-18
- 4290
 在Java中执行JavaScript代码通常使用脚本引擎,如JDK内置的Nashorn引擎(
 Java 8-14)或GraalVM引擎,通过ScriptEngineManager获取
 JavaScript引擎实例,调用eval()方法执行JS脚本字符串,实现Java与JS交互。
 
在Java中执行或生成JavaScript(JS)代码通常涉及两种场景:在Java后端运行JS逻辑(通过脚本引擎)或动态生成JS代码供前端使用(例如Web开发),以下是详细实现方法:
使用Java脚本引擎执行JS(后端运行)
Java通过javax.script包提供对JavaScript引擎的支持(如Nashorn引擎),适用于数据处理、规则计算等场景。

基础示例
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class RunJS {
    public static void main(String[] args) {
        // 获取JavaScript引擎
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        try {
            // 执行JS代码
            engine.eval("print('Hello from JavaScript!')");
            // 调用JS函数并获取返回值
            engine.eval("function add(a, b) { return a + b; }");
            Object result = engine.eval("add(5, 3);");
            System.out.println("Result: " + result); // 输出: Result: 8
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }
} 
关键操作
- 传递Java变量到JS: engine.put("name", "JavaUser"); engine.eval("print('Hello, ' + name);"); // 输出: Hello, JavaUser
- 调用Java方法: engine.eval("var File = Java.type('java.io.File');"); engine.eval("var file = new File('test.txt');"); engine.eval("print(file.exists());");
注意事项
- 引擎兼容性: 
  - Nashorn引擎在Java 8-14中默认支持(Java 15+需手动启用)。
- 替代方案:GraalVM引擎(支持现代JS): ScriptEngine engine = new ScriptEngineManager().getEngineByName("graal.js");
 
- 性能:避免频繁调用eval(),可通过预编译提升效率:CompiledScript script = ((Compilable) engine).compile("function calc(x) { return x * 2; }"); script.eval();
动态生成JS代码(供前端使用)
在Web开发中,Java常用于生成动态JS代码,例如通过JSP、Thymeleaf等模板引擎输出到HTML。

JSP示例
<%@ page contentType="text/html;charset=UTF-8" %>
<script>
  // 从Java后端注入数据
  var userId = <%= request.getAttribute("userId") %>;
  var config = {
    apiUrl: "<%= application.getInitParameter("API_URL") %>",
    timeout: 5000
  };
  function showMessage() {
    alert("User ID: " + userId);
  }
</script> 
使用Thymeleaf模板(Spring Boot)
<script th:inline="javascript">
  var userData = [[${userJson}]];
  console.log(userData.name);
</script> 
需在Java控制器中传递数据:
@GetMapping("/page")
public String page(Model model) {
    model.addAttribute("userJson", new ObjectMapper().writeValueAsString(user));
    return "page";
} 
安全建议
- 防XSS攻击:对动态内容转义 var text = "<%= org.apache.commons.text.StringEscapeUtils.escapeEcmaScript(userInput) %>"; 
- JSON序列化:使用Jackson或Gson避免手动拼接错误。
应用场景对比
| 场景 | 技术方案 | 典型用途 | 
|---|---|---|
| 后端执行JS逻辑 | Nashorn/GraalVM引擎 | 规则引擎、数学计算、旧系统集成 | 
| 动态生成前端JS | JSP/Thymeleaf/模板 | 注入配置、传递数据、初始化页面 | 
| 高性能JS交互 | REST API + 前端JS | 解耦前后端,推荐替代方案 | 
最佳实践
- 避免混合逻辑:核心业务用Java实现,JS仅用于必要扩展。
- 安全性优先:禁止直接拼接用户输入到JS代码中。
- 现代替代方案: 
  - 后端执行JS:GraalVM(性能更好,支持ES6)。
- 前后端通信:REST API + 前端框架(如React/Vue),更安全高效。
 
引用说明:
- Oracle Nashorn文档:Java Scripting Programmer’s Guide
- GraalVM JavaScript参考:GraalVM JS Documentation
- OWASP XSS防护指南:Cross Site Scripting Prevention
- 本文基于Java 17+环境验证,代码示例遵循MIT开源许可。
 
 
 
			