You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring 5 MVC Controller与JSP关联:如何将Java数据传入JS容器

解决Spring 5中Java数据传入JSP的JavaScript数组问题

你之前尝试的var myArray1 = "${users}";之所以失败,核心原因是${users}输出的是Java中List<User>的toString()结果(类似[User@xxxx, User@yyyy]),这不是JavaScript能识别的有效数组格式。我们需要把Java对象列表转成标准JSON字符串,再让JS解析成可用的数组。下面是具体的解决步骤:

步骤1:在UserController中准备JSON格式的用户数据

Spring默认集成了Jackson库,我们可以用它的ObjectMapper把用户列表序列化为JSON字符串,再放到Model中传递给JSP:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Controller
public class UserController {

    private final UserService userService;
    private final ObjectMapper objectMapper;

    // 构造注入依赖(Spring Boot会自动配置ObjectMapper;纯Spring MVC需手动配置该Bean)
    public UserController(UserService userService, ObjectMapper objectMapper) {
        this.userService = userService;
        this.objectMapper = objectMapper;
    }

    @GetMapping("/edit-users") // 替换成你的实际请求路径
    public String showEditUsersPage(Model model) throws Exception {
        // 从Service获取用户列表
        List<User> userList = userService.getAllUsers();
        
        // 将用户列表序列化为JSON字符串
        String usersJson = objectMapper.writeValueAsString(userList);
        
        // 把JSON字符串和原列表(如果JSP需要用EL遍历的话)存入Model
        model.addAttribute("usersJson", usersJson);
        model.addAttribute("users", userList);
        
        return "EditUsers"; // 返回目标JSP视图
    }
}

步骤2:在EditUsers.jsp中解析JSON为JavaScript数组

在JSP的JavaScript代码块中,直接将JSON字符串赋值给JS变量即可(JSON本身就是JS对象字面量的子集,可直接识别):

// 直接将JSON字符串转为JS对象数组
var myArray1 = ${usersJson};

// 测试验证
console.log("用户列表数据:", myArray1);
// 遍历数组做后续操作示例
myArray1.forEach(user => {
    console.log("用户ID:", user.id, "用户名:", user.username); // 替换成你的User类实际字段
});

关键注意事项:

  • 确保User类可序列化:User类需要有公共无参构造方法,且所有需要序列化的字段都有对应的getter方法,Jackson依赖这些生成正确的JSON。
  • 日期字段处理:如果User类包含日期类型字段,可在字段上添加@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解,避免序列化出不友好的时间戳格式。
  • 特殊字符自动转义:ObjectMapper会自动处理数据中的引号、换行等特殊字符,直接用${usersJson}赋值是安全的,无需额外处理。

备选方案(不推荐):在JSP中直接序列化

如果不想在Controller中处理JSON,也可以在JSP中嵌入Java代码完成序列化,但这种方式会破坏MVC分层原则,让视图层逻辑变复杂:

<%@ page import="com.fasterxml.jackson.databind.ObjectMapper" %>
<%@ page import="java.util.List" %>
<%@ page import="com.yourpackage.User" %>
<%
    List<User> users = (List<User>) request.getAttribute("users");
    ObjectMapper mapper = new ObjectMapper();
    String usersJson = mapper.writeValueAsString(users);
%>
<script>
    var myArray1 = <%= usersJson %>;
</script>

优先推荐第一种Controller处理的方式,更符合Spring MVC的设计理念。

内容的提问来源于stack exchange,提问作者user9209502

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:58:54