后端(三):后端实战(表白墙的设计)

上一章结束了 Servlet 的学习,ok,现在我们已经学会了 1 + 1 了,现在开始我们要学会 百以内的加减乘除法。

本章就做一个最简单的 小小项目:表白墙。

在开始表白墙项目开始之间,我们先提前说好,这里主要跟关注 后端的代码,前端的代码。我们不重点讲解,只是一笔带过罢了。

前后端约定:

前端传输给后端的数据是啥样的 例如:前端的数据格式是 jackson,后端不认识啊,按照 jackson 的格式接收全乱码了,这不是搞人心态吗?

所以啊,这个约定的意义就在这里,两边相互通知一声,都是啥格式啊,让对面自己去转换格式。

接口一:从服务器获取到所有的消息数据

请求:

GET / message

GET 是前端发送至后端的get方法,获取数据库的数据,message 就是个格式类型,这个是要我们自己写的。

响应:

HTTP/1.1    200    ok

Content-Type:aplication/json

这些都在HTTP 那一张提到过,就不再细讲了。

回到上述的 message 这个格式,我们来约定一下 message 格式:

 

接口二:往服务器提交一个新的信息

请求:

POST / message

POST 用于提交数据。

响应:

HTTP/1.1    200    ok

我们先来看看最终写出来的效果:

 我们再来开看看约定的代码是怎么写的:

这里能理解就理解,理解不了也没事。

 

通过ajax 就可以将约定全部设置好;

在Java中使用 jackson 完成对象和 json 字符串的转换,:

通过 ObjectMapper.writerValue 来把 Java 对象转换为 json格式字符串

通过 ObjectMapper.readValue 来把 json 对象转换为 Java格式字符串

而js中使用 JSON 这个特殊对象,完成对象和 json 字符串的转换

JSON.stringify 将js 对象转换为 json 格式字符串,

JSON.parse 将json 对象转换为 js格式字符串,

前端稍稍介绍一下就好,重点在于后端的介绍。

后端详解

数据库的引入

我们把数据存储在 ArrayList 中(内存中),每当服务器重启,内存数据就全都没有了。

将数据库存储在硬盘上,可以让数据更好的持久化的办法!!这里有两种方法

  • 写到文件里
  • 写道数据库中

我们选择第二种;

  1. 你存文本和存数据库,不一定数据库会节省空间,但是可预见的,大部分情况下数据库会更节省空间,尤其是在大数据量的情况下;
  2. 读写文本文件和数据库速度差别肯定非常大;

这里就需要引用 JDBC;

1. 引入 JDBC 的依赖

在maven 中央仓库搜索:mysql :

 找自己对应的大版本,大版本不对,那么后续操作肯定会出问题;小版本无所谓,找个用的人最多的就好。

2. 创建库、表

这一步,应该问题不大,实在不会可以参考这一章:

 (282条消息) MySQL数据库基础_我可是ikun啊的博客-CSDN博客

3. JDBC 操作

这里就是那经典的几步操作,多写几次就记住了,等到正式写代码就可以看到了。

正式开始写后端代码

1. 约定

前端和后端有约定,后端也要和前端有约定。

2. 核心代码 

这个类本质上还是继承了 HttpServlet 类,主要实现的功能有两个,一个是 doGet() 方法,另一个是 doPost()方法。

一个个来看。

doGet 方法  

  1. 我们将数据库中所有的数据存放到一个链表中(这个链表可以很大),
  2. 随后将这个链表格式转换为 jackson ,
  3. 再设置一个 返回客户端的响应格式,最后发送给客户端 

这就是整个 doGet()方法的作用。

当然,这里还需要完成 laod()方法。

// 该方法用于遍历数据库中所有的数据
    private List<Message> load() {
        // 这个list 用于存储遍历出来的数据
        List<Message> messageList = new ArrayList<Message>();

        // 建立链接、经典操作:
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("");

        try {
            // 构建 sql语句
            Connection connection = dataSource.getConnection();
            String sql = "select * from message";
            PreparedStatement statement = connection.prepareStatement(sql);
            ResultSet resultSet = statement.executeQuery();

            //遍历 resultSet
            while (resultSet.next()) {
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
                messageList.add(message);
            }
            // 关闭链接
            // 越晚创建越早关闭
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return messageList;
    }

 其实,本质上就是个 JDBC 的连接,连接操作,构建sql 语句,关闭连接 都是常用的操作;

只有遍历 resuktSet 这个操作需要我们看看,其实也不难。

无非就是将数据库中的数据拿出来,构造成 一个 message 格式,随后添加至链表中,最终返回这个链表。

doPost 方法

 doPost 需要做的事情也很简单,就是将数据保存在数据库中。

// 该方法用于保存 输入的信息,这个保存主要是存放在数据库,本质就是个连接数据库操作
    private void save(Message message) {
        // 链接数据库
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/java107?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("");

        try{
            // 构建 sql语句
            Connection connection = dataSource.getConnection();
            String sql = "insert into message values(?,?,?)";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,"from");
            statement.setString(2,"to");
            statement.setString(3,"message");
            // 执行 sql 语句
            statement.executeUpdate();
            // 关闭链接
            statement.close();
            connection.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

这里也是个jdbc 的操作,多谢就熟悉了,这一块以前也介绍过,可以参考:

MySQL:JDBC_我可是ikun啊的博客-CSDN博客

ok,代码写道这里就写完了。我们可以来测试一下。

部署那一步我就跳过了,我们也可以下载一个插件 smart tomcat ,随后配置一下,这个可以上网查一下具体操作流程。

3. 测试

这就是个很简单的程序,我们就不使用在 测试中讲的那些了,随便测试测试就好。

我们再重新打开,看看数据是否被保存在了数据库。

 ​​​​​​​

如果发现数据库不存在,一定要去看看日志中报了啥错误,我也就遇到过几个错误,数据库中没有保存数据:

最后发现是我数据库连接错了:

 

ok,到这里这个表白墙项目就结束了。

完全的代码,在我的码云中:

Projects: 项目仓库 (gitee.com) 

这里的代码中还有个错误:

将save 方法中的 构建sql 语句改为上图的代码。 

先熟悉一下简单的小项目,马上下一章就是另一个新项目:博客系统

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

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

相关文章

使用yolox训练自己的数据集并测试

1.首先给出yolox原模型的下载地址: ​​​​​​https://github.com/bubbliiiing/yolox-pytorch 百度网盘链接给出自己完整的模型&#xff08;包括数据集以及权重文件&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1JNjB42u9eGNhRjr1SfD_Tw 提取码&am…

线程的创建和使用(二)

1、线程的类和方法 Thread类是JVM用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有唯一一个的Thread对象与之关联。 1.1、Thread的常见方法 方法说明Thread()创建线程对象Thread(Runnable target)使用Runnable对象创建线程对象Thread(String name)创建线程…

Python中对基本文件操作

1.文件的作用 保存数据放在磁盘中 2.打开文件 fopen(‘文件’,‘w’)或者fopen(‘文件’,‘r’) 3.文件操作 3.1 写数据(write) 如果文件不存在那么创建&#xff0c;如果存在那么就先清空&#xff0c;然后写入数据 对象open(“文件”,w) 对象.write&#xff08;“写入数…

【数据结构与算法】04 哈希表 / 散列表 (哈希函数、哈希冲突、链地址法、开放地址法、SHA256)

一种很好用&#xff0c;很高效&#xff0c;又一学就会的数据结构&#xff0c;你确定不看看&#xff1f; 一、哈希表 Hash Table1.1 核心概念1.2 哈希函数 Hash Function1.3 哈希冲突 Hash Collision1.4 哈希冲突解决1.41 方法概述1.42 链地址法 Separate Chaining1.43 开放寻址…

C语言学习笔记:指针

✨博文作者&#xff1a;烟雨孤舟 &#x1f496; 喜欢的可以 点赞 收藏 关注哦~~ ✍️ 作者简介: 一个热爱大数据的学习者 ✍️ 笔记简介&#xff1a;作为大数据爱好者&#xff0c;以下是个人总结的学习笔记&#xff0c;如有错误&#xff0c;请多多指教&#xff01; 目录 简介 …

企业会计软件必备!深入了解为何选择会计软件以及其带来的好处

随着科技的发展&#xff0c;企业需要更加智能化和数字化的财务管理方式&#xff0c;因此会计软件是现代社会的必然产物&#xff0c;会计软件可以帮助企业更有效地进行财务管理。 企业为什么需要会计软件&#xff1f; 提高准确度 通过传统的手工操作财务记录&#xff0c;会有很…

Linux常用命令——gcc命令

在线Linux命令查询工具 gcc 基于C/C的编译器 补充说明 gcc命令使用GNU推出的基于C/C的编译器&#xff0c;是开放源代码领域应用最广泛的编译器&#xff0c;具有功能强大&#xff0c;编译代码支持性能优化等特点。现在很多程序员都应用GCC&#xff0c;怎样才能更好的应用GCC…

【MySQL数据库】MySQL日志管理、备份与恢复

MySQL日志管理、备份与恢复 一、MySQL日志管理1.1日志存放位置 二、数据备份2.1物理备份与逻辑备份2.2完整备份、差异备份、增量备份2.3常见的备份方法 三、完整备份与恢复3.1物理冷备份与恢复3.2mysqldump 备份3.3mysqldump数据恢复3.4MySQL增量备份3.5MySQL增量恢复 一、MySQ…

【开发细节】SpringBoot配置文件的spring.profiles下的active和include属性的区别和作用

目录 问题作用spring.profiles.activespring.profiles.include 总结 问题 我们经常在项目的application.yml中看到这样的配置&#xff0c;如下&#xff1a; 在 Spring Boot 中&#xff0c;spring.profiles.active 和 spring.profiles.include 属性都是用来配置 profile 的。 …

【VB6|第18期】基于libxl导出Excel之导出失败的解决方案

日期&#xff1a;2023年6月12日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

安装Hive

安装Hive 准备 安装Java环境&#xff1a;Hive需要Java环境支持&#xff0c;所以需要先安装Java。安装文档&#xff1a;http://t.csdn.cn/deBJu 安装MySQL数据库。http://t.csdn.cn/d24pN 下载Hive 下载Hive的二进制文件。 链接&#xff1a;https://pan.baidu.com/s/1fdg7…

ubuntu 22.04部署dzzoffice及安装onlyoffice插件

目录 一、配置阿里源 二、安装数据库 三、安装依赖组件 &#xff08;一&#xff09;安装php7.4 &#xff08;二&#xff09;安装apache2 四、下载 dzzoffice 五、安装dzzoffice 六、安装onlyoffice插件 &#xff08;一&#xff09;从github下载小胡版onlyoffice替代原来…

Spring MVC 的创建连接和使用

目录 前言&#xff1a; MVC 是什么&#xff1f; 1. Spring MVC 项目的创建和连接&#xff1a; 1.1 创建 1.2 连接 2. RequestMapping 注解使用详析&#xff1a; 2.1 指定请求类型&#xff1a; 2.1.1 指定 GET 请求 2.1.2 指定 POST 请求 3. 参数的获取与传递&#xff1a; 3.1 传…

若依微服务 + seata1.5.2版本分布式事务(安装配置nacos+部署)

若依官方使用的1.4.0版本seata&#xff0c;版本较低配置相对更麻烦一些 一、seata服务端下载&#xff0c;下载方式介绍两种入口&#xff0c;如下&#xff1a; 1、找到对应版本&#xff0c;下载 binary 即可。 下载包名为&#xff1a;seata-server-1.5.2.zip 2. github上下载 …

Stable Diffusion WebUI 本地安装教学

Stable diffusion AI的绘图工具&#xff0c;这是一种扩散模型&#xff0c;可以通过不断去噪来获得最终的艺术作品。这款工具是当前最受欢迎的AI绘图工具之一&#xff0c;不仅是还是开源的&#xff0c;而且其中的AUTOMATIC111 Stable-diffusion-webui版本深受AI绘图玩家的喜爱&a…

《统计学习方法》——条件随机场#习题解答#

引言 这是统计学习方法第十一章条件随机场的阅读笔记&#xff0c;包含所有公式的详细推导。 条件随机场(conditional random field,CRF)是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型&#xff0c;其特点是假设输出随机变量构成马尔可夫随机场。 建议先阅…

低学历又如何?我这样的程序员照样可以逆袭

今天分享的这个主题&#xff0c;很可能会带来争议&#xff0c;因为目前优秀毕业生0年就可以拿到 20K 的待遇&#xff0c;这里暂且抛开硕士&#xff0c;985&#xff0c;211的 Top 前几高学校本科生。 毕竟今天的主题的初衷是地点低的程序员如何才能 2-3 年实现 20K 的目的&…

naive-ui NPopconfirm怎么用vue3的h()渲染

先看效果 然后我先贴代码&#xff0c; 你们看懂的先运行下&#xff0c; 文章后面我教你怎么 添加这种有template&#xff0c;有slot插槽的组件 h(NPopconfirm,{positiveButtonProps: {size: tiny,color: #007293,bordered: true,},negativeButtonProps: {size: tiny,color: #…

k8s 基本架构

k8s 中支持的 node 数 和 pod 数 k8s 也是逐步发展过来的&#xff0c;来看看以前和现在支持的 node 数 和 pod 数对比 node 即 节点 &#xff0c; 早期的 k8s 版本能够支持 100 台节点&#xff0c;现在 k8s 可以支持到 2000 台了 pod 数&#xff0c;早期的版本可以支持 1000 …

CleanMyMacX4.13.4中文免费版mac电脑管家

CleanMyMac X这款软件集成清理、mac保护、速度优化维护、应用程序管理和文件管理5大功能&#xff0c;使用过程安全高效&#xff0c;用户不必担心误操作导致系统的崩溃。作为一款专业的mac电脑系统管家&#xff0c;CleanMymac X一直致力于更加智能、便捷地全方位维护我们的电脑&…