表白墙(前端+后端+数据库)

news2024/10/5 14:00:02

目录

一、创建项目

1、创建maven项目,引入依赖

2、创建目录结构

二、前端代码

1、页面内容和样式

2、提交按钮的点击事件

3、发送GET请求

三、数据库

四、后端代码

1、重写doPost方法

1.1 创建Message类

1.2 重写doPost方法

1.3 实现save方法

2、重写doGet方法

1、重写doGet方法

2、实现load方法

五、查看结果

1、查看POST请求

2、查看GET请求


一、创建项目

1、创建maven项目,引入依赖

2、创建目录结构

 

二、前端代码

前端代码中主要实现页面的内容和样式,以及通过ajax向服务器发送请求:

(1) 点击提交按钮,向服务器发送一个提交数据的POST请求,服务器收到请求后,把数据保存到数据库中;

(2) 重新加载页面时,向服务器发送一个获取数据的GET请求,服务器收到请求后,返回数据库中的数据,再由浏览器把这些数据显示在页面上。

1、页面内容和样式

    <style>
        .container {
            width: 400px;
            margin: 0 auto;
        }
        .title {
            text-align: center;
        }
        .ps {
            height: 20px;
            text-align: center;
            color: gray;
        }
        .row {
            height: 40px;
            display: flex;
            /*水平居中*/
            justify-content: center;
            /*垂直居中*/
            align-items: center;
        }
        .row span {
            font-size: larger;
            width: 100px;
        }
        .row input {
            height: 30px;
            width: 250px;
        }
        .row button {
            height: 40px;
            width: 360px;
            color: white;
            background-color: orange;
            border: none;
            border-radius: 5px;
        }
        .row button:active {
            background-color: rgb(152, 146, 146);
        }

    </style>
    <div class="container">
        <h1 class="title">表白墙</h1>
        <div class="ps">输入后点击提交,会将信息显示在表格中</div>
        <div class="row">
            <span>谁:</span><input type="text">
        </div>
        <div class="row">
            <span>对谁:</span><input type="text">
        </div>
        <div class="row">
            <span>说什么:</span><input type="text">
        </div>
        <div class="row"><button>提交</button></div>
    </div>

上述代码实现的页面效果:

 

2、提交按钮的点击事件

    <!-- 引入jquery依赖 -->
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script>
        let button = document.querySelector('button');
        button.onclick = function() {
            //1.获取文本框中的内容
            let messages = document.querySelectorAll('input');
            let from = messages[0].value;
            let to = messages[1].value;
            let message = messages[2].value;
            if(from == "" || to == "" || message == ""){
                return;
            }
            //2.构造html元素
            let element = document.createElement('div');
            element.innerHTML = from+'对'+to+'说:'+message;
            element.className = 'row';
            //3.把构造好的元素添加到后面
            let div = document.querySelector('.container');
            div.appendChild(element);
            //4.清空输入框的内容
            for(let i = 0;i < messages.length;i++){
                messages[i].value = "";
            }

            //创建一个data对象用来存放向服务器提交的数据
            let data = {
                to: to,
                from: from,
                message: message
            };
            //5.点击提交按钮,给服务器发送提交数据请求
            $.ajax({
                type: 'post',
                url: 'message',
                //通过JSON.stringify把data对象转成json格式的字符串
                data: JSON.stringify(data),
                contentType: "application/json;charset=utf8",
                success: function(body){
                    console.log("提交数据成功");
                }
            })
        }
    </script>

3、发送GET请求

    <script>
        let button = document.querySelector('button');
        button.onclick = function() {
            ……
        }
        
        //向服务器发送获取数据请求
        //由于这个请求是在页面加载时就发送的,所以要写在button的点击事件外面
        function getMessages() {
            $.ajax({
                type: 'get',
                url: 'message',
                //jquery会自动把body中的内容(json格式的数组)解析成JS对象数组
                //前提条件是响应的ContentType要设置成"application/json"
                success: function(body){
                    let container = document.querySelector('.container');
                    for(let i = 0;i < body.length;i++){
                        //根据一个数组元素构造一个row
                        let message = body[i];
                        let element = document.createElement('div');
                        //设置构造好的row里的内容
                        element.innerHTML = message.from+'对'+message.to+'说:'+message.message;
                        element.className = 'row';
                        //再把构造好的row放在container后面
                        container.appendChild(element);
                    }
                }
            })
        }
    </script>

三、数据库

(1) 创建一个数据库messageWall:

mysql> create table message(`from` varchar(50), `to` varchar(50), message varchar(1024));

注意:from和to是MySQL中的关键字,需要加上反引号。

(2) 在messageWall中创建一张message表,表中包含from、to、message三列:

 create table message(`from` varchar(50), `to` varchar(50), message varchar(1024));
 desc message;

四、后端代码

首先创建一个MessageWallServlet类来处理客户端发来的请求,然后重写里面的doGet和doPost方法:

@WebServlet("/message")
public class MessageWallServlet extends HttpServlet { 
    //由于mapper对象在多个请求中都会被用到,所以创建为成员对象
    private ObjectMapper mapper = new ObjectMapper();
}

1、重写doPost方法

1.1 创建Message类

当服务器收到一个POST请求时,服务器需要读取请求中的数据并存放到数据库中,所以需要先创建一个Message用来读取并解析请求中的json数据:

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

1.2 重写doPost方法

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //读取请求中的json数据并解析成Message对象
        Message message = mapper.readValue(req.getInputStream(),Message.class);
        //通过调用save方法把message中的数据存到数据库中
        try {
            save(message);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //设置状态码
        resp.setStatus(200);
        //在服务器控制台打印日志
        System.out.println("提交数据成功:"+"from = "+message.getFrom()+
                " to = "+message.getTo()+" message = "+message.getMessage());
    }

1.3 实现save方法

    private void save(Message message) throws SQLException {
        //把数据保存到数据库
        //1.创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/messageWall?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("");
        //2.建立连接
        Connection connection = dataSource.getConnection();
        //3.构造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());
        //4.执行SQL语句
        int ret = statement.executeUpdate();
        System.out.println(ret);
        //5.关闭连接
        connection.close();
        statement.close();
    }

2、重写doGet方法

doGet方法不需要对请求中的内容进行解析处理,只需要查询数据库的数据并返回给客户端即可:

1、重写doGet方法

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //加载数据库中的数据
        List<Message> messageList = null;
        try {
            messageList = load();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //设置状态码
        resp.setStatus(200);
        //设置响应的数据格式和字符集
        resp.setContentType("application/json; charset=utf8");
        //把加载的数据返回给客户端
        resp.getWriter().write(mapper.writeValueAsString(messageList));
    }

2、实现load方法

    private List<Message> load() throws SQLException {
        //从数据库查询数据
        //1.创建数据源
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/messageWall?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("524169");
        //2.建立连接
        Connection connection = dataSource.getConnection();
        //3.构造SQL语句
        String sql = "select * from message";
        PreparedStatement statement = connection.prepareStatement(sql);
        //4.执行SQL语句
        ResultSet resultSet = statement.executeQuery();
        //5.遍历结果集合
        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);
        }
        //6.关闭连接
        connection.close();
        statement.close();
        return messageList;
    }

五、查看结果

1、查看POST请求

浏览器:

POST请求内容:

服务器:

数据库:

2、查看GET请求

请求内容:

响应内容:

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

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

相关文章

你需要知道的50颗卫星:地球卫星清单

开放数据卫星 1陆地卫星 地球资源卫星令人难以置信的长期遗产已经保存了地球40多年的历史。通过无数的应用程序&#xff0c;它甚至发现 island Landsat in Canada。 图片来源&#xff1a;NASA 2哨兵 作为 Copernicus Programme 哨兵的6个任务的舰队是一个游戏改变者。明确地…

2022年经典散文:滚烫的石板

滚烫的石板 ——灵遁者 此刻&#xff0c;我想表达的情愫大概有千万种&#xff0c;如何表达并不容易&#xff0c;就好像一个人的时候&#xff0c;也在面对某个我认识或者不认识的人&#xff0c;话总是说不清&#xff0c;也说不出来。 小孩总是敢于表达的&#xff0c;就像一条没…

.NET 7 的 AOT 到底能不能扛反编译?

一&#xff1a;背景 1.讲故事 在B站&#xff0c;公众号上发了一篇 AOT 的文章后&#xff0c;没想到反响还是挺大的&#xff0c;都称赞这个东西能抗反编译&#xff0c;可以让破解难度极大提高&#xff0c;可能有很多朋友对逆向不了解&#xff0c;以为用 ILSpy,Reflector,DnSpy…

群勃龙-半琥珀酸酯(TR-HS)与BSA牛血清白蛋白偶联 TR-HS-BSA

产品名称&#xff1a;群勃龙-半琥珀酸酯与牛血清白蛋白偶联 英文名称&#xff1a;TR-HS-BSA 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白…

全光谱台灯对孩子眼睛有影响吗?什么样的全光谱台灯真的有用

全光谱台灯对眼睛当然是有影响的&#xff0c;因为光谱成分丰富度与太阳光类似&#xff0c;所以无限接近于太阳光的显色能力&#xff0c;这样的灯光下物体的色差如同沐浴太阳光一般真实&#xff0c;色差不失真&#xff0c;人眼自然就越舒服。 那么什么样的全光谱台灯有用呢&…

Python|excel表格数据一键转json格式小工具|支持xlsx、xls格式转json|【源码+解析】

背景 最近在使用JavaScript编写一些浏览器RPA脚本&#xff0c;脚本使用过程中遇到一些问题&#xff0c;脚本使用的数据往往存放在excel表&#xff0c;但运行时只能读取json数据&#xff0c;导致频繁人工excel转json&#xff0c;效率低下。 遇到问题后赶紧搜索excel转json小工…

基于PHP+MySQL药品信息查询系统(含论文)

本系统阐述了医药信息查询系统的开发过程,并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户注册登录,查看医药资讯,医药查询和在线留言等信息。 本系统技术介绍:php,mysql,apache,notepad,sublime.运行环境wamp,PHPstudy,xammp等php集成环境. …

FastAPI使用typing类型提示

typing是Python标准库&#xff0c;用来做类型提示。FastAPI使用typing做了&#xff1a; 编辑器支持&#xff1b; 类型检查&#xff1b; 定义类型&#xff0c;request path parameters, query parameters, headers, bodies, dependencies等等&#xff1b; 类型转换&#xff1…

去中心化应用的终极是应用链?

互操作性是近期在Web3兴起的概念&#xff0c;是指不同的计算机系统、网络、操作系统和应用程序一起工作并共享信息的能力。随着链上通信、语义交互逐渐复杂&#xff0c;链上用户多样的需求已然超出应用在单条链可承受的技术能力。 原本视作创新实验的Web3应用逐渐被公众接纳&am…

初识变量和数据类型

JavaScript第2天 输入输出语句 输出语句 alert(变量) > 弹出document.write(变量) > 输出在页面上面console.log(变量) > 打印在控制台上 /* JS的输出语句 */ alert("弹出") document.write("直接在写页面上面") console.log("打印在控制…

MacOS 如何选择鼠标不飘滚动平滑

MacOS 如何选择鼠标不飘滚动平滑 前言 今天不务正业的聊聊 macos 下的鼠标的事情&#xff0c;群里也有朋友和我聊&#xff0c;正好说说这事。 我在很长的时间里都在用 macbook pro 的触控板 键盘的高效模式&#xff0c;因为触控板和键盘很近所以效率很高。 但是有一个问题就是…

set和multiset容器

1、基本概念 所有元素在插入时会自动排好序&#xff1b; 属于关联式容器&#xff0c;底层结构是用二叉树实现的 2、set和multiset的区别 set中不允许有重复元素&#xff0c;multiset允许有重复元素。 3、构造和赋值 构造&#xff1a; set<T>st; //默认构造 set&l…

Linux | 进程间通信 | 匿名管道 | 命名管道 | 模拟代码实现进程通信

文章目录进程通信的意义匿名管道通信原理管道的访问控制进程控制管道的特点命名管道进程通信的意义 之前聊进程时&#xff0c;讲过一个性质&#xff0c;即进程具有独立性&#xff0c;两个进程之间的交互频率是比较少的。就连父子进程也只是共享代码&#xff0c;修改父子进程中…

小程序云开发笔记一

一、什么是云开发&#xff1f; 微信官方云原生开发平台&#xff0c;腾讯云的各种能力加持&#xff0c;用云开发开发者可以节省大量的开发时间和运维成本。 二、云开发优势 无需运维&#xff0c;数据变大不需要管理&#xff0c; 弹性伸缩&#xff0c;业务量变大&#xff0c;服…

在一台电脑上安装多个python版本(小白教程)

我自己的办公电脑是64位&#xff0c;好几个同事的电脑还是win7&#xff0c;32位&#xff0c;因此我在写python办公自动化的时候还要考虑32位的python&#xff0c;因此在电脑上安装了两个版本的python&#xff0c;方便测试、打包使用 1、首先&#xff0c;下载两个python&#xf…

代码随想录算法训练营第七天|LeetCode 454. 四数相加 II 、383. 赎金信、 15. 三数之和、18. 四数之和

LeetCode 454. 四数相加 II 题目链接&#xff1a;454. 四数相加 II 分析&#xff1a; 本题比较简单&#xff0c;因为是无关的四个数组&#xff0c;所以不需要考虑去重&#xff0c;所以用哈希比较简单 思路&#xff1a; 定义个无序map先将nums1和nums2的和的数都存进去&…

单目标应用:世界杯优化算法(World Cup Optimization,WCO)求解单仓库多旅行商问题SD-MTSP(可更改旅行商个数及起点)

一、世界杯优化算法 世界杯优化算法&#xff08;World Cup Optimization&#xff0c;WCO)由Navid Razmjooy等人于2016年提出&#xff0c;该算法模拟了国际足联世界杯比赛&#xff0c;思路新颖&#xff0c;收敛速度快&#xff0c;全局寻优能力强。 算法原理参考&#xff1a;智…

[附源码]java毕业设计学生宿舍管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

新型智能优化算法——海鸥优化算法(基于Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

基于莱维飞行扰动策略的麻雀搜索算法(ISSA)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…