Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。

Struts 2 和 Hibernate 是 Java Web 开发领域中两个非常流行的框架。Struts 2 主要负责处理 Web 层的请求,而 Hibernate 则专注于数据持久化。将这两个框架结合起来,可以构建出高效且易于维护的企业级应用。本文将通过一个具体的示例来展示如何在 Struts 2 中整合 Hibernate,以实现基本的 CRUD(创建、读取、更新、删除)操作。

首先,创建一个新的 Maven 项目,并添加 Struts 2 和 Hibernate 的依赖。在 pom.xml 文件中加入以下依赖:

<dependencies>
    <!-- Struts 2 Core -->
    <dependency>
        <groupId>org.apache.struts</groupId>
        <artifactId>struts2-core</artifactId>
        <version>2.6.11</version>
    </dependency>

    <!-- Hibernate Core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.21.Final</version>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>

    <!-- Other dependencies -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

接下来,配置 Hibernate。在 src/main/resources 目录下创建 hibernate.cfg.xml 文件,配置数据库连接信息和其他设置。

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/struts_hibernate_crud?useSSL=false&amp;serverTimezone=UTC</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">password</property>

        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>

        <mapping class="com.example.model.User"/>
    </session-factory>
</hibernate-configuration>

定义一个简单的实体类 User,并为其创建 Hibernate 映射文件 User.hbm.xml

package com.example.model;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "users")
public class User {
   
    private Long id;
    private String name;
    private String email;

    @Id
    public Long getId() {
   
        return id;
    }

    public void setId(Long id) {
   
        this.id = id;
    }

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public String getEmail() {
   
        return email;
    }

    public void setEmail(String email) {
   
        this.email = email;
    }
}

对应的映射文件如下:

<hibernate-mapping>
    <class name="com.example.model.User" table="users">
        <id name="id" column="id">
            <generator class="increment"/>
        </id>
        <property name="name" column="name"/>
        <property name="email" column="email"/>
    </class>
</hibernate-mapping>

现在,创建一个 DAO 接口和实现类来处理数据库操作。

package com.example.dao;

import com.example.model.User;
import java.util.List;

public interface UserDao {
   
    void save(User user);
    User findById(Long id);
    List<User> findAll();
    void update(User user);
    void delete(Long id);
}
package com.example.dao.impl;

import com.example.dao.UserDao;
import com.example.model.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.List;

@Repository
public class UserDaoImpl implements UserDao {
   

    @Autowired
    private EntityManager entityManager;

    @Override
    public void save(User user) {
   
        entityManager.persist(user);
    }

    @Override
    public User findById(Long id) {
   
        return entityManager.find(User.class, id);
    }

    @Override
    public List<User> findAll() {
   
        return entityManager.createQuery("from User", User.class).getResultList();
    }

    @Override
    public void update(User user) {
   
        entityManager.merge(user);
    }

    @Override
    public void delete(Long id) {
   
        User user = findById(id);
        if (user != null) {
   
            entityManager.remove(user);
        }
    }
}

接下来,创建一个 Struts 2 的 Action 类来处理用户的请求。这里使用 Spring 来注入 DAO 实例。

package com.example.action;

import com.example.dao.UserDao;
import com.example.model.User;
import org.apache.struts2.convention.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Namespace("/")
@ParentPackage("struts-default")
@Result(path = "/WEB-INF/jsp/user.jsp", name = "success")

public class UserAction {
   

    @Autowired
    private UserDao userDao;

    private User user;
    private List<User> users;

    public String execute() {
   
        users = userDao.findAll();
        return SUCCESS;
    }

    public String create() {
   
        userDao.save(user);
        return "success";
    }

    public String edit() {
   
        user = userDao.findById(user.getId());
        return "edit";
    }

    public String update() {
   
        userDao.update(user);
        return "success";
    }

    public String delete() {
   
        userDao.delete(user.getId());
        return "success";
    }

    // Getters and setters
    public User getUser() {
   
        return user;
    }

    public void setUser(User user) {
   
        this.user = user;
    }

    public List<User> getUsers() {
   
        return users;
    }

    public void setUsers(List<User> users) {
   
        this.users = users;
    }
}

最后,配置 Struts 2 的 struts.xml 文件,定义 Action 和视图路径。

<package name="default" namespace="/" extends="struts-default">
    <action name="user" class="com.example.action.UserAction">
        <result name="success">/WEB-INF/jsp/user.jsp</result>
    </action>

    <action name="user_create" class="com.example.action.UserAction">
        <result name="success">/WEB-INF/jsp/user.jsp</result>
    </action>

    <action name="user_edit" class="com.example.action.UserAction">
        <result name="edit">/WEB-INF/jsp/edit_user.jsp</result>
    </action>

    <action name="user_update" class="com.example.action.UserAction">
        <result name="success">/WEB-INF/jsp/user.jsp</result>
    </action>

    <action name="user_delete" class="com.example.action.UserAction">
        <result name="success">/WEB-INF/jsp/user.jsp</result>
    </action>
</package>

user.jsp 页面中展示用户列表,并提供链接来编辑或删除用户。

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>User Management</title>
</head>
<body>
    <h1>User List</h1>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Email</th>
            <th>Action</th>
        </tr>
        <c:forEach var="user" items="${users}">
            <tr>
                <td>${user.id}</td>
                <td>${user.name}</td>
                <td>${user.email}</td>
                <td>
                    <a href="<c:url value='/user_edit.action'/>?id=${user.id}">Edit</a>
                    <a href="<c:url value='/user_delete.action'/>?id=${user.id}">Delete</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    <form action="<c:url value='/user_create.action'/>" method="post">
        <input type="text" name="user.name" placeholder="Enter Name" required>
        <input type="text" name="user.email" placeholder="Enter Email" required>
        <input type="submit" value="Create">
    </form>
</body>
</html>

edit_user.jsp 页面中提供表单来修改用户信息。

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <title>Edit User</title>
</head>
<body>
    <h1>Edit User</h1>
    <form action="<c:url value='/user_update.action'/>" method="post">
        <input type="hidden" name="user.id" value="${user.id}">
        <label for="name">Name:</label>
        <input type="text" name="user.name" value="${user.name}" required>
        <br/>
        <label for="email">Email:</label>
        <input type="text" name="user.email" value="${user.email}" required>
        <br/>
        <input type="submit" value="Update">
    </form>
</body>
</html>

通过上述步骤,你已经成功地在 Struts 2 中集成了 Hibernate,并实现了基本的 CRUD 操作。这个示例不仅展示了如何配置和使用这两个框架,还介绍了如何通过 DAO 层分离业务逻辑和数据访问逻辑,使得代码更加模块化和可维护。掌握了这些知识后,你可以进一步探索 Struts 2 和 Hibernate 的高级功能,以满足更复杂的应用需求。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
22 0
|
5天前
|
运维 负载均衡 安全
深度解析:Python Web前后端分离架构中WebSocket的选型与实现策略
深度解析:Python Web前后端分离架构中WebSocket的选型与实现策略
27 0
|
18天前
|
算法 API Apache
Flink CDC:新一代实时数据集成框架
本文源自阿里云实时计算团队 Apache Flink Committer 任庆盛在 Apache Asia CommunityOverCode 2024 的分享,涵盖 Flink CDC 的概念、版本历程、内部实现及社区未来规划。Flink CDC 是一种基于数据库日志的 CDC 技术实现的数据集成框架,能高效完成全量和增量数据的实时同步。自 2020 年以来,Flink CDC 经过多次迭代,已成为功能强大的实时数据集成工具,支持多种数据库和数据湖仓系统。未来将进一步扩展生态并提升稳定性。
362 1
Flink CDC:新一代实时数据集成框架
|
1天前
|
Web App开发 XML JavaScript
Python 操作浏览器:让 Python 和 Web 世界合二为一
Python 操作浏览器:让 Python 和 Web 世界合二为一
10 3
|
1天前
|
存储 SQL 数据库
使用Python和Flask框架创建Web应用
【10月更文挑战第3天】使用Python和Flask框架创建Web应用
12 1
|
2天前
|
数据库 开发者 Python
使用Python和Flask构建Web应用
【10月更文挑战第2天】使用Python和Flask构建Web应用
8 1
|
4天前
|
前端开发 JavaScript API
惊呆了!学会AJAX与Fetch API,你的Python Web项目瞬间高大上!
在Web开发领域,AJAX与Fetch API是提升交互体验的关键技术。AJAX(Asynchronous JavaScript and XML)作为异步通信的先驱,通过XMLHttpRequest对象实现了局部页面更新,提升了应用流畅度。Fetch API则以更现代、简洁的方式处理HTTP请求,基于Promises提供了丰富的功能。当与Python Web框架(如Django、Flask)结合时,这两者能显著增强应用的响应速度和用户体验,使项目更加高效、高大上。
18 2
|
5天前
|
API 数据库 开发者
Flask:Python的轻量级Web框架
Flask:Python的轻量级Web框架
14 2
|
6天前
|
前端开发 API 开发者
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
从零到精通,AJAX与Fetch API让你的Python Web前后端交互无所不能!
18 3
|
5天前
|
存储 C语言 索引
Python 语法及入门 (超全超详细) 专为Python零基础 一篇博客让你完全掌握Python语法
本文全面介绍了Python的基础知识,包括Python的诞生背景、为什么学习Python、Python的应用场景、Python环境的安装、Python的基础语法、数据类型、控制流、函数以及数据容器的使用方法,旨在为Python零基础读者提供一篇全面掌握Python语法的博客。
12 0
Python 语法及入门 (超全超详细) 专为Python零基础 一篇博客让你完全掌握Python语法