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

news/2024/11/29 11:35:32/

上一章结束了 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();//遍历 resultSetwhile (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.ppmy.cn/news/382162.html

相关文章

我用AI提高我的代码质量,周边同事对我的代码赞不绝口,速来围观

文章目录 前言功能演示1.使用Stream API来简化集合操作2.使用switch语句来替代多个if-else语句3.使用try-with-resources语句来自动关闭资源4. Lambda 表达式来简化代码,并提高代码的可读性和可维护性5.查找代码中的bug并优化6.python 使用sort方法来对列表进行排序7.javaScrpi…

电商--抢购架构总结

文章目录 背景业务流程业务难点技术难点技术方案技术方向具体落地客户端流控网关流控容器流控后端接口流控数据库流控 流控总结优化读取加速异步化流程处理系统扩容 压测监控 总结参考文献 背景 这是个在做NFT电商项目时遇到的场景&#xff0c;要求运营可以商家某个系列的NFT商…

Optional简述(Java8新特性)

Optional类是Java8为了解决null值判断问题&#xff0c;借鉴google guava类库的Optional类而引入的一个同名Optional类&#xff0c;使用Optional类可以避免显式的null值判断&#xff08;null的防御性检查&#xff09;&#xff0c;避免null导致的NPE&#xff08;NullPointerExcep…

ROS-melodic:源码安裝teb_local_planner算法、替换DWA算法

一.安裝teb_local_planner算法 源码下载地址&#xff1a;GitHub - rst-tu-dortmund/teb_local_planner: An optimal trajectory planner considering distinctive topologies for mobile robots based on Timed-Elastic-Bands (ROS Package) 注意选择对应ROS版本的代码。 放在…

远程复制服务器大于2g文件吗,ps保存文件太大_PS文件大于2G存不了怎么办

摘要 腾兴网为您分享:PS文件大于2G存不了怎么办&#xff0c;社会扶贫&#xff0c;闪动壁纸&#xff0c;每日一淘&#xff0c;老师说等软件知识&#xff0c;以及钢铁侠动态壁纸&#xff0c;甘肃教育&#xff0c;社保认证&#xff0c;华为mate8刷机包&#xff0c;赣教&#xff0c…

3d wallpaper android,3dwallpapers

3d wall papers app是一款最近比较受欢迎的3D立体动态壁纸设置免费软件&#xff0c;这里有非常齐全的立体视觉效果的手机壁纸可供选择&#xff0c;不断更新&#xff0c;试下流心风格图片&#xff0c;高清无水印&#xff0c;免费试用&#xff0c;支持重力传感器和陀螺仪效果是用…

为什么超三成制造企业上市公司选择用友U9 cloud?

导读&#xff1a;30%制造企业上市公司和40%专精特新制造业上市公司都选择用友U9 cloud 当前&#xff0c;数智化转型已经成为中国制造重构竞争力、实现高质量发展的必经之路。《“十四五”智能制造发展规划》提出&#xff0c;到2025年&#xff0c;70%的规模以上制造业企业基本实…

uniapp小程序中的相关设置

要让uniapp中的背景图片全屏&#xff0c;可以在<style>标签中添加以下样式&#xff1a; page { background-image: url(/static/bg.jpg); background-size: cover; background-repeat: no-repeat; background-position: center center; } 在这个样式中&…