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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
简介: 【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 的高级功能,以满足更复杂的应用需求。

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
10月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
512 1
|
10月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
11月前
|
移动开发 Java 测试技术
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
本文详细介绍了鸿蒙系统(HarmonyOS)与mPaaS框架的集成方法。鸿蒙系统作为华为开发的分布式操作系统,具备分布式架构、微内核设计等特性;mPaaS是蚂蚁金服推出的移动开发平台,提供金融级组件和全生命周期管理能力。文章从环境准备、核心功能集成(如初始化、用户认证、支付功能)、适配问题解决到调试测试及最佳实践,全方位指导开发者高效集成两者。通过遵循指南,可充分利用鸿蒙的特性和mPaaS的金融能力,构建高性能、高安全性的应用,同时避免常见兼容性问题,缩短开发周期。
581 0
|
12月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
605 14
|
机器学习/深度学习 开发框架 API
Python 高级编程与实战:深入理解 Web 开发与 API 设计
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化、调试技巧以及数据科学和机器学习。本文将深入探讨 Python 在 Web 开发和 API 设计中的应用,并通过实战项目帮助你掌握这些技术。
|
数据采集 Web App开发 存储
打造高效的Web Scraper:Python与Selenium的完美结合
本文介绍如何使用Python结合Selenium,通过代理IP、设置Cookie和User-Agent抓取BOSS直聘的招聘信息,包括公司名称、岗位、要求和薪资。这些数据可用于行业趋势、人才需求、企业动态及区域经济分析,为求职者、企业和分析师提供宝贵信息。文中详细说明了环境准备、代理配置、登录操作及数据抓取步骤,并提醒注意反爬虫机制和验证码处理等问题。
461 1
打造高效的Web Scraper:Python与Selenium的完美结合
|
JSON 安全 中间件
Python Web 框架 FastAPI
FastAPI 是一个现代的 Python Web 框架,专为快速构建 API 和在线应用而设计。它凭借速度、简单性和开发人员友好的特性迅速走红。FastAPI 支持自动文档生成、类型提示、数据验证、异步操作和依赖注入等功能,极大提升了开发效率并减少了错误。安装简单,使用 pip 安装 FastAPI 和 uvicorn 即可开始开发。其优点包括高性能、自动数据验证和身份验证支持,但也存在学习曲线和社区资源相对较少的缺点。
636 15
|
人工智能 达摩院 并行计算
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
VideoRefer 是浙江大学与阿里达摩学院联合推出的视频对象感知与推理技术,支持细粒度视频对象理解、复杂关系分析及多模态交互,适用于视频剪辑、教育、安防等多个领域。
748 17
VideoRefer:阿里达摩院开源视频对象感知与推理框架,可集成 VLLM 提升其空间和时间理解能力
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
694 4
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
481 2

推荐镜像

更多