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

news2025/2/13 2:58:18

上一章结束了 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 语句改为上图的代码。 

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

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

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

相关文章

海思3559万能平台搭建:SPI输出h264码流

前言 面对各种各样的客户需求&#xff0c;spi接口也是一种传码流的形式&#xff0c;spi同步422可以保证抗干扰能力强的同时传输距离也很长&#xff0c;本文会介绍海思平台spi作为主机的发送功能以及发送码流的处理方式 1. 管脚复用&#xff1a; 首先需要配置的肯定是管脚复用&…

java容器排序

Java的容器 在Java中&#xff0c;我们想要保存对象可以使用很多种手段。最简单的就是数组。但是数组具有固定的尺寸&#xff0c;而通常来说&#xff0c;程序总是在运行时根据条件来创建对象&#xff0c;我们无法预知将要创建对象的个数以及类型&#xff0c;所以Java推出了容器…

动态规划-最长的回文序列

这里写自定义目录标题 1 描述2 样例2.1 样例12.2 样例2 3 解题思路以及实现方法3.1 解题思路3.1.1 确定状态3.1.2 转移方程3.1.3 初始条件和边界情况3.1.4 计算顺序 3.2 题解3.2.1 C实现3.2.2 java实现 该题是lintcode上 667 最长的回文序列&#xff0c;该题的解题思路亦是参…

方法选对,事半功倍:数据分析方法

人们发明了数据可视化&#xff0c;利用人类大脑更善于处理图像信息的特点&#xff0c;透过图形化的手段&#xff0c;用图表清晰有效地传达和沟通信息。把以往庞杂、繁乱的数据报表转化成简洁明了的可视化图表。 通过数据可视化制作出的图表&#xff0c;不再像传统分析方案那样…

JavaScript Web APIs学习总结

以后声明变量我们有限使用哪一个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#xff0c;只要地址不变&…

月入6000+的CSGO游戏搬砖项目操作细节和要求

月入6000的CSGO游戏搬砖项目操作细节和要求 最近咨询CSGO搬砖项目的人较多&#xff0c;在此整理一份统一的项目操作细节和要求。 1、什么是国外Steam游戏装备汇率差项目&#xff1f; 这个项目的基本原理是&#xff1a;购买国外Steam游戏平台上的装备&#xff0c;再在国内网易…

SSR渲染--02--nuxt demo(vue)

cmd 打开命令提示符&#xff0c;创建nuxt npm i create-nuxt-app -g create-nuxt-app vue-honor-of-kings&#xff08;这个是我的项目名&#xff0c;输入自己的项目名&#xff09; npm run dev创建的具体配置 【写demo为了方便&#xff0c;我直接下载了Element的包&#xff0…

游戏画面延迟的原因及解决方法

游戏画面延迟&#xff0c;是玩家在游戏中操作后&#xff0c;画面反应出现滞后或卡顿的现象。这会严重影响玩家的游戏体验和竞技水平&#xff0c;尤其是在一些需要高速反应和精确操作的3A大作中&#xff0c;画面延迟可能导致玩家错失良机或者被敌人击败。 那么&#xff0c;游戏…

电能质量监测装置在某半导体公司的应用

摘 要&#xff1a;半导体生产制造业在国民经济中起着举足轻重的作用&#xff0c;相关企业的规模也越来越大。其供配电系统稳定、可靠的运维不仅是其安全生产的基本保证&#xff0c;还关系到产品质量和生产的顺利进行。而半导体行业中大部分工艺设备对电能质量比较敏感&#xff…

《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP(2)

原文&#xff1a;《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP&#xff08;2&#xff09;-阿里云开发者社区 简介&#xff1a; 《CDP企业数据云平台从入门到实践》——如何迁移CDH/HDP到CDP&#xff08;2&#xff09; 《CDP企业数据云平台从入门到实践》——如…

Windows安装和配置VCenter

Vcenter的环境搭建和配置 Vcenter简介 Vcenter一般指 VMware vCenter™ Server&#xff0c;VMware vCenterServer 提供了一个可伸缩、可扩展的平台&#xff0c;为 虚拟化管理奠定了基础。 VMware vCenter Server&#xff08;以前称为 VMware VirtualCenter&#xff09;&#…

Qt6.5.1+WebRTC学习笔记(十一)开发环境搭建(ubuntu22.04)

前言 win10开发测试已经一段时间了&#xff0c;最近将程序移植到ubuntu测试了下&#xff0c;改动不是很大&#xff0c;本教程记录下环境搭建过程 一、准备 1.操作系统ubuntu22.04 64位 x86架构&#xff08;建议更新到最新&#xff09; 2.合理的上网方式&#xff0c;需要正常…

模板匹配笔记

模板匹配是一种最基本、最原始的模式识别的方法。通过对比某一特定物体的图案位于图像的什么地方&#xff0c;进而识别出物体。它是图像处理中最基本、最常用的匹配方法。它的局限性主要是它只能进行平行移动&#xff0c;若原图像中的匹配目标发生旋转或大小变化&#xff0c;该…

运维(SRE)成长之路-第2天 文本编辑工具之神VIM

vi和vim简介 在Linux中我们经常编辑修改文本文件&#xff0c;即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano&#xff0c;实际工作中我们会使用更为专业&#xff0c;功能强大的工具 文本编辑种类&#xff1a; 全屏编辑器&#xff1a;nano&#xff08;字符工具…

Spark SQL数据源:Parquet文件

文章目录 一、Parquet简介二、读取和写入Parquet的方法&#xff08;一&#xff09;利用parquet()方法读取parquet文件1、数据准备2、读取parquet文件3、显示数据帧内容 &#xff08;二&#xff09;利用parquet()方法写入parquet文件1、写入parquet文件2、查看生成的parquet文件…

Spring Security--多个过滤器链和多个用户表

请求从客户端出发&#xff0c;到达客户端&#xff0c;也就是servlet&#xff0c;中间有很多过滤器的&#xff0c;其中就有一个过滤器链代理&#xff0c;里面包含了过滤器的一个集合。而且Spring Security Filter并不是直接嵌入到Web Filter中的&#xff0c;而是通过FilterChain…

海纳“千川”:得物多场景统一推荐平台|精选

1 千川由来 得物的推荐场景&#xff0c;除了首页瀑布流等几个比较大的场景之外&#xff0c;还有很多长尾的小场景&#xff0c;包括&#xff1a;频道、会场、购中购后场景、品牌墙等。这类场景存在单个场景体量小&#xff08;UV和GMV均偏小&#xff09;、场景零散、类型多元的情…

炫龙笔记本怎么用U盘重装Win10系统?

炫龙笔记本怎么用U盘重装Win10系统&#xff1f;很多使用炫龙笔记本电脑的用户在问&#xff0c;怎么使用U盘来重装一下电脑的Win10系统&#xff0c;这时候用户先要准备一个U盘&#xff0c;还有一个能够正常联网的炫龙笔记本电脑&#xff0c;最后按照以下炫龙笔记本用U盘重装Win1…

可算是熬出头了,测试3年,费时6个月,入职阿里,涨薪14K

本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半后开始沪漂生活&#xff0c;又摸爬滚打了一年半&#…

FL Studio21.0.3最新版本下载 可切换中文语言

FL Studio是最好的! 在我12/13岁的时候&#xff0c;一个DJ向我介绍了FL Studio。它让我大吃一惊&#xff0c;怎么能在几秒钟内做出一个鼓的模式。后来我又玩了好几年&#xff0c;到了15岁时&#xff0c;我确定我想成为一名制作人。FL Studio帮助我把脑海中的想法快速地变成一个…