简单的网站-表白墙(前后端交互)

提交信息后,就得到了下面的一行话

但是存在一些问题

在一个网站中,服务器起到的最主要的效果,就是 “存储数据”

因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据

二、实现前后端交互

1)先规定此处请求和响应的细节

1.获取消息

网页加载的时候,给服务器发起一个Ajax的请求

请求:GET /message

响应:HTTP/1/1 200 OK

Content-Type:application/json

[

        {

                from:'张三',

                to:'李四',

                message:'我喜欢你很久了'

        },

  {

                from:'王五',

                to:'赵六',

                message:'我宣你~~~'

        }

]

2.提交信息

用户点击 提交 按钮的时候,Ajax给服务器发一个请求

目的是为了把用户在输入框输入的内容,发送给服务器

请求:POST /message

Content-Type:application/json

 {

                from:'张三',

                to:'李四',

                message:'我喜欢你很久了'

 }

响应:HTTP/1.1 200 OK

2)先编写提交信息~

1.先写前端代码,发送请求

2.再写后端代码,解析请求,构造响应

3.再写前端代码,解析响应。

准备工作

创建Maven项目 message_wall

创建文件夹以及web.xml并填上内容

 pom.xml也把依赖包导入

把写好的网页 放到 webapp目录里

tomcat这样一个项目 可以包含一些html,css,js这些内容都是在webapp 目录中的

创建smart tomcat 并运行

打开浏览器输入网址

先写前端代码,发送请求

找到网页的文件用vscode打开编写 ,使用 Ajax ,需要先引入jQuery这个库

在网页里搜索jquery cdn

复制script这个标签,拷贝到head标签里(引入jquery)

 前端发起一个 ajax 请求

这个代码在点击按钮的回调函数中,在点击之后被调用到

3)服务器读取上述请求,并计算出响应

 创建MessageServlet类,重写doPost方法

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;@Overridepublic String toString() {return "Message{" +"from='" + from + '\'' +", to='" + to + '\'' +", message='" + message + '\'' +'}';}
}
@WebServlet("/message")
public class MessageServlet extends HttpServlet {private ObjectMapper objectMapper = new ObjectMapper();private List<Message> messageList = new ArrayList<>();@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.读取前端发来的数据,把这个数据保存到服务器这边Message message = objectMapper.readValue(req.getInputStream(),Message.class);System.out.println("请求中收到的message:" + message);//2.存储数据:最简单的办法,直接在内存中保存,可以使用一个集合类,把所有收到的message 都存到内存中//并非很合理的办法,因为一旦重启服务器,数据就丢失了//相比之下,把数据持久化存储到数据库中,更科学messageList.add(message);//3。返回一个响应resp.setStatus(200);resp.getWriter().write("ok");}
}

4)回到前端代码,处理服务器返回的响应 

这里后端返回的ok  就会到  前端这里的回调函数 中responseBody这里

重启smart tomcat ,打开浏览器 ,查看效果

用fiddler抓包看看

到这里已经实现,数据提交到服务器保存了,目前还需要能够把服务器的数据拿回到客户端页面上,并显示

但是我们在浏览器上能看到显示的数据啊,为啥还要从服务器拿消息?

1.当前页面上显示的数据,也是在浏览器中内存保存的。

一旦 刷新或者 重新打开,之前的内容就没了

2.最期望的是,其他的客户端打开页面也是有数据的

5)客户端收到响应,就需要针对响应数据进行解析处理

把响应中的信息,构造成页面元素,并显示出来(需要拼接出html片段)

现在刷新浏览器,原有的数据还能保存,不会消失了

新开浏览器之后,之前的数据也还是在的

6)整个逻辑梳理

三、存储到数据库中

由于刚才的后端代码实现是存储到浏览器内存中,当重新启动smart servlet后,原来的数据又会消失不见

1)把数据库引入到代码中(引入依赖)

选择版本5.1.47

2)建库建表

建库建表需要用到sql,都可以写到文件中。后续如果需要把表啥的往其他的机器上迁移,建表操作就会比较方便

在main目录里创建一个sql文件(文件名可以随便起,db.sql)

将这段代码复制到mysql里,创建好库和表

并插入两条数据

3)编写数据库代码

JDBC

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;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 javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;class Message{//这里定义的类,要与前端 定义的格式 匹配public String from;public String to;public String message;@Overridepublic String toString() {return "Message{" +"from='" + from + '\'' +", to='" + to + '\'' +", message='" + message + '\'' +'}';}
}
@WebServlet("/message")
public class MessageServlet extends HttpServlet {private ObjectMapper objectMapper = new ObjectMapper();//引入数据库之后,下面这个就不需要了
//    private List<Message> messageList = new ArrayList<>();//创建数据库的 数据源private DataSource dataSource = new MysqlDataSource();@Overridepublic void init() throws ServletException {//1.初始化数据源((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");//设置数据库的用户((MysqlDataSource)dataSource).setPassword("123456");//设置数据库用户密码}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.读取前端发来的数据,把这个数据保存到服务器这边Message message = objectMapper.readValue(req.getInputStream(),Message.class);System.out.println("请求中收到的message:" + message);//2.存储数据:最简单的办法,//方法1:直接在内存中保存,可以使用一个集合类,把所有收到的message 都存到内存中//并非很合理的办法,因为一旦重启服务器,数据就丢失了//相比之下,把数据持久化存储到数据库中,更科学//messageList.add(message);//引入数据库后,这个内存临时保存的数据也可以不要了// TODO 插入数据库//方法2:引入数据库(最可靠)try {save(message);} catch (SQLException e) {throw new RuntimeException(e);}//3.返回一个响应resp.setStatus(200);resp.getWriter().write("ok");//对应前端的 回调函数 中的 responseBody
//        resp.setContentType("application/json; charset=utf8");//对应前端的 json格式
//        resp.getWriter().write("{ok:true}");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//通过这个方法来处理当前获取消息的列表的get请求,不需要解析参数,直接返回resp.setStatus(200);resp.setContentType("application/json; charset=utf8");//TODO 从数据库查询List<Message> messageList = null;try {messageList = load();} catch (SQLException e) {throw new RuntimeException(e);}String respJson = objectMapper.writeValueAsString(messageList);//将message这个存储的表的内容,转换成json字符串resp.getWriter().write(respJson);//返回响应}private void save(Message message) throws SQLException {//通过这个方法 把message 插入到数据库中
//        //1.创建数据源
//        DataSource dataSource = new MysqlDataSource();
//        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");
//        ((MysqlDataSource)dataSource).setUser("root");//设置数据库的用户
//        ((MysqlDataSource)dataSource).setPassword("123456");//设置数据库用户密码//2.建立连接(connection是java.sql里的对象)Connection connection = dataSource.getConnection();//需要抛出异常//3.构造sqlString sql = "insert into message values(?,?,?)";//?是占位符PreparedStatement statement = connection.prepareStatement(sql);//构造sql语句对象statement.setString(1, message.from);//第一个占位符?替换成fromstatement.setString(2, message.to);//第二个占位符?替换成tostatement.setString(3, message.message);//第三个占位符?替换成message//4,执行sqlstatement.executeUpdate();//5.回收资源statement.close();connection.close();}private List<Message> load() throws SQLException {//通过这个方法从数据库读取到message//1.创建数据源(init方法里写了)//2.建立连接Connection connection = dataSource.getConnection();//3.构造sqlString sql = "select * from message";//查询这个表的sql语句PreparedStatement statement = connection.prepareStatement(sql);//将这个sql语句构造成一个sql语句对象//4.执行sql语句,放入到result集合里ResultSet resultSet = statement.executeQuery();//5.遍历结果集合List<Message> messageList = new ArrayList<>();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);}//6.回收资源connection.close();statement.close();resultSet.close();//7.返回messageListreturn messageList;}
}

重启smart tomcat 看到之前在数据库插入的信息还保存着在,并且显示到浏览器上了

输入了一个新的数据

在数据库中 也能查到

 

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

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

相关文章

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper&#xff1a; 下载地址 解压&#xff0c;并进入bin目录&#xff0c;启动 如果闪退可以编辑脚本&#xff0c;在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg&#xff0c;就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

前端网络 --- http缓存

什么是http缓存&#xff1f; 1、HTTP 缓存会存储与请求关联的响应&#xff0c;并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本&#xff0c;当用户再次发起相同请求时&#xff0c;判断缓存是否命中&#xff0c;如果命中则将前面的响应…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 &#xff1a; S o r t i n g I t A l l O u t eg1&#xff1a;Sorting\ It\ All\ Out eg1&#xff1a;Sorting It All Out ( 蓝书例题&#xff0c;传递…

软硬链接与动静态库

文章目录 1.软硬链接2.动态库和静态库2.1 见一见库2.2 动静态库2.2.1 静态库2.2.2 动态库 2.3 动静态库的对比 3.真实的应用场景(ncurses库)4.库加载---可执行程序和地址空间4.1可执行程序的加载4.2 库的加载 1.软硬链接 2.动态库和静态库 2.1 见一见库 我们用过很多库。C/C的…

如何节约上架时间,小程序管理平台推荐

继微信正式推出微信小程序后&#xff0c;各个大厂陆续发布了各自的小程序平台 —— 支付宝小程序、百度小程序、头条小程序&#xff0c;各家不同的小程序标准一度让开发者们激情开骂&#xff0c;虽然目前跨平台的小程序开发可以通过taro、mpvue、kbone等跨平台开发框架来解决&a…

车载摄像头智能颜色校正解决方案,卓越画质新体验

随着智能交通和自动驾驶技术的快速发展&#xff0c;车载摄像头作为车辆感知外界环境的重要部件&#xff0c;其画面质量对于行车安全和用户体验至关重要。然而&#xff0c;由于光线变化、设备差异以及拍摄环境复杂多变&#xff0c;车载摄像头拍摄的画面往往会出现颜色失真、对比…

管理 nodejs 版本工具 nvm

nvm 方便切换不同版本的 node 及 对应的 npm 版本 一、安装nvm nvm官网 &#xff08;内含下载的文件&#xff0c;点击进去下载&#xff0c;并按照 网站文档步骤 操作即可&#xff09; 二、nvm 基础命令 nvm arch&#xff1a;显示node是运行在32位还是64位。nvm install <…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色。为了确保 API 的可靠性和性能&#xff0c;开发人员需要一种高效的方式来测试和调试它们。这方面的工具&#xff0c;大家经常用到的应该就是 postman 了。不过&#xff0c;今天想要给…

[Qt网络编程]之获取基本网络信息

前言 获取主机的网络地址和接口信息是进行网络编程的第一步&#xff0c;也是网络编程的基础。Qt提供了网络接口类 QNetworkInterface、网络地址人口类 QNetworkAddressEntry 和主机地址类 QHostAddress 来获取和使用地址信息。其中网络接口类 QNetworkInterface 描述了主机的卫…

短信防刷之滑动验证码

前言&#xff1a;最近想写一个滑动验证码&#xff0c;前台的样式虽然很好看&#xff0c;但是并不安全&#xff0c;网上也都是一些demo&#xff0c;不是前后台分离的&#xff0c;然后就自己查资料&#xff0c;自己来完成了 滑动验证码 一、为什么要使用滑动验证码 首先&#x…

斯坦福大学2024年人工智能发展和前景全面分析报告

2024 年指数是斯坦福大学迄今为止最全面的指数&#xff0c;恰逢人工智能对社会的影响力达到前所未有的重要时刻。今年&#xff0c;斯坦福大学扩大了研究范围&#xff0c;更广泛地涵盖人工智能的技术进步、公众对该技术的看法以及围绕其发展的地缘政治动态等基本趋势。 完整详细…

onedrive 清理文件历史版本 节省空间

onedrive 清理文件历史版本以节省空间的操作步骤 起因&#xff1a; 用的好好的onedrive高校教育版&#xff0c;突然在2024年4月2日晚上把空间从1T回收到100G&#xff0c;然后文件爆满&#xff0c;虽然没有把文件都给我删了&#xff0c;但是可能几个月窗口期过去就没文件了。而…

2024年——区块链技术进入全新高度

BTC生态蓬勃发展&#xff0c;以太坊的L1和L2模块化重塑智能合约生态。RAAS&#xff08;区块链即服务&#xff09;、Depin、并行EVM等技术的崛起&#xff0c;为区块链应用提供了更高的性能和可扩展性。以太坊再质押成为焦点。技术创新与日俱进&#xff0c;一同探索这个充满活力的…

KVM部署

1、检查虚拟化支持 首先&#xff0c;确认你的系统处理器支持硬件虚拟化&#xff0c;在Linux终端中&#xff0c;使用以下命令&#xff1a; egrep -c (vmx|svm) /proc/cpuinfo2、安装KVM及其工具 yum update yum install qemu-kvm libvirt libvirt-python libguestfs-tools vi…

10-菜刀连接木马

找到了漏洞后&#xff0c;并且上传了木马之后才能使用的两款工具 中国菜刀和冰蝎 想办法获取别人的cookie&#xff0c;cookie中有session-id 一、中国菜刀 1、必须提前已经完成木马植入然后才能使用 2、木马必须是POST请求&#xff0c;参数自定义&#xff0c;在菜刀里给出…

机器学习与深度学习 --李宏毅(笔记与个人理解)Day 20

Day 20 RNN 2 实际使用和其他应用 在实际的学习&#xff08;training&#xff09;过程中是如何工作的&#xff1f; step 1 Loss step 2 training Graindent Descent 反向传播的进阶版 – BPTT CLIpping 设置阈值~ 笑死昨天刚看完关伟说的有这玩意的就不是好东西 Why&#xff1…

C语言趣味代码(一)

C语言相关知识点的博客和大家分享完了&#xff0c;接下来我想开始数据结构相关的博客&#xff0c;在此之前呢&#xff0c;有的小伙伴问过我学完C语言的相关知识&#xff0c;我能干些什么呢&#xff1f;只有刷题吗&#xff1f;这不禁让我反思&#xff1a;在我们学习的过程中&…

远程DCS监控

在数字化、智能化的浪潮中&#xff0c;工业控制系统正迎来前所未有的变革。分布式控制系统&#xff08;DCS&#xff09;作为工业自动化领域的核心&#xff0c;其稳定运行对于企业的生产效率和安全至关重要。而远程DCS监控作为实现工业自动化、智能化管理的关键一环&#xff0c;…

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于&#xff0c;当集合发生变化时&#xff0c;能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了&#xff0c;要么就…