SSM框架实现JSON数据返回:从后端到前端的表格数据传递
在现代Web应用开发中,前后端分离架构已成为主流趋势,后端框架负责业务逻辑处理和数据封装,而前端则专注于数据展示和用户交互,将后端数据以JSON格式返回,供前端(尤其是表格组件)渲染,是一种非常常见且高效的方式,本文将详细介绍在经典的SSM(Spring + Spring MVC + MyBatis)框架中,如何配置并实现返回JSON数据,特别是满足前端表格需求的数据结构。
核心概念:为何选择JSON?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,也易于机器解析和生成,其主要优势在于:
- 简洁性:XML相比,JSON更小,解析速度更快。
- 与JS无缝集成:JSON可以直接在JavaScript中使用,
JSON.parse()和JSON.stringify()方法可以轻松实现字符串和对象之间的转换。 - 通用性:几乎所有编程语言都支持JSON的解析和生成。
- 结构化:支持数组和对象嵌套,能灵活表达复杂的数据结构,非常适合表格数据的行列表示。
SSM框架中返回JSON的基石:Spring MVC配置
要在Spring MVC中返回JSON数据,最核心的依赖是Jackson(或Gson、Fastjson),Spring MVC 3.x之后,对JSON的支持非常便捷。
添加必要依赖
确保你的pom.xml文件中包含了Jackson核心库和Spring MVC的JSON支持依赖(通常spring-boot-starter-web会自动包含,如果是传统SSM项目,则需手动添加):
<!-- Jackson核心库 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version> <!-- 使用较新稳定版本 -->
</dependency>
<!-- 如果使用Spring MVC 4.x+,此依赖可能可选,但显式声明更稳妥 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.0</version>
</dependency>
配置Spring MVC的注解驱动
在Spring的配置文件(如spring-mvc.xml)中,开启注解驱动并配置JSON消息转换器:
<!-- 开启注解驱动,它会自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven>
<!-- 配置消息转换器,用于处理JSON -->
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
配置完成后,Spring MVC就能自动将带有@ResponseBody注解的方法返回值或@RestController注解的类方法返回值转换为JSON格式,并写入HTTP响应体中。
实战:Controller层返回JSON数据
假设我们有一个用户列表需要展示在前端表格中。
定义实体类(POJO)
创建一个与数据库表对应的实体类,例如User.java:
public class User {
private Long id;
private String username;
private String email;
private Integer age;
// 构造方法、getter和setter省略
// 为了JSON序列化成功,建议提供无参构造方法
}
在Service层获取数据
Service层负责业务逻辑处理,从数据库获取数据(这里省略DAO层实现,假设已通过MyBatis获取到数据):
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAllUsers();
}
}
在Controller层返回JSON
Controller层接收请求,调用Service获取数据,并返回JSON。
使用@ResponseBody注解(适用于Controller类)
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/list")
@ResponseBody // 标识该方法返回的不是视图,而是直接写入HTTP响应体的数据
public List<User> getUserList() {
return userService.getAllUsers();
}
}
当访问/user/list时,Spring MVC会自动将List<User>对象转换为JSON数组,
[
{
"id": 1,
"username": "zhangsan",
"email": "zhangsan@example.com",
"age": 25
},
{
"id": 2,
"username": "lisi",
"email": "lisi@example.com",
"age": 30
}
]
使用@RestController注解(推荐,更简洁)
如果整个Controller都只返回JSON数据,可以直接使用@RestController注解,这样就不需要在每个方法上再加@ResponseBody了。
@RestController
@RequestMapping("/user/api")
public class UserApiController {
@Autowired
private UserService userService;
@RequestMapping("/list")
public List<User> getUserList() {
return userService.getAllUsers();
}
}
优化:返回更符合前端表格需求的JSON结构
直接返回数据列表虽然简单,但很多前端表格组件(如jQuery DataTables, EasyUI DataGrid, Vue Element UI Table)更期望一种包含分页、总记录数等信息的结构化JSON响应。
定义统一的响应结果对象
可以创建一个统一的响应包装类,例如Result.java和PageResult.java:
// 通用结果对象
public class Result<T> {
private int code; // 状态码,如200表示成功
private String message; // 提示信息
private T data; // 数据
// 构造方法、getter和setter省略
}
// 分页结果对象
public class PageResult<T> {
private long total; // 总记录数
private List<T> rows; // 当前页数据列表
// 构造方法、getter和setter省略
}
修改Controller返回分页JSON
假设我们实现了分页查询方法:
@RestController
@RequestMapping("/user/api")
public class UserApiController {
@Autowired
private UserService userService;
@RequestMapping("/page")
public PageResult<User> getUserPage(int page, int rows) {
// 调用service层获取分页数据,这里假设userService有分页方法
// 实际项目中,MyBatis PageHelper等插件很常用
List<User> userList = userService.selectUserByPage(page, rows);
long total = userService.selectUserCount();
return new PageResult<>(total, userList);
}
}
这样,前端收到的JSON结构将是:
{
"total": 100,
"rows": [
{
"id": 1,
"username": "zhangsan",
"email": "zhangsan@example.com",
"age": 25
},
// ... 其他数据
]
}
这种结构被大多数前端表格组件广泛支持,前端可以轻松获取总记录数用于分页计算,并渲染当前页数据。
处理日期格式等特殊类型
使用Jackson时,日期类型默认格式可能不符合需求,可以通过@JsonFormat注解在实体类字段上进行自定义:
public class User {
// ... 其他字段
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
// getter和setter
}
或者在Spring配置中全局配置日期格式:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg index="0" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
在SSM框架中返回JSON数据以供前端表格使用,主要步骤如下:
- 引入依赖:确保项目中包含Jackson(或其他JSON库)依赖。
- 配置Spring MVC:在配置文件中通过
<mvc:annotation-driven>启用



还没有评论,来说两句吧...