SpringMVC--使用RESTFul实现用户管理系统

一、静态页面准备

1. user.css

.header {background-color: #f2f2f2;padding: 20px;text-align: center;
}ul {list-style-type: none;margin: 0;padding: 0;overflow: hidden;background-color: #333;
}li {float: left;
}li a {display: block;color: white;text-align: center;padding: 14px 16px;text-decoration: none;
}li a:hover:not(.active) {background-color: #111;
}.active {background-color: #4CAF50;
}form {width: 50%;margin: 0 auto;padding: 20px;border: 1px solid #ddd;border-radius: 4px;
}label {display: block;margin-bottom: 8px;
}input[type="text"], input[type="email"], select {width: 100%;padding: 6px 10px;margin: 8px 0;box-sizing: border-box;border: 1px solid #555;border-radius: 4px;font-size: 16px;
}button[type="submit"] {padding: 10px;background-color: #4CAF50;color: #fff;border: none;border-radius: 4px;cursor: pointer;
}button[type="submit"]:hover {background-color: #3e8e41;
}table {border-collapse: collapse;width: 100%;
}th, td {border: 1px solid #ddd;padding: 8px;text-align: left;
}th {background-color: #f2f2f2;
}tr:nth-child(even) {background-color: #f2f2f2;
}.header {background-color: #f2f2f2;padding: 20px;text-align: center;
}a {text-decoration: none;color: #333;
}.add-button {margin-bottom: 20px;padding: 10px;background-color: #4CAF50;color: #fff;border: none;border-radius: 4px;cursor: pointer;
}.add-button:hover {background-color: #3e8e41;
}

(2) user_index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户管理系统</title><link rel="stylesheet" href="user.css" type="text/css"></link>
</head>
<body><div class="header"><h1>用户管理系统</h1></div><ul><li><a class="active" href="user_list.html">用户列表</a></li></ul>
</body>
</html>

预期效果:

 

 (3) user_list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>用户列表</title><link rel="stylesheet" href="user.css" type="text/css"></link>
</head>
<body><div class="header"><h1>用户列表</h1></div><div class="add-button-wrapper"><a class="add-button" href="user_add.html">新增用户</a></div><table><thead><tr><th>编号</th><th>用户名</th><th>性别</th><th>邮箱</th><th>操作</th></tr></thead><tbody><tr><td>1</td><td>张三</td><td>男</td><td>zhangsan@powernode.com</td><td>修改删除</td></tr><tr><td>2</td><td>李四</td><td>女</td><td>lisi@powernode.com</td><td>修改删除</td></tr></tbody></table>
</body>
</html>

 预期效果:

 (4) user_add.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>新增用户</title><link rel="stylesheet" href="user.css" type="text/css"></link>
</head>
<body><h1>新增用户</h1><form><label>用户名:</label><input type="text" name="username" required><label>性别:</label><select name="gender" required><option value="">-- 请选择 --</option><option value="1">男</option><option value="0">女</option></select><label>邮箱:</label><input type="email" name="email" required><button type="submit">保存</button></form>
</body>
</html>

预期效果:

(5) user_edit.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>修改用户</title><link rel="stylesheet" href="user.css" type="text/css"></link>
</head>
<body><h1>修改用户</h1><form><label>用户名:</label><input type="text" name="username" value="张三" required><label>性别:</label><select name="gender" required><option value="">-- 请选择 --</option><option value="1" selected>男</option><option value="0">女</option></select><label>邮箱:</label><input type="email" name="email" value="zhangsan@powernode.com" required><button type="submit">修改</button></form>
</body>
</html>

 预期效果:

二、SpringMVC环境搭建

1. 创建module:usermgt

2. 添加pom.xml的依赖(打包方式不要忘记改):spring-webmvc、jakarta.servlet-api、logback-classic、thymeleaf-spring6

3. 创建webapp目录,添加web支持。

4. 配置web.xml文件:字符编码过滤器、HTTP请求方式过滤器、前端控制器

注意:先配置字符编码过滤器,再配置HTTP请求方式过滤器,不然解决不了乱码问题。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"version="6.0"><!--字符编码过滤器--><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceRequestEncoding</param-name><param-value>true</param-value></init-param><init-param><param-name>forceResponseEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--HTTP请求方式过滤器--><filter><filter-name>hiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>hiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--前端控制器--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

 5. 配置springmvc.xml文件:组件扫描、视图解析器、开启注解、开启默认Servlet

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--组件扫描--><context:component-scan base-package="com.powernode.usermgt.controller,com.powernode.usermgt.dao"/><!--视图解析器--><bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver"><property name="characterEncoding" value="UTF-8"/><property name="order" value="1"/><property name="templateEngine"><bean class="org.thymeleaf.spring6.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver"><property name="prefix" value="/WEB-INF/thymeleaf/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML"/><property name="characterEncoding" value="UTF-8"/></bean></property></bean></property></bean><!--开启注解--><mvc:annotation-driven/><!--开启默认Servlet--><mvc:default-servlet-handler/></beans>

三、显示首页

在应用的根下新建目录:static,将user.css文件拷贝进去。将user_index.html拷贝到WEB-INF/thymeleaf目录下。

需要给user_index.html中的代码加一下:xmlns:th="http://www.thymeleaf.org"

在spring.xml文件中配置视图控制器映射:

<!--视图控制器映射-->
<mvc:view-controller path="/" view-name="user_index"/>

测试效果图

四、实现用户列表

将user_list.html拷贝到WEB-INF/thymeleaf目录下。

1. 修改user_index.html中的相关代码

2. 写Controller程序

package com.powernode.usermgt.controller;import com.powernode.usermgt.bean.User;
import com.powernode.usermgt.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;import java.util.List;@Controller
public class UserController {@Autowiredprivate UserDao userDao;@GetMapping("/user")public String list(Model model){// 获取所有的用户List<User> users = userDao.selectAll();// 存储到request域model.addAttribute("users", users);// 跳转视图return "user_list";}
}

 3. 编写User类和UserDao类

User类

package com.powernode.usermgt.bean;public class User {private Long id;private String name;private String email;private Integer gender;public User() {}public User(Long id, String name, String email, Integer gender) {this.id = id;this.name = name;this.email = email;this.gender = gender;}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;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +", gender=" + gender +'}';}
}

UserDao类

package com.powernode.usermgt.dao;import com.powernode.usermgt.bean.User;
import org.springframework.stereotype.Repository;import java.util.ArrayList;
import java.util.List;@Repository
public class UserDao {private static List<User> users = new ArrayList<>();static {User user1 = new User(10001L, "张三", "zhangsan@powernode.com", 1);User user2 = new User(10002L, "李四", "lisi@powernode.com", 1);User user3 = new User(10003L, "王五", "wangwu@powernode.com", 1);User user4 = new User(10004L, "赵六", "zhaoliu@powernode.com", 0);User user5 = new User(10005L, "钱七", "qianqi@powernode.com", 0);users.add(user1);users.add(user2);users.add(user3);users.add(user4);users.add(user5);}public List<User> selectAll(){return users;}
}

4. 修改user_list.html文件

 

 预期效果:

五、实现新增功能

1. 跳转新增页面

(1)在user_list.html中改关于新增用户有关的代码

(2)将user_add.html拷贝到thymeleaf目录下,并进行代码修改:

 

(3)在springmvc.xml文件中配置视图控制器映射:(由于没有数据的交互,因此不需要单独在控制器写一个方法,直接依赖<mvc:annotation-driven/>注解的配置代码)

<mvc:view-controller path="/toSave" view-name="user_add"/>

预期效果:

此时,只是跳转了新增页面,点击“保存”会出现404错误。当点击保存时,就产生了数据的交互,此时需要写一个控制器函数实现。 

2. 点击“保存”之后,实现新增功能

(1)前端页面发送POST请求,提交表单,修改user_add.html代码如下:

(2)编写控制器UserController

@PostMapping("/user")
public String save(User user){// 保存用户userDao.save(user);// 重定向到列表return "redirect:/user";
}

 注意:保存后,采用重定向的方式跳转到用户列表。

(3)将UserDao中的save方法补全

public static Long generateId(){// Stream APILong maxId = users.stream().map(user -> user.getId()).reduce((id1, id2) -> id1 > id2 ? id1 : id2).get();return maxId + 1;
}public void save(User user){// 设置iduser.setId(generateId());// 保存users.add(user);
}

StreamAPI 是java8的新特性。

预期效果:

六、实现修改功能

1. 跳转修改页面

(1)修改user_list.html

<a th:href="@{'/user/' + ${user.id}}">修改</a>

(2) 编写Controller

@GetMapping("/user/{id}")
public String toUpdate(@PathVariable("id") Long id, Model model){// 根据id查询用户信息User user = userDao.selectById(id);// 将对象存储到request域model.addAttribute("user", user);// 跳转视图return "user_edit";
}

(3)在UserDao中补全selectById这个方法

public User selectById(Long id){return users.stream().filter(user -> user.getId().equals(id)).findFirst().get();
}

(4)将user_edit.html拷贝thymeleaf目录下,并修改代码:

 预期效果:

2. 点击“修改”,实现修改功能

(1)将user_edit.html页面中的form表单修改一下,添加action,添加method,隐藏于的方式提交请求方式put,隐藏域的方式提交id:

 (2)编写Controller

@PutMapping("/user")
public String modify(User user){// 更新数据userDao.update(user);// 重定向return "redirect:/user";
}

(3)编写UserDao

public void update(User user){for (int i = 0; i < users.size(); i++) {if(user.getId().equals(users.get(i).getId())){users.set(i, user);break;}}
}

预期效果:

 

七、实现删除功能

1. 在user_list.html页面添加form表单,并且点击超链接时,应该提交表单,代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用户列表</title><link rel="stylesheet" th:href="@{/static/user.css}" type="text/css"></link>
</head>
<body><div class="header"><h1>用户列表</h1></div><div class="add-button-wrapper"><a class="add-button" th:href="@{/toSave}">新增用户</a></div><table><thead><tr><th>编号</th><th>用户名</th><th>性别</th><th>邮箱</th><th>操作</th></tr></thead><tbody><tr th:each="user : ${users}"><td th:text="${user.id}"></td><td th:text="${user.name}"></td><td th:text="${user.gender == 1 ? '男' : '女'}"></td><td th:text="${user.email}"></td><td><a th:href="@{'/user/' + ${user.id}}">修改</a><!--为删除提供一个鼠标单击事件--><a th:href="@{'/user/' + ${user.id}}" onclick="del(event)">删除</a></td></tr></tbody></table><!--为删除操作准备一个form表单,点击删除时提交form表单--><div style="display: none"><form method="post" id="delForm"><input type="hidden" name="_method" value="delete"/></form></div><script>function del(event){// 获取表单let delForm = document.getElementById("delForm");// 设置表单actiondelForm.action = event.target.href;if(window.confirm("您确定要删除吗?")){// 提交表单delForm.submit();}// 阻止超链接默认行为event.preventDefault();}</script>
</body>
</html>

2. 编写Controller

@DeleteMapping("/user/{id}")
public String del(@PathVariable("id") Long id){// 删除userDao.deleteById(id);// 重定向return "redirect:/user";
}

3. 编写UserDao

public void deleteById(Long id){for (int i = 0; i < users.size(); i++) {if(id.equals(users.get(i).getId())){users.remove(i);break;}}
}

预期效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89374.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hello算法_C++_ 最差、最佳、平均时间复杂度

算法的时间效率往往不是固定的&#xff0c;而是与输入数据的分布有关。假设输入一个长度为 的数组 nums &#xff0c;其中 nums 由从 1 至 n 的数字组成&#xff0c;每个数字只出现一次&#xff1b;但元素顺序是随机打乱的&#xff0c;任务目标是返回元素 的索引。我们可以…

2024考研数一真题及答案

历年数一真题及答案下载直通车 已知函数 f ( x ) ∫ 0 x e cos ⁡ t d t f(x) \int_0^x e^{\cos t} dt f(x)∫0x​ecostdt&#xff0c; g ( x ) ∫ 0 sin ⁡ x e t 2 d t g(x) \int_0^{\sin x} e^{t^2} dt g(x)∫0sinx​et2dt&#xff0c;则&#xff08; &#xff09;。 A…

MIT 6.824学习心得(2) 浅谈多线程和RPC

上篇文章中我们简单介绍了分布式系统的设计思想以及简单性质&#xff0c;之后用一定篇幅简要介绍了MapReduce这个经典的分布式计算框架的大致工作原理&#xff0c;相信朋友们已经对此有了最基本的理解。在现实场景中&#xff0c;分布式系统的设计初衷是为了解决并发问题&#x…

opensuse/debian grub启动界面太模糊?

现代操作系统或者新电脑使用那么模糊的界面启动&#xff0c;虽然没有什么不良反应&#xff0c;但是多少有点看不过去&#xff0c;这是因为为了保证正常启动做出的适配。而我们可以对其分辨率进行选定。 1 您好&#xff0c;非常感谢您提供的截图。这张图片非常关键&#xff0c…

zookeeper Curator(5):集群架构和集群搭建

文章目录 一、集群架构&#xff1a;Leader-Follower 模式二、核心机制&#xff1a;ZAB 协议三、Leader 选举机制四、集群部署要点五、优势与挑战 Zookeeper 集群是一个由多个 Zookeeper 服务实例组成的分布式协调服务系统&#xff0c; 通过奇数个节点&#xff08;通常 3、5、7…

道可云人工智能每日资讯|浦东启动人工智能创新应用竞赛

道可云人工智能&元宇宙每日简报&#xff08;2025年7月1日&#xff09;讯&#xff0c;今日人工智能&元宇宙新鲜事有&#xff1a; 江城模境工信部人工智能大模型公共服务平台&#xff08;武汉&#xff09;上线运行 2025年6月27日&#xff0c;光谷人工智能创新大会在湖北…

Python元组的遍历

一、前言 在 Python 中&#xff0c;元组&#xff08;tuple&#xff09; 是一种非常基础且常用的数据结构&#xff0c;它与列表类似&#xff0c;都是有序的序列&#xff0c;但不同的是&#xff0c;元组是不可变的&#xff08;immutable&#xff09;&#xff0c;一旦创建就不能修…

矩阵的条件数(Condition Number of a Matrix)

文章目录 矩阵的条件数&#xff08;Condition Number of a Matrix&#xff09;&#x1f4cc; 定义&#x1f9ee; 常见形式&#xff1a;2-范数下的条件数&#x1f50d; 条件数的意义&#x1f9e0; 实际意义举例&#x1f4bb; Python 示例&#xff08;NumPy&#xff09;&#x1f…

1 Studying《Computer Architecture A Quantitative Approach》1-4

目录 Preface 1 Fundamentals of Quantitative Design and Analysis 1.1 Introduction 1.2 Classes of Computers 1.3 Defining Computer Architecture 1.4 Trends in Technology 1.5 Trends in Power and Energy in Integrated Circuits 1.6 Trends in Cost 1.7 Depe…

Reactor Hot Versus Cold

这段文字详细解释了 Reactor 中 热发布者&#xff08;Hot Publisher&#xff09; 和 冷发布者&#xff08;Cold Publisher&#xff09; 的区别&#xff0c;并通过示例展示了它们的行为差异。以下是对其含义的总结和解释&#xff1a; 1. 冷发布者&#xff08;Cold Publisher&…

OpenCV CUDA模块设备层-----逐通道最小值比较函数min()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的CUDA并行计算模块&#xff08;cv::cudev&#xff09;中的一个设备端内联函数&#xff0c;用于在CUDA核函数中对两个uchar2类型像素值进…

proteus实现stm32按键控制LED灯流水灯方向

一、新建工程 1、工程命名 2、选择工程存储位置 3、默认下一步 4、默认下一步 5、选择没有固件项目&#xff0c;下一步 二、器件放置并连线 1、点击左边工具栏中运放的形状的符号 2、再点击‘P’&#xff0c;搜索器件 3、搜索器件并放置连线 按键控制LED需要的器件有&#…

华为云Flexus+DeepSeek征文 | 让运维更智能:Chaterm AI终端工具与华为云ModelArts Studio深度集成指南

华为云FlexusDeepSeek征文 | 让运维更智能&#xff1a;Chaterm AI终端工具与华为云ModelArts Studio深度集成指南 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、Chaterm介绍Chaterm简介Chaterm主要特点 三、安装Chaterm工具下载C…

湖北理元理律师事务所债务解法:从法律技术到生活重建

数据透视&#xff1a; 2023年武汉法院受理债务纠纷案11.4万件&#xff0c;其中37%因不当还款规划导致债务雪球效应。 一、债务危机的法律归因 通过分析1200例债务咨询案例&#xff0c;发现三大共性法律认知盲区&#xff1a; 担保责任误判 某企业主为朋友担保200万&#xff0…

小程序学习笔记:加载效果、上拉加载与节流处理

在微信小程序开发过程中&#xff0c;优化用户体验是非常重要的一环。今天我们就来分享如何在小程序中实现加载提示效果、上拉触底加载下一页数据以及对上拉触底事件进行节流处理&#xff0c;让你的小程序更加流畅和高效。 一、添加 loading 提示效果 在小程序中&#xff0c;当…

计算机网络:【socket】【UDP】【地址转换函数】【TCP】

一.socket 1.1socket接口 它返回的是一个文件描述符。创建socket文件描述符(TCP/UDP,客户端服务器) • socket()打开一个网络通讯端口,如果成功的话,就像 open()一样返回一个文件描 述符; • 应用程序可以像读写文件一样用 read/write 在网络上收发数据; • 如果 socket()调用…

机器人轨迹跟踪控制与动力学模型详解

1. 机器人控制的本质&#xff1a;通过关节扭矩执行轨迹 机器人控制的核心目标是让机器人关节精确跟踪期望轨迹 ( q d , q ˙ d , q d ) (q_d, \dot{q}_d, \ddot{q}_d) (qd​,q˙​d​,q​d​)。为此&#xff0c;控制器需根据当前状态 ( q , q ˙ ) (q, \dot{q}) (q,q˙​)计…

智能办公与科研革命:ChatGPT+DeepSeek大模型在论文撰写、数据分析与AI建模中的实践指南

随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数据分析和优化机器学习模型。 ChatGPT和Deep…

运营商场景下的实时脱敏方案:PB 级日志流的分布式处理架构

在数字化浪潮中&#xff0c;运营商积累了海量数据&#xff0c;涵盖用户信息、通信记录、业务运营数据等。这些数据不仅是运营商业务运营的关键资产&#xff0c;也是创新服务、精准营销的核心驱动力。然而&#xff0c;随着数据量呈指数级增长&#xff0c;运营商每日需处理 PB 级…

docker+n8n的工作流中无法使用本地ollama服务的问题

使用docker创建n8n服务后&#xff0c;工作流中不想用大模型付费API测试&#xff0c;想用本地大模型来跑&#xff0c;刚好电脑上装了ollama&#xff0c;就试了下添加ollama节点来替代大模型付费API&#xff0c;结果就遇到了以下问题 ollama正常运行中 但是工作流会卡在这&…