Java项目——表白墙(前后端连接+数据库存储)

news2025/1/11 7:12:24

前端的表白墙实现代码在之前的博客中有

Message类

表白墙中的每一个表白信息都由Message对象呈现,其包含form——表白者,to——被表白者,message——表白信息,以及一系列get和set方法

public class Message {
    private String from;
    private String to;
    private String message;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

messageWall.html

相对于前端实现的版本,这次的messageWall中添加了使用ajax实现用post向服务器提交数据,从后端加载表白信息的方法,使用ajax实现用get向服务器获取数据,并将数据添加到dom树上,让前端可以展现新的数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div class="container">
        <h1>表白墙</h1>
        <p>输入后点击提交,会将信息显示在表格中</p>
        <div class="row">
            <span>表白者</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>被表白者</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <span>表白信息</span>
            <input type="text" class="edit">
        </div>
        <div class="row">
            <input type="button" value="提交" class="submit">
        </div>
    </div>

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            width: 400px;
            margin: 0 auto;
        }

        h1 {
            text-align: center;
            padding: 20px 0;
        }

        p {
            color: grey;
            text-align: center;
            font-size: 15px;
            padding: 10px 0;
        }

        .row {
            height: 40px;
            display: flex;
            justify-content: center;
            align-items: center;
        }

        span {
            width: 100px;
            line-height: 40px;
        }

        .edit {
            width: 200px;
            height: 30px;
        }

        .submit {
            width: 300px;
            height: 40px;
            color: black;
            background-color: orange;
            border: none;
        }
    </style>

    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>

    <script>
        let button = document.querySelector('.submit');
        button.onclick = function() {
            let edits = document.querySelectorAll('.edit');
            let from = edits[0].value;
            let to = edits[1].value;
            let message = edits[2].value;
            if(from == '' || to == '' || message == ''){
                alert("不能提交空的内容!!!")
                return;
            }
            let row = document.createElement('div');
            row.className = 'row';
            row.innerHTML = from + '向' + to + '表白说:' + message;
            let container = document.querySelector('.container');
            container.appendChild(row);
            for(let i = 0; i < 3; i++){
                edits[i] = '';
            }

            let data = {
                "from": from,
                "to": to,
                "message": message
            }

            $.ajax({
                type: 'post',
                url: 'message',
                data: JSON.stringify(data), //js中将对象转换为字符串
                contentType: "application/json; charset=utf8",
                success: function(body){
                    console.log("提交数据成功");
                }
            })
        }

        function getMessage(){
            $.ajax({
                type: 'get',
                url: 'message',
                success: function(body){
                    let container = document.querySelector('.container')
                    for(let i = 0; i < body.length; i++){
                        // 此处得到的 body 已经是一个 js 对象的数组了,ajax 自动帮我们进行类型转换了,本来服务器返回的是 JSON 格式的字符串, 
                        // ajax 会自动的根据 Content-Type 为 application/json.对响应的 body 进行解析, 解析成 js 对象,遍历数组的元素, 把内容构造到页面上.
                        let message = body[i];
                        let row = document.createElement('div');
                        row.className = 'row';
                        row.innerHTML = message.from + '对' + message.to + '说' + message.message;
                        container.appendChild(row);
                    }
                }
            })
        }
        getMessage();
    </script>
</body>
</html>

mysql中的message表

和Message类采用相同的属性命名,类型都是varchar(1024)
在这里插入图片描述

MessageServlet

load方法

和数据库进行连接,将查询到一行表白信息转换成message对象,存储在messageList中并返回

save方法

和数据库进行连接,将参数中的message对象中的三个属性转换为message表中的一行数据,插入到数据库中

doGet方法

调用load方法,获得数据库中的数据,转为messageList,使用上一篇博客中的Jackson的方法将messageList转为json格式发送到前端

doPost方法

得到前端传递过来的json数据,将其转为message对象,调用save方法,将其存储在数据库中,设置状态码为200,打印数据

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.Connection;
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.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Message> messageList = null;
        try {
            messageList = load();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        resp.setContentType("application/json; charset=utf-8");
        resp.getWriter().write(objectMapper.writeValueAsString(messageList));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
        try {
            save(message);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        resp.setStatus(200);
        System.out.println("提交数据成功!" + "form:" + message.getFrom() + " to:" + message.getTo() + " message:" + message.getMessage());
    }

    private void save(Message message) throws SQLException {
        //数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("Lx20030830");

        //建立连接
        Connection connection = (Connection) dataSource.getConnection();

        //构造sql语句
        String sql = "insert into message values(?, ?, ?)";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,message.getFrom());
        statement.setString(2,message.getTo());
        statement.setString(3, message.getMessage());

        //执行插入操作
        int ret = statement.executeUpdate();
        System.out.println("ret: " + ret);

        //关闭连接
        statement.close();
        connection.close();
    }

    private List<Message> load() throws SQLException {
        //数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("Lx20030830");

        //建立连接
        Connection connection = (Connection) dataSource.getConnection();
        String sql = "select * from message";
        PreparedStatement statement = connection.prepareStatement(sql);

        //执行查询操作
        ResultSet resultSet = statement.executeQuery();

        //将查询到的信息保存在messageList中
        List<Message> messageList = new ArrayList<>();
        while(resultSet.next()){
            Message message = new Message();
            message.setFrom(resultSet.getString("from"));
            message.setTo(resultSet.getString("to"));
            message.setMessage(resultSet.getString("message"));
            messageList.add(message);
        }

        statement.close();
        connection.close();
        return messageList;
    }
}

项目展示

在这里插入图片描述
当点击提交按钮是,数据发送给服务器,服务器处理数据存储在数据库中
在这里插入图片描述
然后,服务器获取数据库中的数据,以json格式发送给前端,前端将其展示在页面上
并且,不论是刷新页面还是重启服务器,数据都不会消失了

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

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

相关文章

我是如何构建自己的笔记系统的?

我是如何构建自己的笔记系统的? 关于笔记系统的重要性互联网上有许多的资料, 我这里将不再赘述. 下面我将直接介绍我的笔记从记录到整理文章发布的所有详细步骤和工具 我的笔记系统可能并不完善, 而且带着极强的个人倾向性, 只希望它能提供给你一种思考的方向 原文地址: https…

ArrayList 可以完全替代数组吗?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好&#xff0c;我是小彭。 在前面的文章里&#xff0c;我们学习了很多数据结构与算法思想…

【Nacos案例】

0、整体 整体项目概览 整体服务概览 1、新建父工程demo-nacos 删除src &#xff0c;切记 packaging&#xff1a;pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"ht…

[Apollo Cyber RT] Timer实现

Timer的实现方式 Timer有多种实现方式&#xff0c;CyberRT采用了时间轮(TimingWheel)方式。关于Timing Wheels的详细描述可以参考附录的链接。此处不赘述。 CyberRT Timer的类构成 实现细节 Timer Timer类是门户&#xff0c;但定时器真正的核心是TimingWheel。 Timer的定义…

索引的基础使用

索引&#xff1a; 分类&#xff1a; 功能逻辑&#xff1a;普通索引、唯一索引、主键索引、全文索引物理实现方式&#xff1a;聚簇索引&#xff0c;非聚簇索引作用字段个数&#xff1a;单列索引&#xff0c;联合索引 索引创建&#xff1a; --主键索引 CREATE TABLE dept( de…

SpringBoot的使用

一、Maven的环境搭建 暂时未完成.... 二、创建项目 创建完以后的目录如下&#xff1a; 然后配置pom.xml 再放入配置项 <!-- 2 我的依赖仓库源 , 首先配置仓库的服务器位置,首选阿里云&#xff0c;也可以配置镜像方式&#xff0c;效果雷同 --><repositories><re…

章节四:RASA 训练数据介绍

一、前言 一般来说&#xff0c;机器人可以跟人对话&#xff0c;机器人说什么是最难的&#xff0c;顶多是人工编写几种规则和模版来回复即可。但是要让机器人理解人的意图&#xff0c;确实非常难的事情。因为语言具有多样性&#xff0c;多义词&#xff0c;一语双关&#xff0c;…

872. 最大公约数(史上最详细讲解 7种算法,STL+算法标准实现)

一&#xff0c;什么是最大公约数 最大公约数&#xff08;Greatest Common Divisor&#xff09;指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子&#xff0c;a&#xff0c; b的最大公约数记为&#xff08;a&#xff0c;b&#xff09;&#xff0c;同样的&…

测试架构工程师需要具备哪些能力 ?

目录 前言 为什么软件项目需要架构设计&#xff1f; 测试架构师需要解决什么问题&#xff1f; 测试架构师需要具备哪些能力&#xff1f; 测试工程师如何培养架构能力&#xff1f; 总结 重点&#xff1a;配套学习资料和视频教学 前言 相比于我们常见的研发架构师&#xf…

深入ftrace kprobe原理解析

Linux krpobe调试技术是内核开发者专门为了编译跟踪内核函数执行状态所涉及的一种轻量级内核调试技术&#xff0c;利用kprobe技术&#xff0c;内核开发人员可以在内核的绝大多数指定函数中动态插入探测点来收集所需的调试状态信息而基本不影响内核原有的执行流程。本章的是基于…

Spring-Mybatis整合 | 原理分析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文章目录▌环境搭建▌Mybatis流程回顾▌Mybatis-Spring整合SqlSessionTemplate方式SqlSessionTemplate分析configLocation & mapperLocations分析SqlSessionDaoSu…

ERD Online 4.0.3数据库在线建模(免费、更美、更稳定)

ERD Online 4.0.3❝ 全新升级&#xff0c;团队功能、权限管理、更美更稳定从这个版本&#xff0c;我们隆重推出低代码设计平台LOCO&#xff0c;见下文❞发展里程碑 4.0.3改动一览 功能完善 个人项目 个人项目即原有的项目管理&#xff0c;每个账号只能编辑自己的「个人项目」。…

linux下自动构建工具make:makefile

文章目录make/makefile介绍makefile的核心规则makefile的寻找规则makefile的伪目标什么是makefile&#xff1f;大多数人都应该是不太清楚的&#xff0c;因为现在人们基本都用着非常好的适合自己的IDE&#xff0c;而IDE为人们做了makefile该做的&#xff0c;从而导致大多数人并不…

同花顺_代码解析_技术指标_O

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 OBOS OBV OBVFS OI指标 OSC OBOS 超买超卖指标 大盘指标。 输出超买超卖指标:上涨家数-下跌家数的N日异同移动平均 输出MAOBOS:OBOS的M日简单移动平均 1.指标上升至80时为超买&…

第2章 数据结构中栈与队列的概念

文章目录文档配套视频讲解链接地址第02 章 栈与队列2.1 栈与队列的框图2.2 栈1. 栈的概念2. 顺序栈3. 实例11 顺序栈4. 实例12 链式栈2.3 队列1. 队列的概念2. 顺序队列3. 实例13 顺序队列4. 链式队列5. 实例14 链式队列2.4 实例15 球钟问题2.5 队列与栈的转换1. 实例16 顺序的…

基于Labview的图像傅里叶变换研究-含Labview程序

⭕⭕ 目 录 ⭕⭕一、说明二、基于Labview的图像傅里叶变换研究三、Labview源程序下载一、说明 订阅该专栏后&#xff0c;可获取该专栏内的任意一份代码&#xff0c;请及时私信博主获取下载链接。 从该专栏获取的程序&#xff0c;博主有责任并将保证该程序能在您电脑上完整运行…

初识Spring框架~控制反转IoC、依赖注入DI以及Spring项目的创建方式

目录 Spring框架初识 Spring IoC IoC(控制反转) DI(依赖注入) Spring项目的创建 创建一个maven项目 配置XML文件 添加启动类 简单了解Bean对象的存储与获取 创建一个Spring IoC容器 注册Bean对象 获取并使用Bean对象 Spring框架初识 通常所说的Spring是指Spri…

java知识梳理 第十五章 I/O流

一、文件 1.1 文件流 值得一提的是&#xff0c;这里的流的概念是围绕java程序展开的 1.2 常用的文件操作 1.2.1 创建文件对象相关构造器和方法 代码演示如上&#xff0c;读者可自行实验 1.2.2 获取文件的相关信息 代码演示如上&#xff0c;读者可自行实验 1.2.3 目录的操作和删…

NodeJs实战-待办列表(6)-前端绘制表格显示待办事项详情

NodeJs实战-待办列表6-前端绘制表格显示待办事项详情定义服务器返回的 json 数据前端绘制动态表格后端返回列表数据验证执行添加查看数据库中的数据是否与页面一致使用浏览器debug表格绘制过程项目地址前面几节显示的列表&#xff0c;看不到事项创建时间&#xff0c;完成时间&a…

springmvc-day03

springmvc-day03 第一章 拦截器 1.概念 1.1 使用场景 1.1.1 生活中坐地铁的场景 为了提高乘车效率&#xff0c;在乘客进入站台前统一检票&#xff1a; 1.1.2 程序中的校验登录场景 在程序中&#xff0c;使用拦截器在请求到达具体 handler 方法前&#xff0c;统一执行检…