Struts2 整合 JSON 与数据库:数据交互实践指南**
在 Java Web 开发中,Struts2 作为一个成熟的 MVC 框架,经常需要与数据库进行交互,并将数据以 JSON 格式返回给前端,以实现前后端分离或 AJAX 异步数据请求,本文将详细介绍如何在 Struts2 框架中实现从数据库查询数据,并将其转换为 JSON 格式响应给客户端的完整流程。
核心概念与环境准备
- Struts2:作为控制器,负责接收请求、调用业务逻辑、处理数据并返回响应。
- JSON (JavaScript Object Notation):一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成,前端 JavaScript 可以方便地解析 JSON 数据。
- 数据库:存储数据的地方,如 MySQL, Oracle, SQL Server 等,我们使用 JDBC 或 ORM 框架(如 Hibernate, MyBatis)与之交互。
- JSON 库:Struts2 本身不直接处理 JSON 转换,需要借助第三方库,常用的有:
- Jackson:高性能的 JSON 处理库,Spring 框架默认集成。
- Gson:Google 出品,简单易用。
- Fastjson:阿里巴巴出品,性能优异,但需注意其安全性。
环境准备:
- JDK 1.8+
- Struts2 框架核心包及相关依赖(如 struts2-core, struts2-json-plugin)
- 数据库驱动(如 MySQL Connector/J)
- JSON 处理库(如 Jackson 或 Gson)
- Servlet 容器(如 Tomcat)
- 开发工具(如 IntelliJ IDEA, Eclipse)
关键步骤实现
配置 Struts2 环境
- 引入 Struts2 核心 jar 包。
- 配置
web.xml,添加 Struts2 的 FilterDispatcher(对于 Struts2 2.5+,通常是struts2的 Filter)。<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> - 配置
struts.xml文件,可以设置包、默认视图、常量等。
引入 JSON 插件与库
为了方便地在 Struts2 中处理 JSON,推荐使用 struts2-json-plugin 插件,这个插件简化了将 Action 结果转换为 JSON 的过程。
- 下载
struts2-json-plugin-x.x.x.jar(版本号最好与 Struts2 核心版本匹配),并将其添加到项目的WEB-INF/lib目录下。 - 如果使用 Jackson,
struts2-json-plugin会依赖它,但有时需要显式添加jackson-core-asl-x.x.x.jar和jackson-mapper-asl-x.x.x.jar(或新版jackson-databind等),如果使用 Gson,则需要添加gson-x.x.x.jar。
创建数据库连接与数据访问层 (DAO)
-
准备数据库:创建测试表并插入一些数据。
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `users` (`username`, `email`) VALUES ('user1', 'user1@example.com'); INSERT INTO `users` (`username`, `email`) VALUES ('user2', 'user2@example.com'); -
创建实体类 (Model):与数据库表对应的 Java 类。
public class User { private int id; private String username; private String email; // 构造方法、getters 和 setters // toString() 方法 } -
创建 DAO 接口与实现:负责与数据库交互,执行 CRUD 操作。
public interface UserDao { List<User> getAllUsers(); } public class UserDaoImpl implements UserDao { @Override public List<User> getAllUsers() { List<User> users = new ArrayList<>(); Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // 1. 获取数据库连接 (使用连接池更佳) conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_db", "username", "password"); // 2. 创建 SQL 查询 String sql = "SELECT id, username, email FROM users"; stmt = conn.prepareStatement(sql); // 3. 执行查询 rs = stmt.executeQuery(); // 4. 处理结果集 while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setEmail(rs.getString("email")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } finally { // 5. 关闭资源 // ... 关闭 rs, stmt, conn } return users; } }提示:实际项目中推荐使用连接池(如 Druid, C3P0)和 ORM 框架(如 MyBatis, Hibernate)来简化数据库操作。
创建 Action 并处理 JSON 响应
-
创建 Action 类:该 Action 将负责调用 DAO 获取数据,并通过
struts2-json-plugin将数据转换为 JSON。import com.opensymphony.xwork2.ActionSupport; import java.util.List; public class UserJsonAction extends ActionSupport { private List<User> users; private String status = "success"; private String message = "Users retrieved successfully"; // 这个方法会被 struts2-json-plugin 自动调用,作为要序列化到 JSON 的数据源 public List<User> getUsers() { return users; } // Action 的业务逻辑方法 public String execute() { UserDao userDao = new UserDaoImpl(); try { users = userDao.getAllUsers(); } catch (Exception e) { status = "error"; message = "Failed to retrieve users: " + e.getMessage(); e.printStackTrace(); } // 返回 SUCCESS,struts2-json-plugin 会将其转换为 JSON return SUCCESS; } // 可选:getter 和 setter for status 和 message,如果也需要包含在 JSON 中 public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }UserJsonAction继承ActionSupport。- 定义了
users属性来存储从数据库查询出的用户列表。 execute()方法中调用 DAO 获取数据。- 提供
getUsers()方法,因为struts2-json-plugin默认会 Action 中所有 getter 方法的值序列化为 JSON,你也可以通过@JSON注解或配置指定需要序列化的属性。
配置 struts.xml 以支持 JSON 响应
在 struts.xml 中配置 Action,并指定 result 的 type 为 json。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 开发模式下,建议开启,方便调试 -->
<constant name="struts.devMode" value="true" />
<package name="userJson" namespace="/api" extends="json-default">
<!-- 继承 json-default 包,它包含了处理 JSON 结果类型的拦截器 -->
<action name="users" class="com.example.action.UserJsonAction">
<result type="json">
<!-- 可选配置 -->
<!-- 指定要转换为 JSON 的属性,如果不配置,默认会转换所有非空 getter 返回值 -->
<param name="root">users</param> <!-- 这里 root 指的是 getUsers() 返回的值 -->
<!-- 或者如果你想包含多个属性,可以这样(但通常 root 指向主要数据列表) -->
<!-- <param name="includeProperties">users,status,message</param> -->
<!-- 排除某些属性 -->
<!-- <param name="excludeProperties">users.password</param> -->
<!--


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