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不为空且长度大于0
        if (!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) {
                            //拼接html
                            finalHtml +='<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.mfbz.cn/a/228583.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小视频怎么做成二维码?视频二维码3步生成

在日常工作和生活中经常会看到各种类型的小视频、短视频&#xff0c;比如网页、抖音等等的视频都是可以下载查看的。当我们想要将下载视频分享给多个人看时&#xff0c;生成二维码的方式会更加的方便&#xff0c;那么视频如何生成二维码呢&#xff1f;下面就将快捷生成二维码的…

spring boot 3.2 整合 keycloak

背景 项目中用到 keycloak&#xff0c;因此其他所有管理页面要集成 keycloak 做统一登录认证。 Keycloak 侧配置 容器方式启动 keycloak 服务端 docker run -d --name mykeycloak -p 8080:8080 -e KEYCLOAK_ADMINadmin -e KEYCLOAK_ADMIN_PASSWORDadmin ke…

LeetCode 每日一题 Day 6(DFS+BFS)

1466. 重新规划路线 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变…

【GEE笔记】在线分类流程,标注样本点、分类和精度评价

GEE在线分类流程 介绍 GEE&#xff08;Google Earth Engine&#xff09;是一个强大的地理信息处理平台&#xff0c;可以实现在线的遥感影像分析和处理。本文将介绍如何使用GEE进行在线的分类流程&#xff0c;包括标注样本点、分类和精度评价。本文以2020年5月至8月的哨兵2影像…

优秀案例 | 元宇宙双语财经科技主播“舒望”主持首届粤港澳大湾区元宇宙国际传播论坛

12月6日&#xff0c;由南方财经全媒体集团指导、大湾区元宇宙国际传播实验室(GBA MIC Lab&#xff09;主办、南财国际传播中心和21世纪经济报道共同承办&#xff0c;以“多元共创开放共享”为主题的首届粤港澳大湾区元宇宙国际传播论坛在广州隆重开幕。 “立足湾区&#xff0c;…

【GEE笔记】随机森林特征重要性计算并排序

随机森林是一种基于多个决策树的集成学习方法&#xff0c;可以用于分类和回归问题。在gee中可以使用ee.Classifier.smileRandomForest()函数来创建一个随机森林分类器&#xff0c;并用它来对影像进行分类。 随机森林分类器有一个重要的属性&#xff0c;就是可以计算每个特征&a…

【沁恒蓝牙MESH】CH582串口中断内存溢出导致MCU频繁重启

本文主要记录了【沁恒蓝牙mesh】CH582串口中断内存溢出导致MCU频繁重启 由于开发疏忽&#xff0c;导致的数组内存溢出&#xff0c;是入门嵌入式开发经常忽视的错误&#xff0c;用以记录&#xff0c;共勉&#xff01;&#xff01; 目录 1. 遇到问题描述以及解决1.1 问题一&#…

案例063:基于微信小程序的传染病防控宣传系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder …

都2023年了还在搜索Maven是什么?赶紧来学习(超详细一文搞懂)

文章目录 前言1. 到底什么是 Maven2. 为什么要学Maven3. 创建一个 Maven 项目4. Maven 核心功能4.1 项目构建4.2 依赖管理 4. Maven 仓库4.1 本地仓库4.2 中央仓库4.3 私有服务器, 也称为私服 5. Maven 设置国内源5.1 配置当前项目setting5.2 设置新项目的setting 总结 前言 我…

N4694D 电子校准件(ECal),67 GHz,1.85 mm,2 端口

N4694D 电子校准件 Keysight N4694D 微波电子校准件&#xff08;ECal&#xff09;可以快速、轻松和准确地对是德科技矢量网络分析仪进行校准。 N4694D 是一款精密型 2 端口电子校准件&#xff0c;支持 1.85 mm 连接器和高达 67 GHz 的频率范围。 用户可以在阴头-阴头、阳头-阳头…

低代码开发:激发创新还是程序员的末日?

前言 近年来&#xff0c;低代码开发备受关注&#xff0c;引发了市场上的热议。这一新兴技术被标榜为具备低门槛、高效率和易集成等特性&#xff0c;然而&#xff0c;却引发了一系列的争论。究竟低代码是伪需求还是行业创新的助推器&#xff1f;它是否可能让程序员失业&#xf…

电脑报错msvcr100.dll丢失?竟有5种解决方法,全面解析

在计算机的使用过程中&#xff0c;我们可能会遇到各种问题&#xff0c;其中之一就是msvcr100.dll丢失。这个问题主要出现在基于Microsoft Visual Studio 2010开发的程序上&#xff0c;可能导致程序无法正常运行。本文将详细介绍msvcr100.dll是什么&#xff0c;以及如何解决其丢…

强制使用新版,Win11里隐藏的Win10要没了

系统这玩意和游戏一样&#xff0c;在许多人眼中「上一代」永远是最好的一代。 除了尝鲜测试阶段必然出现许多 Bug &#xff0c;另一个原因大概是好不容易建立的使用习惯又被打破。 Win10 到 11 的换代即是如此&#xff0c;就算不提稳定性&#xff0c;也还有一些让人至今难以适…

企业贷款行业如何获客?

贷款行业是指提供贷款服务的行业&#xff0c;包括各种类型的金融机构&#xff0c;如银行、信用社、贷款公司、保险公司等。这些机构通过向个人或企业提供贷款服务&#xff0c;满足其资金需求。 主要分为个人贷款和企业贷款。个人贷款指银行或其他金融机构向符合贷款条件的自然…

MS5228/5248/5268:2.7V 到 5.5V、 12/14/16Bit、内置基准、八通道数模转换器

MS5228/MS5248/MS5268 是一款 12/14/16bit 八通道输出的电压型 DAC &#xff0c;内部集成上电复位电路、可选内部基准、接口采用四线串口模式&#xff0c; 最高工作频率可以到 40MHz &#xff0c;可以兼容 SPI 、 QSPI 、 DSP 接口和 Microwire 串口。输出接到一个 …

电商早报 | 12月8日|母婴电商宝贝格子北京总部已人去楼空

国家邮政局&#xff1a;预计11月快递量同比增长30%&#xff0c;业务收入增长27% 12月7日消息&#xff0c;国家邮政局发布2023年11月中国快递发展指数报告。经测算&#xff0c;2023年11月中国快递发展指数为406.4&#xff0c;同比提升20%。其中发展规模指数、服务质量指数、发展…

JPA对数据库修改注意点

同一事务中获取不到修改数据 spring-boot-starter-parent版本2.7.12 Dao Query(value "select * from inventory_list where id in (?1) order by id desc",nativeQuery true) List<InventoryListEntity> getByIds(List<Integer> idList);Modifyin…

二层交换原理

二层交换设备工作在OSI模型的第二层&#xff0c;即数据链路层&#xff0c;它对数据包的转发是建立在MAC&#xff08;Media Access Control &#xff09;地址基础之上的。二层交换设备不同的接口发送和接收数据独立&#xff0c;各接口属于不同的冲突域&#xff0c;因此有效地隔离…

编译 Android gradle-4.6-all.zip 报错问题记录

编译 Android gradle-4.6-all.zip 报错问题记录 方法一&#xff1a;替换资源&#xff1a;方法二&#xff1a;修改源方法三&#xff1a;修改版本 编译时候无法下载 gradle-4.6-all Downloading https://services.gradle.org/distributions/gradle-4.6-all.zip 方法一&#xf…
最新文章