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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【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
相关文章
|
3天前
|
Python
使用Python和Flask构建简单的Web应用
使用Python和Flask构建简单的Web应用
16 6
|
3天前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
20 6
|
4天前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
14 5
|
6天前
|
安全 Python
使用Python实现简单的Web服务器
使用Python实现简单的Web服务器
18 6
|
15天前
|
Web App开发 数据采集 iOS开发
「Python+Dash快速web应用开发」
这是「Python+Dash快速web应用开发」系列教程的第十六期,本期将介绍如何在Dash应用中实现多页面路由功能。通过使用`Location()`组件监听URL变化,并结合回调函数动态渲染不同页面内容,使应用更加模块化和易用。教程包括基础用法、页面重定向及无缝跳转等技巧,并通过实例演示如何构建个人博客网站。
23 2
|
16天前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
35 1
|
2天前
|
jenkins 测试技术 持续交付
自动化测试的高效之路:如何利用Python进行Web应用测试
【9月更文挑战第13天】在软件开发的快节奏中,自动化测试是确保质量和效率的关键。本文将引导你了解如何使用Python语言及其强大的测试框架来提升Web应用的测试效率。我们将一起探索编写简洁而强大的测试脚本的技巧,以及如何通过持续集成(CI)实现自动化测试流程。准备好让你的测试工作飞一般的感觉!
WK
|
12天前
|
数据采集 API 开发者
很少有人用python开发web???
Python 是一种流行且广泛使用的编程语言,尤其在 Web 开发领域。它凭借简洁的语法、丰富的框架(如 Django 和 Flask)、强大的库支持及活跃的社区,成为许多开发者和企业的首选。Python 的易学性、高效性及广泛的应用场景(包括 Web API、微服务和数据分析等)使其在 Web 开发中占据重要地位,并将持续发挥更大作用。
WK
34 0
|
16天前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
25 0
|
16天前
|
测试技术 持续交付 开发者
Xamarin 高效移动应用测试最佳实践大揭秘,从框架选择到持续集成,让你的应用质量无敌!
【8月更文挑战第31天】竞争激烈的移动应用市场,Xamarin 作为一款优秀的跨平台开发工具,提供了包括单元测试、集成测试及 UI 测试在内的全面测试方案。借助 Xamarin.UITest 框架,开发者能便捷地用 C# 编写测试案例,如登录功能测试;通过 Xamarin 模拟框架,则可在无需真实设备的情况下模拟各种环境测试应用表现;Xamarin.TestCloud 则支持在真实设备上执行自动化测试,确保应用兼容性。结合持续集成与部署策略,进一步提升测试效率与应用质量。掌握 Xamarin 的测试最佳实践,对确保应用稳定性和优化用户体验至关重要。
28 0