SpringMVC 案例

在这里插入图片描述

文章目录

  • 前言
  • 1. 计算器
    • 1.1 准备前端代码
    • 1.2 测试前端代码
    • 1.3 完成后端代码
    • 1.4 验证程序
  • 2. 留言板
    • 2.1 前端代码准备
    • 2.2 测试前端代码
    • 2.3 完成前后端交互代码
    • 2.4 完成后端代码
    • 2.5 案例测试
    • 2.6 完善前后端交互
    • 2.7 完善后端代码
    • 2.8 完整功能测试
  • lombok
  • 简单的方式添加Lombok工具
  • 3. 图书管理系统
    • 3.1 前端代码准备
    • 2.2 前端代码测试
    • 2.3 登录功能前后端交互
    • 2.4 后端登录功能实现
    • 2.5 登录功能测试
    • 2.6 图书列表前后端交互
    • 2.7 获取图书列表后端代码
    • 2.8 获取图书列表展示

前言

前面我们学习了 Spring MVC 的基础知识,那么这篇文章我将结合前面所学的 Spring MVC 知识为大家分享计算器、留言墙、图书管理系统的部分功能实现。

1. 计算器

这个计算器案例比较简单,也就是简单的用户输入两个数字,我们后端给返回一个这两个数的和就行了。

1.1 准备前端代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="calc/sum" method="post"><h1>计算器</h1>数字1:<input name="num1" type="text"><br>数字2:<input name="num2" type="text"><br><input type="submit" value=" 点击相加 "></form>
</body></html>

1.2 测试前端代码

在这里插入图片描述

1.3 完成后端代码

package com.example.springdemo20231207;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/calc")
@RestController
public class CalcController {@RequestMapping("/sum")public String sum(Integer num1, Integer num2) {Integer ret = num1 + num2;return "两数相加的结果为" + ret;}
}

1.4 验证程序

在这里插入图片描述
在这里插入图片描述

2. 留言板

这里的留言板跟我们前面用 servlet 写的表白墙是类似的,只不过我们这里是用 Spring 来实现的。

2.1 前端代码准备

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>留言板</title><style>.container {width: 350px;height: 300px;margin: 0 auto;/* border: 1px black solid; */text-align: center;}.grey {color: grey;}.container .row {width: 350px;height: 40px;display: flex;justify-content: space-between;align-items: center;}.container .row input {width: 260px;height: 30px;}#submit {width: 350px;height: 40px;background-color: orange;color: white;border: none;margin: 10px;border-radius: 5px;font-size: 20px;}</style>
</head><body><div class="container"><h1>留言板</h1><p class="grey">输入后点击提交, 会将信息显示下方空白处</p><div class="row"><span>谁:</span> <input type="text" name="" id="from"></div><div class="row"><span>对谁:</span> <input type="text" name="" id="to"></div><div class="row"><span>说什么:</span> <input type="text" name="" id="say"></div><input type="button" value="提交" id="submit" onclick="submit()"><!-- <div>A 对 B 说: hello</div> --></div><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>function submit(){//1. 获取留言的内容var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();if (from== '' || to == '' || say == '') {return;}//2. 构造节点var divE = "<div>"+from +"对" + to + "说:" + say+"</div>";//3. 把节点添加到页面上    $(".container").append(divE);//4. 清空输入框的值$('#from').val("");$('#to').val("");$('#say').val("");}</script>
</body></html>

2.2 测试前端代码

在这里插入图片描述

2.3 完成前后端交互代码

	function submit(){//1. 获取留言的内容var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();if (from== '' || to == '' || say == '') {return;}$.ajax({type: "post",url: "/message/publish",data: {"from": from,"to": to,"say": say},success: function (result) {if (result) {//2. 构造节点var divE = "<div>"+from +"对" + to + "说:" + say+"</div>";//3. 把节点添加到页面上$(".container").append(divE);//4. 清空输入框的值$('#from').val("");$('#to').val("");$('#say').val("");}else {alert("留言错误");}}});

2.4 完成后端代码

MessageInfo 类用来管理浏览信息,这里 @Data 注释稍后为大家解释。

package com.example.springdemo20231207;import lombok.Data;@Data
public class MessageInfo {private String from;private String to;private String say;
}
package com.example.springdemo20231207;import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;
import java.util.List;@RequestMapping("/message")
@RestController
public class MessageWallController {private List<MessageInfo> messageInfos = new ArrayList<>();@RequestMapping("/publish")public boolean publish(MessageInfo messageInfo) {if (!StringUtils.hasLength(messageInfo.getFrom()) || !StringUtils.hasLength(messageInfo.getTo()) || !StringUtils.hasLength(messageInfo.getSay())) {return false;}messageInfos.add(messageInfo);return true;}
}

这样就实现了留言信息的存储,这里为什么不使用数据库来存储呢?这是因为传统的数据库操作比较麻烦,等到后面学习了数据库相关的框架了之后,会为大家介绍。

2.5 案例测试

在这里插入图片描述
在这里插入图片描述

到这里其实还没有实现全部的功能,我们还差一个功能,就是当我们刚进来这个留言板页面的时候,需要将之前存储的留言信息给加载进来,所以就是刚进来这个页面的时候就需要向我们的服务器发送一个请求来获取信息。

2.6 完善前后端交互

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>$.ajax({type: "get",url: "/message/getList",success: function(messageInfos) {for (var messageInfo of messageInfos) {var divE = "<div>"+messageInfo.from +"对" + messageInfo.to + "说:" + messageInfo.say+"</div>";$(".container").append(divE);}}});function submit(){//1. 获取留言的内容var from = $('#from').val();var to = $('#to').val();var say = $('#say').val();if (from== '' || to == '' || say == '') {return;}$.ajax({type: "post",url: "/message/publish",data: {"from": from,"to": to,"say": say},success: function (result) {if (result) {//2. 构造节点var divE = "<div>"+from +"对" + to + "说:" + say+"</div>";//3. 把节点添加到页面上$(".container").append(divE);//4. 清空输入框的值$('#from').val("");$('#to').val("");$('#say').val("");}else {alert("留言错误");}}});}</script>

2.7 完善后端代码

	@RequestMapping("/getList")public List<MessageInfo> getList() {return messageInfos;}

2.8 完整功能测试

因为更改后端代码之后需要重启我们的项目才会生效,而因为我们的 MessageInfo 信息是存储在 List 也就是内存当中的,所以当我们重启程序之后,List 中的数据就会被释放,所以为了测试新加入的功能,我们需要重新加入测试数据。

在这里插入图片描述
在这里插入图片描述

提交之后,我们重新进入这个页面。

在这里插入图片描述
重新进入这个页面之后,他会自动将之前保存的信息给显示出来。

lombok

前面我们的 @Data 注解的作用其实就相当于给 private 权限的属性设置 get 和 set 方法。

Lombok是一个Java库,它可以帮助开发人员消除Java的冗长,尤其是对于简单的Java对象(POJO)。它通过注释实现这一目的。例如,通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种accessor和mutator的大量时间。Lombok常用的注解有:

  1. @Getter:快速构建Getter方法。
  2. @Setter:快速构建Setter方法。
  3. @ToString:快速将当前对象转换成字符串类型,便于log。
  4. @EqualsAndHashCode:快速进行相等判断。
  5. @NonNull:判断变量(对象)是否为空。
  6. @Data:整合了Getter、Setter、ToString、EqualsAndHashCode、RequiredArgsConstructor注解。

那么如何使用 Lombok 呢,首先就需要引入这个工具包的依赖,我们可以在 maven 仓库引入,也可以在创建 Spring Boot 项目的时候勾选上 Lombok 选项即可。

在这里插入图片描述
在这里插入图片描述

Lombok 工具的更多用法。

注解作用
@Getter⾃动添加 getter ⽅法
@Setter自动添加 setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor⾃动添加全属性构造⽅法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需

简单的方式添加Lombok工具

首先在插件中下载 Edit Starters。

在这里插入图片描述

在 pom.xml 文件中右键,点击 generate,选择 Edit Starters。并且添加 Lombok。

在这里插入图片描述
在这里插入图片描述

3. 图书管理系统

因为我们现在学的 Spring 知识无法实现一个完整的图书管理系统,所以这篇文章只完成部分功能。

3.1 前端代码准备

因为这个案例前端代码比较多,所以大家可以去我的 gitee 上自行查找。https://gitee.com/lmh18696433881/this-is-my-java-ee-learning/commit/8d55ca2407429bfbb1979f0a8559fd638e05b10a

在这里插入图片描述

2.2 前端代码测试

在这里插入图片描述

2.3 登录功能前后端交互

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>function login() {$.ajax({type: "post",url: "/user/login",data: {userName: $("#userName").val(),password: $("#password").val()},success: function (result) {if (result==true) {location.href = "book_list.html";}else {alert("您输入的用户名或者密码错误");}}});}
</script>

2.4 后端登录功能实现

package com.example.springbook.Controller;import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public boolean login(String userName, String password, HttpSession session) {//这是为了判断userName和password不为空且长度大于0if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return false;}if ("zhangsan".equals(userName) && "123".equals(password)) {session.setAttribute("userName", userName);return true;}return false;}
}

2.5 登录功能测试

在这里插入图片描述
在这里插入图片描述

登录完成之后,就会展示出有哪些图书。

2.6 图书列表前后端交互

		getBookList();function getBookList() {$.ajax({type: "get",url: "/book/getList",success: function (books) {var finalHtml = "";for (var book of books) {//拼接htmlfinalHtml +='<tr>';finalHtml +='<td><input type="checkbox" name="selectBook" value="'+book.id+'" id="selectBook" class="book-select"></td>';finalHtml +='<td>'+book.id+'</td>';finalHtml +='<td>'+book.bookName+'</td>';finalHtml +='<td>'+book.author+'</td>';finalHtml +='<td>'+book.count+'</td>';finalHtml +='<td>'+book.price+'</td>';finalHtml +='<td>'+book.publish+'</td>';finalHtml +='<td>'+book.stateCN+'</td>';finalHtml +='<td>';finalHtml +='<div class="op">';finalHtml +='<a href="book_update.html?bookId='+book.id+'">修改</a>';finalHtml +='<a href="javascript:void(0)" onclick="deleteBook('+book.id+')">删除</a>';finalHtml +='</div>';finalHtml +='</td>';finalHtml +='</tr>';}$("tbody").html(finalHtml);}});}

2.7 获取图书列表后端代码

首先需要一个 BookInfo 类来存储书的信息。

package com.example.springdemo20231207;import lombok.Data;import java.math.BigDecimal;@Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer count;private BigDecimal price;private String publish;private Integer state; //1可借阅 2不可借阅private String stateCN;
}

创造一些假的图书数据BookDao。

package com.example.springdemo20231207;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class BookDao {public List<BookInfo> mockBookData() {List<BookInfo> bookInfos = new ArrayList<>();for (int i = 0; i < 15; i++) {BookInfo bookInfo = new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书"+i);bookInfo.setAuthor("作者"+i);bookInfo.setCount(i*15 + 3);bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));bookInfo.setPublish("出版社"+i);bookInfo.setState(i%5==0?2:1);bookInfos.add(bookInfo);}return bookInfos;}
}

图书列表操作的业务逻辑 BookService。

package com.example.springdemo20231207;import java.util.List;public class BookService {public List<BookInfo> getBookInfoList() {BookDao bookDao = new BookDao();List<BookInfo> bookInfos = bookDao.mockBookData();for (BookInfo bookInfo : bookInfos) {if (bookInfo.getState() == 1) {bookInfo.setStateCN("可借阅");}else {bookInfo.setStateCN("不可借阅");}}return bookInfos;}
}

图书类的控制器。

package com.example.springdemo20231207;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RequestMapping("/book")
@RestController
public class BookController {@RequestMapping("/getList")public List<BookInfo> getList() {BookService bookService = new BookService();return bookService.getBookInfoList();}
}

2.8 获取图书列表展示

在这里插入图片描述

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

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

相关文章

HarmonyOS学习 第1节 DevEco Studio配置

俗话说的好&#xff0c;工欲善其事,必先利其器。我们先下载官方的开发工具DevEco Studio. 下载完成后&#xff0c;进行安装。 双击DevEco Studio&#xff0c;点击Next按照指引完成安装 重新启动DevEco&#xff0c;点击 Agree 进入环境配置&#xff0c;安装Node.js和ohpm 点击Ne…

MQTT 协议入门:轻松上手,快速掌握核心要点

文章目录 什么是 MQTT&#xff1f;MQTT 的工作原理MQTT 客户端MQTT Broker发布-订阅模式主题QoS MQTT 的工作流程开始使用 MQTT&#xff1a;快速教程准备 MQTT Broker准备 MQTT 客户端创建 MQTT 连接通过通配符订阅主题发布 MQTT 消息MQTT 功能演示保留消息Clean Session遗嘱消…

spring IOC介绍

spring的Ioc真是个好东西啊&#xff0c;那它到底是什么东西呢&#xff0c;控制反转&#xff0c;到底是怎么转的呢&#xff1f; 假设啊你现在是一个导演&#xff0c;想排部戏&#xff0c;那是不是得需要演员和舞台(spring中的bean)&#xff0c;如果按平常的编程思维就是new 一个…

vue-baidu-map实现在地图上选择范围并解决相关问题

vue-baidu-map实现在地图上选择范围并解决相关问题 实现地图上选择不规则范围实现功能遇到的问题1、覆盖物多边形怎么才能盖住覆盖物点2、遇到其他问题 实现地图上选择不规则范围 这个功能比较简单&#xff0c;只需要使用vue-baidu-map插件的覆盖物多边形功能就行了。直接看文…

Win10专业版找不到安全中心选项的解决方法

在Win10电脑中&#xff0c;安全中心功能起到很大的作用。但是&#xff0c;有用户在Win10专业版电脑上找不到安全中心选项&#xff0c;从而影响到自己的正常使用。下面小编分享解决Win10专业版系统没有安全中心的简单方法&#xff0c;解决后在Win10专业版就能成功找到安全中心了…

哈希表及其基础(java详解)

目录 一、哈希表基础 二、哈希函数的设计 哈希函数的设计原则 三、java中的hashCode 基本数据类型的hashCode使用 自定义类型的hashCode使用 需要注意 四、哈希冲突的处理 链地址法Seperate Chaining 五、实现属于我们自己的哈希表 六、哈希表的动态空间处理和复杂…

通过项目管理软件监管新员工入职流程的方法与策略

项目管理软件是什么&#xff1f;项目管理软件都能做什么&#xff1f;是不是只有项目团队需要啊&#xff1f;NO&#xff01;项目管理软件乍听其名不免让人觉得这不过是个项目领域的专用工具。 那什么是项目呢&#xff1f;项目是为创造独特的产品、服务或成果而进行的体系化的工…

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程管…

CTF刷题记录

刷题 我的md5脏了KFC疯狂星期四坤坤的csgo邀请simplePHPcurl 我的md5脏了 g0at无意间发现了被打乱的flag&#xff1a;I{i?8Sms??Cd_1?T51??F_1?} 但是好像缺了不少东西&#xff0c;flag的md5值已经通过py交易得到了&#xff1a;88875458bdd87af5dd2e3c750e534741 flag…

关于微信/支付宝等平台验签/签名sign生成算法

引言 我们在日常工作中经常会遇到对接微信平台、支付宝平台、或者自己对外开放一个api服务&#xff0c;那么这里经常会出现一个名字&#xff1a;sgin&#xff08;签名&#xff09;。 举个栗子 这是微信支付统一下单接口文档&#xff0c;最简单的理解就是&#xff0c;服务端为…

Unirest-Java:Java发起GET、POST、PUT、DELETE、文件上传,文件下载工具类介绍

一、简介 Unirest-Java是一个轻量级的HTTP客户端库&#xff0c;用于在Java应用程序中发送HTTP请求。 它提供了简单易用的API&#xff0c;可以方便地处理GET、POST、PUT、DELETE等HTTP方法。 Unirest-Java支持异步和同步请求&#xff0c;可以轻松地与JSON、XML等数据格式进行…

最优化方法复习——线性规划之对偶问题

一、线性规划对偶问题定义 原问题&#xff1a; 对偶问题&#xff1a; &#xff08;1&#xff09;若一个模型为目标求 “极大”&#xff0c;约束为“小于等于” 的不等式&#xff0c;则它的对偶模型为目标求“极小”&#xff0c;约束是“大于等于”的不等式。即“Max&#xff0…

数据库系统概论复习资料

数据库系统概论考试需知 一、分值分布 1、判断题&#xff08;10分&#xff09; 1分一个 2、填空题&#xff08;20分&#xff09; 2分一个 3、选择题&#xff08;20分&#xff09; 2分一个 4、分析题&#xff08;30分&#xff09; 第一题10分&#xff0c;第二题…

Enterprise Architect 12版本使用教程

Enterprise Architect 12版本使用教程 1.下载安装Enterprise Architect 122.Enterprise Architect原始DDL模板配置及存在的问题1.DDL Column Definition原始模板&#xff08;没有default值&#xff1a;可忽略&#xff09;2.DDL Data Type原始模板&#xff08;timestamp等时间字…

Apollo新版本Beta自动驾驶技术沙龙参会体验有感—百度自动驾驶开源框架

在繁忙的都市生活中&#xff0c;我们时常对未来的科技发展充满了好奇和期待。而近日&#xff0c;我有幸参加了一场引领科技潮流的线下技术沙龙&#xff0c;主题便是探索自动驾驶的魅力——一个让我们身临其境感受创新、了解技术巨擘的机会。 在12月2日我有幸参加了Apollo新版本…

智能优化算法应用:基于沙猫群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于沙猫群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于沙猫群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.沙猫群算法4.实验参数设定5.算法结果6.参考文献7.…

modbus转profinet网关解决plc插槽号不够用的情况

PLC作为常用的控制设备之一&#xff0c;其插槽号有时会限制外部设备的连接数量。然而&#xff0c;通过使用modbus转profinet网关&#xff0c;可以解决这一问题。这种设备能够将modbus协议转换为profinet协议&#xff0c;实现PLC与更多外部设备的连接。 modbus转profinet网关还具…

游戏盾的防御原理以及为什么程序类型更适合接入游戏盾。

游戏盾是一种专门用于游戏服务器的安全防护服务&#xff0c;旨在抵御各种网络攻击。它的原理主要包括以下几个方面&#xff1a; 流量清洗和过滤&#xff1a;游戏盾会对进入游戏服务器的流量进行实时监测、分析和过滤。它通过识别恶意流量和攻击流量&#xff0c;过滤掉其中的攻击…

浏览器渲染页面的过程以及原理

什么是浏览器渲染 简单来说&#xff0c;就是将HTML字符串 —> 像素信息 渲染时间点 浏览器什么时候开始渲染&#xff1f; 网络线程发送请求&#xff0c;取回HTML封装为渲染任务并将其传递给渲染主线程的消息队列。 问题&#xff1a;只取回HTML吗&#xff1f;那CSS和JS呢&am…

元宇宙vr党建云上实景展馆扩大党的影响力

随着科技的飞速发展&#xff0c;VR虚拟现实技术已经逐渐融入我们的日常生活&#xff0c;尤其在党建领域&#xff0c;VR数字党建展馆更是成为引领红色教育新风尚的重要载体。今天&#xff0c;就让我们一起探讨VR数字党建展馆如何提供沉浸式体验&#xff0c;助力党建工作创新升级…