Struts 框架中返回数据库数据的详细实现方法
在基于 Java 的 Web 开发中,Struts 框架(包括 Struts 1 和 Struts 2)是常用的 MVC(Model-View-Controller)架构实现工具,它通过 Action 类处理用户请求,并与数据库进行交互,最终将数据返回给前端视图展示,以下是关于如何在 Struts 中从数据库获取数据并返回的详细步骤和示例。
环境准备
-
技术栈:
- Java SDK(JDK 8 或以上)
- Struts 2 框架
- 数据库(如 MySQL)
- IDE(如 IntelliJ IDEA 或 Eclipse)
- 构建工具(Maven 或 Gradle)
-
依赖配置:
-
在
pom.xml
(Maven)中添加以下依赖:<dependencies> <!-Struts 2 核心依赖 --> <dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-core</artifactId> <version>2.5.26</version> </dependency> <!-数据库驱动(以 MySQL 为例) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.34</version> </dependency> <!-Hibernate(可选,用于 ORM) --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency> <!-日志框架 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies>
-
数据库设计
假设我们有一个名为 users
的表,结构如下:
字段名 | 类型 | 描述 |
---|---|---|
id | INT(11) | 主键,自增 |
username | VARCHAR(50) | 用户名 |
VARCHAR(100) | 邮箱地址 | |
created_at | DATETIME | 创建时间 |
Struts 2 中访问数据库的步骤
配置数据库连接池
使用 db.properties
文件存储数据库连接信息:
# db.properties db.driver=com.mysql.cj.jdbc.Driver db.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC db.username=root db.password=yourpassword
在 src/main/resources
目录下创建该文件,并在 Struts 配置文件中加载:
<!-struts.xml --> <constant name="struts.custom.i18n.resources" value="ApplicationResources" />
创建数据访问对象(DAO)
使用 DAO 模式封装数据库操作:
// UserDao.java package com.example.dao; import com.example.model.User; import java.sql.; import java.util.ArrayList; import java.util.List; import org.apache.commons.dbcp2.BasicDataSource; public class UserDao { private static BasicDataSource dataSource; static { // 初始化数据库连接池 dataSource = new BasicDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"); dataSource.setUsername("root"); dataSource.setPassword("yourpassword"); } // 获取所有用户 public List<User> getAllUsers() throws SQLException { List<User> users = new ArrayList<>(); String sql = "SELECT id, username, email, created_at FROM users"; try (Connection conn = dataSource.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUsername(rs.getString("username")); user.setEmail(rs.getString("email")); user.setCreatedAt(rs.getTimestamp("created_at").toLocalDateTime()); users.add(user); } } return users; } }
创建模型类
// User.java package com.example.model; import java.time.LocalDateTime; public class User { private int id; private String username; private String email; private LocalDateTime createdAt; // Getters and Setters public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public LocalDateTime getCreatedAt() { return createdAt; } public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } }
Struts 2 Action 类实现
创建 Action 类
// UserAction.java package com.example.action; import com.example.dao.UserDao; import com.example.model.User; import java.sql.SQLException; import java.util.List; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private List<User> users; // 用于存储查询结果并返回给前端 // Getter and Setter for users public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } // 执行查询操作的 Action 方法 public String listUsers() { UserDao userDao = new UserDao(); try { users = userDao.getAllUsers(); // 调用 DAO 方法获取数据 } catch (SQLException e) { e.printStackTrace(); addActionError("数据库连接失败!"); return ERROR; } return SUCCESS; // 返回成功状态 } }
配置 Struts.xml
在 struts.xml
中配置 Action:
<!-struts.xml --> <struts> <package name="default" namespace="/" extends="struts-default"> <action name="listUsers" class="com.example.action.UserAction" method="listUsers"> <result name="success">/userList.jsp</result> <result name="error">/error.jsp</result> </action> </package> </struts>
前端视图展示数据(JSP)
创建 userList.jsp
,用于展示查询结果:
<!-userList.jsp --> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="/struts-tags" prefix="s" %> <html> <head>用户列表</title> </head> <body> <h2>用户列表</h2> <table border="1"> <tr> <th>ID</th> <th>用户名</th> <th>邮箱</th> <th>创建时间</th> </tr> <s:iterator value="users" var="user"> <tr> <td><s:property value="#user.id"/></td> <td><s:property value="#user.username"/></td> <td><s:property value="#user.email"/></td> <td><s:property value="#user.createdAt"/></td> </tr> </s:iterator> </table> </body> </html>
完整流程归纳
- 用户发起请求:访问
http://localhost:8080/yourapp/listUsers.action
。 - Struts 拦截请求:根据
struts.xml
配置,调用UserAction
的listUsers
方法。 - DAO 层查询数据库:
UserDao
通过 JDBC 连接数据库,执行 SQL 查询。 - 返回数据:查询结果封装为
List<User>
,并通过 Setter 注入到 Action 的users
属性。 - 视图渲染:Struts 根据配置的
result
,跳转到userList.jsp
,并通过<s:iterator>
标签遍历数据。 - 页面展示:用户看到格式化后的表格数据。
FAQs(常见问题解答)
问题 1:如何在 Struts 2 中使用 Hibernate 代替 JDBC?
解答:
可以使用 Hibernate 作为 ORM 框架简化数据库操作,步骤如下:
- 配置 Hibernate 的
hibernate.cfg.xml
,包括数据库连接信息和方言。 - 在
UserDao
中使用SessionFactory
获取Session
,并通过 HQL 或 Criteria 查询数据。 - 示例代码:
// UserDao.java(使用 Hibernate) public List<User> getAllUsers() { Session session = HibernateUtil.getSessionFactory().openSession(); try { return session.createQuery("from User", User.class).list(); } finally { session.close(); } }
需注意配置事务管理和 Session 生命周期。
问题 2:如何处理数据库连接泄漏问题?
解答:
- 使用连接池:推荐使用 DBCP、C3P0 等连接池管理工具,避免频繁创建和关闭连接。
- 确保资源关闭:在 JDBC 操作中,使用
try-with-resources
确保Connection
、Statement
、ResultSet
被正确关闭。 - 监控工具:集成监控工具(如 Druid)检测连接池状态和泄漏问题。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/64897.html