表白墙(服务器)

目录

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;}
}

此时在页面输入的数据将会保存在数据库中。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# Onnx Ultra-Fast-Lane-Detection-v2 车道线检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; usi…

你真的会学习网络安全吗?

我敢说&#xff0c;现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么&#xff1f;因为全网更多的都是在讲如何去渗透和公鸡&#xff0c;却没有把网安最注重的防御讲明白。 老话说得好&#xff1a;“攻击&#xff0c;是为了更好的防御。”如果连初衷都忘了&#xff…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法&#xff08;Prim&#xff09;克鲁斯卡尔算法&#xff08;Kruskal&#xff09; 最短路径BFS求最短路径迪杰斯特拉算法&#xff08;Dijkstra&#xff09;弗洛伊德算法&…

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同&#xff0c;gradle的版本和gradle plugins的版本都会影响使用方式。 基于此&#xff0c;本文只能作为参考&#xff0c;而不能作为唯一答案&#xff0c;如果要完全依赖本文&#xff0c;则…

8年经验之谈 —— Redis的性能测试与优化!

Redis作为一种高性能的Key-Value数据库&#xff0c;一直受到众多开发者和企业的青睐。然而&#xff0c;在高并发、大数据存储的应用场景中&#xff0c;如何测试并优化Redis的性能&#xff0c;成为了问题。本文将从测试与优化两个方面来讲解如何达到最优的Redis性能。 一、性能…

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目&#xff0c;有n个数&#xff0c;取值范围是 0~n&#xff0c;写出一个排序算法&#xff0c;要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果&#xff0c;这一篇将会介绍一种不基于比较的排序方法。这…

K-means(K-均值)算法

K-means&#xff08;k-均值&#xff0c;也记为kmeans&#xff09;是聚类算法中的一种&#xff0c;由于其原理简单&#xff0c;可解释强&#xff0c;实现方便&#xff0c;收敛速度快&#xff0c;在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…

我和云栖有个约会

云栖大会&#xff1a;聚焦创新&#xff0c;驱动未来 2009年&#xff0c;一场地方网站峰会在中国掀起了技术的浪潮。随着时间的推移&#xff0c;这场峰会逐渐演变成了全球领先的科技盛会——云栖大会。回首历史&#xff0c;云栖大会不仅是中国云计算产业发展的见证者&#xff0c…

高效分割分段视频:提升您的视频剪辑能力

在数字媒体时代&#xff0c;视频剪辑已经成为一项重要的技能。无论是制作个人影片、广告还是其他类型的视频内容&#xff0c;掌握高效的视频剪辑技巧都是必不可少的。本文将介绍如何引用云炫AI智剪高效地分割和分段视频&#xff0c;以提升您的视频剪辑能力。以下是详细的操作步…

2023-11-01 LeetCode每日一题(参加会议的最多员工数)

2023-11-01每日一题 一、题目编号 2127. 参加会议的最多员工数二、题目链接 点击跳转到题目位置 三、题目描述 一个公司准备组织一场会议&#xff0c;邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子&#xff0c;可以坐下 任意数目 的员工。 员工编号为 0 到 n - 1 。…

appium操控微信小程序的坑

appium操控微信小程序的坑 打不开启动页面driver的context只有NATIVE_APP小程序上元素找不到 我打算使用appium操控微信小程序&#xff0c;只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。 打不开启动页面 以下是我的appium的配置参数和代码&#xff1a; de…

基于Taro + React 实现微信小程序半圆滑块组件、半圆进度条、弧形进度条、半圆滑行轨道(附源码)

效果&#xff1a; 功能点&#xff1a; 1、四个档位 2、可点击加减切换档位 3、可以点击区域切换档位 4、可以滑动切换档位 目的&#xff1a; 给大家提供一些实现思路&#xff0c;找了一圈&#xff0c;一些文章基本不能直接用&#xff0c;错漏百出&#xff0c;代码还藏着掖…

Kubernetes - Ingress HTTP 升级 HTTPS 配置解决方案(新版本v1.21+)

之前我们讲解过 Kubernetes - Ingress HTTP 搭建解决方案&#xff0c;并分别提供了旧版本和新版本。如果连 HTTP 都没搞明白的可以先去过一下这两篇 Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客Kubernetes - Ingress HTTP 负载搭建部署解决方案…

SpringMVC Day 07 : 表单验证

前言 表单验证在Web开发中是非常常见和重要的一部分&#xff0c;它用于确保用户提交的数据符合预期的规则和限制。 通过表单验证&#xff0c;我们可以有效地捕获并处理用户输入中的错误或不正确的数据&#xff0c;从而提高应用程序的数据质量和用户体验。在本教程中&#xff…

Thread

Thread 线程启动线程第一种创建线程线程的第二种创建方式使用匿名内部类完成线程的两种创建 Thread API线程的优先级线程提供的静态方法守护线程用户线程和守护线程的区别体现在进程结束时 多线并发安全问题同步块 线程 启动线程 启动线程:调用线程的start方法,而不是直接调用…

lua-resty-request库写入爬虫ip实现数据抓取

根据提供的引用内容&#xff0c;正确的库名称应该是lua-resty-http&#xff0c;而不是lua-resty-request。使用lua-resty-http库可以方便地进行爬虫&#xff0c;需要先安装OpenResty和lua-resty-http库&#xff0c;并将其引入到Lua脚本中。然后&#xff0c;可以使用lua-resty-h…

【网络协议】聊聊http协议

当我们输入www.baidu.com的时候&#xff0c;其实是先将baidu.com的域名进行DNS解析&#xff0c;转换成对应的ip地址&#xff0c;然后开始进行基于TCP构建三次握手的连接&#xff0c;目前使用的是1.1 默认是开启了keep-Alive。可以在多次请求中进行连接复用。 HTTP 请求的构建…

【k8s】pod详解

一、Pod介绍 1、Pod的基础概念 Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象&#xff0c;一个pod代表着集群中运行的一个进程。kubernetes中其它大多数组件都是围绕着pod来进行支持和扩展pod功能的。 例如&#xff0c;用于管理po…

计算机基础知识41

前端 # 前端是所有跟用户直接打交道 比如&#xff1a;PC页面、手机页面、汽车显示屏&#xff0c;肉眼可以看见的 # 后端&#xff1a;一堆代码&#xff0c;用户不能够直接看到&#xff0c;不直接与用户打交道 常见的后端&#xff1a;Python、Java、Go等 # 学了前端就可以做全栈…

算法题:二叉树的层序遍历

层序遍历&#xff0c;看似简单&#xff0c;实则陷阱很多&#xff0c;怪不得该题目被认定为中等难度题。此处运用了迭代求解法。&#xff08;完整题目附在了最后&#xff09; # Definition for a binary tree node. class TreeNode:def __init__(self, val0, leftNone, rightNon…