表白墙(服务器)
目录
0.需求
1.创建Maven项目
2.给pom.xml内引入三个依赖
3.完善目录,并补充web.xml中的内容
4.编写代码
后端代码
编辑前端代码
5.引入数据库
创建message表
创建工具类
往MessageServlet类中添加方法
0.需求

前面写好了表白墙页面,但存在问题:
1.刷新/重开页面,之前输入的数据会消失
2.只能在本机输入和看见,其他机器看不见
解决思路:让服务器存储用户提交的数据,由服务器保存。有新的浏览器打开页面的时候,从服务器获取数据(服务器存档和读档)
前后端交互:
1.点击提交,浏览器把表白信息发到服务器

2.页面加载,浏览器从服务器获取到表白信息

存档和读档:
存档:每次点击提交按钮,触发一次存档操作,把用户输入的内容存储到服务器(存一条)
读档:每次加载页面/刷新页面,触发一次读档操作,把之前服务器上存储的所有记录展示到当前页面中(读所有)
1.创建Maven项目
2.给pom.xml内引入三个依赖

<dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.3</version></dependency><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency></dependencies>
3.完善目录,并补充web.xml中的内容

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name>
</web-app>
4.编写代码
读取的数据和响应的数据都是json格式,对应着:
objectMapper.readValue和objectMapper.writeValue方法完成转换
Post方法把message存到List中,Get方法把L响应到服务器中。
objectMapper.readValue把Json格式的message转换成Java对象,objectMapper.writeValue把List中的Java对象转换成Json格式的字符串。
这是一个演示json的转换的代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;class Student{public int classId;public int studentId;
}
//对Json的使用的举例
public class TestJackson {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper=new ObjectMapper();//readValue是把Jackson对象转换成Java对象String s="{\"classId\":10,\"studentId\":20}";//readValue的第一个参数可以直接填一个String,也可以写InputStreamStudent student=objectMapper.readValue(s,Student.class);System.out.println(student.studentId);System.out.println(student.classId);System.out.println();//writeValue/writeValueAsString是把Java对象转换成json字符串Student student1 = new Student();student1.classId=10;student1.studentId=20;String s1=objectMapper.writeValueAsString(student1);System.out.println(s1);}
}

后端代码
在表白墙后端中所对应的代码:

import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;class Message{public String from;public String to;public String message;
}@WebServlet("/message")
public class MessageServlet extends HttpServlet {//使用list变量保存所有消息private List<Message> messageList=new ArrayList<>();private ObjectMapper objectMapper=new ObjectMapper();//向服务器提交数据@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//把body里的内容解析出来,成为一个message对象Message message=objectMapper.readValue(req.getInputStream(),Message.class);//保存messageList.add(message);//状态码可以省略,默认是200resp.setStatus(200);}//从服务器获取数据@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//告诉浏览器,数据是json格式,字符集是utf8resp.setContentType("application/json;charset=utf8");//把Java对象转成json字符串和把字符串写到响应对象中objectMapper.writeValue(resp.getWriter(),messageList);}
}
用postman进行post和get进行操作查看上述代码实现:
前端代码
Post是点击提交按钮的时候发起的,Get是页面加载的时候发起的。
对之前写好的前端页面代码进行补充
1.引入jQuery

2.对提交按钮中添加:给服务器发起post请求,把上述数据提交到服务器
通过Ajax构造:

上述存档流程:

读档
让浏览器ajax发送get请求

读档前后端交互过程

当前数据是在内存中保存的,重启服务器就没有了,要想持久化保存,就要写入到文件中(硬盘)
1.直接使用流对象写入文本文件
2.借助数据库
创建数据表
此处只有一个表 message(from,to,message)
5.引入数据库
创建message表
在MySQL中创建表message(from,to,message)
在创建时,由于from和to是MySQL中的关键字,需要加上反引号 (`)(键盘上Tab键上方)

创建工具类
对数据库连接和关闭资源的工具类
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;//通过这个类把数据库连接过程封装
//把这个类作为一个工具类,提供static方法供其他代码调用
public class DBUtil {//静态成员跟随类对象,类对象在整个进程中只有一份//静态成员也相当于唯一的实例(单例模式,饿汉模式)private static DataSource dataSource =new MysqlDataSource();static {//使用静态代码块,针对dataSource进行初始化操作((MysqlDataSource)dataSource).setUrl("jdbc://127.0.0.1:3306/java106?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("318318");}//通过这个方法来建立连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();}//通过这个方法断开连接,释放资源public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){if(resultSet!=null){try {resultSet.close();}catch (SQLException e){e.printStackTrace();}}if(statement!=null){try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
往MessageServlet类中添加方法
save():往数据库中存一条消息
load():从数据库获取所有消息
//往数据库中存一条消息private void save(Message message){//JDBC操作Connection connection=null;PreparedStatement statement= null;//1.建立连接try {//2.构造SQL语句String sql="insert into message values(?,?,?)";statement.setString(1,message.from);statement.setString(2,message.to);statement.setString(3,message.message);//3.执行sqlstatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}finally {//4.关闭连接DBUtil.close(connection,statement,null);}}//从数据库获取所有消息private List<Message> load(){List<Message> messageList=new ArrayList<>();Connection connection=null;PreparedStatement statement=null;ResultSet resultSet=null;try {//1.和数据库建立连接connection=DBUtil.getConnection();//2.构造SQLString sql="select * from message";statement= connection.prepareStatement(sql);//3.执行sqlresultSet=statement.executeQuery();//4.遍历结果集合while(resultSet.next()){Message message=new Message();message.from=resultSet.getNString("from");message.to= resultSet.getNString("to");message.message=resultSet.getNString("message");messageList.add(message);}return messageList;}catch (SQLException e){e.printStackTrace();}finally {//5.释放资源,断开连接DBUtil.close(connection,statement,resultSet);}return messageList;}
}
此时在页面输入的数据将会保存在数据库中。
相关文章:
表白墙(服务器)
目录 0.需求 1.创建Maven项目 2.给pom.xml内引入三个依赖 3.完善目录,并补充web.xml中的内容 4.编写代码 后端代码 编辑前端代码 5.引入数据库 创建message表 创建工具类 往MessageServlet类中添加方法 0.需求 前面写好了表白墙页面,但存…...
在 Mac 中卸载 Node.js
在 Mac 中卸载 Node.js,可以选择以下两种方法: 使用命令行卸载 Node.js 第一步:打开终端,输入以下命令显示 Node.js 的安装路径: which node 执行该命令后,会显示安装路径:/usr/local/bin/n…...
Hafnium构建选项及FVP模型调用
安全之安全(security)博客目录导读 目录 一、Hafnium构建选项 二、FVP模型调用 一、Hafnium构建选项 本节解释了在支持基于FF-A的SPM (SPMD位于EL3, SPMC位于S-EL1、S-EL2或EL3)的情况下进行构建时涉及的TF-A构建选项:...
第44天:前端及html、Http协议
前端 前端是所有跟用户直接打交道的都可以称之为是前端,比如:PC页面、手机页面、平板页面、汽车显示屏、大屏幕展示出来的都是前端内容。 前端的用处: 学了前端以后我们就可以做全栈工程师(会后端、会前端、会DB、会运维等),能够写一些简单的…...
shell_63.Linux产生信号
Linux 系统信号 信号 值 描述 1 SIGHUP 挂起(hang up)进程 2 SIGINT 中断(interrupt)进程 3 SIGQUIT 停止(stop)进程 9 …...
互联网摸鱼日报(2023-11-01)
互联网摸鱼日报(2023-11-01) 36氪新闻 毫末智行张凯:2023年高阶智能辅助驾驶市场迎来大爆发 撕开三星、金士顿市场,国产老牌存储器企业出海三年,营收翻三倍|insight全球 给医生一双“透视眼”,「锦瑟医疗」专注开…...
AR的光学原理?
AR智能眼镜的光学成像系统 AR眼镜的光学成像系统由微型显示屏和光学镜片组成,可以将其理解为智能手机的屏幕。 增强现实,从本质上说,是将设备生成的影像与现实世界进行叠加融合。这种技术基本就是通过光学镜片组件对微型显示屏幕发出的光线…...
语义分割 实例分割的异同点
语义分割和实例分割是计算机视觉领域中两个相关但不同的任务,它们都涉及对图像像素进行分类和标记,但关注的对象和目标有所不同。 目标对象: 语义分割:语义分割的目标是将图像中的每个像素标记为对应的语义类别,即将…...
C++学习初探---‘C++面向对象‘-继承函数重载与运算符重载
文章目录 前言继承继承是什么?三种访问权限的继承: 函数重载与运算符重载函数重载运算符重载可重载运算符&不可重载运算符 前言 第三次学习记录,依旧是C面向对象的内容。 继承 继承是什么? C中的继承是一种面向对象编程&am…...
Linux下搭建SRS服务器环境
搭建环境 Ubuntu的Linux环境srs 安装源码:源码地址为:GitHub - ossrs/srs at 3.0release 搭建步骤 下载srs源码 git clone GitHub - ossrs/srs: SRS is a simple, high-efficiency, real-time video server supporting RTMP, WebRTC, HLS, HTTP-FLV,…...
pytest 使用(一)
pytest 使用pytest,默认的测试用例的规则以及基础应用pytest测试用例的运行方式pytest执行测试用例的顺序是怎样的呢?如何分组执行(冒烟,分模块执行,分接口和web执行)pytest跳过测试用例 b站课程链接 使用…...
基于秃鹰算法的无人机航迹规划-附代码
基于秃鹰算法的无人机航迹规划 文章目录 基于秃鹰算法的无人机航迹规划1.秃鹰搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用秃鹰算法来优化无人机航迹规划。 1.秃鹰搜索算法 …...
08. 按键输入
08. 按键输入 按键原理图代码编写GPIO驱动代码按键驱动代码主函数 加上清除BSS段,代码不运行 按键原理图 按键KEY0连接到了UART1_CTS上。默认情况下,KEY0为高,当按下KEY0后,UART1_CTS为低电平 代码编写 在bsp下创建一个key和一个…...
YOLOv8-pose关键点检测:模型轻量化创新 |轻量高性能网络PPLCNet助力backbone
💡💡💡本文解决什么问题:轻量高性能网络PPLCNet替换YOLOv8 backbone PPLCNet | GFLOPs从9.6降低至6.6, mAP50从0.921下降至0.901,mAP50-95从0.697提升至0.752 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_63774211/category_12398833.html ✨✨✨手…...
大数据笔记-关于Cassandra的删除问题
Cassandra是Facebook开源的一个NoSQL数据库,它除了具备一般的NoSQL分布式数据库特点以外,最大的一个特点是去中心化架构设计,这和Hadoop HDFS/HBase等不一样,比如HDFS分为NameNode和DataNode,而Cassandra集群中所有节点…...
Qt自定义文件选择框
文章目录 前言一、头文件二、源文件三、qss文件四、效果 前言 在开发过程中,经常遇到使用文件选择框的情况,qt默认的文件选择框,样式可能与开发的桌面程序差异比较大.此时,我们可以自定义文件选择框,设置其样式,尽量做到样式统一. 一、头文件 #ifndef CUSTOMFILEDIALOG_H #d…...
金蝶云星空创建自动下推并保存公共服务
文章目录 金蝶云星空创建自动下推并保存公共服务创建公共方法按单下推数据按明细行下推数据调用下推操作 调用公共方法 金蝶云星空创建自动下推并保存公共服务 创建公共方法 按单下推数据 /// <summary>/// 获取单据转换数据包/// </summary>public DynamicObjec…...
人大金仓助力中国人民银行征信中心业务系统异地容灾优化升级
日前,人大金仓助力中国人民银行应收账款融资服务平台异地容灾项目顺利上线,保证了平台系统运行的连续性和数据安全,为充分发挥平台的融资功能,缓解中小微企业融资难提供了强有力的保障。 缓解中小微企业融资难 中国人民银行构于2…...
[架构之路-249/创业之路-80]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 产品(数据)管理
目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 产品数据管理 1.1.1 什么是产品数据管理What 1.1.1.1 常见工具 1.1.1.2 软件企业的产品数据管理系统 1.1.2 为什么需要产品数据管理系统Why? 1.1.3 谁需要产品数据管理系统w…...
【NI-DAQmx入门】传感器基础知识
1.什么是传感器? 传感器可将真实的现象(例如温度或压力)转换为可测量的电流和电压,因而对于数据采集应用必不可少。接下来我们将介绍您所需的测量类型及其对应的传感器类型。在开始之前,您还可以先了解一些传感器术语&…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
