服务器版本的表白墙

news2024/9/19 10:37:02

目录

1.步骤

2.提供两个接口:

3.流程

4.代码

1.前端代码

2.sql创建表

3.后端代码

MessageServlet.java

DBUtil.java


1.步骤

1.约定前后端交互的接口

2.开发服务器代码

        a.编写servlet处理前端发来的请求

        b.编写数据库代码,存储获取关键的数据

3.开发客户端代码

        a.基于ajax构造请求,解析响应

        b.点击按钮后,触发给服务器发送请求的行为

2.提供两个接口:

1.告诉服务器当前留言的是什么样的数据(当用户提交按钮时,会给服务器器发送一个Http请求,让服务器能把消息存下来)

2.从服务器获取到当前有哪些留言数据(当页面加载,就从服务器获取曾经存储的信息内容)

3.流程

 

1.登录页面

2.GET请求处理

 

3.Tomcat服务器提交post请求,输入信息

 

4.接收post请求,返回响应

 

 

5.无论怎么刷新,内容都在

 

 

4.代码

1.前端代码

在代码中加入ajax

1.点击按钮提交,要构造数据发送服务器       

2.页面加载时,从服务器获取消息列表,在页面显示

<!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>表白墙</title>
</head>
<body>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .container{
            width: 100%;

        }
        h3{
            text-align: center;
            /* 上下边距20  左右0 */
            padding: 20px 0;
            font-size: 24px;
        }
        p{
            text-align: center;
            color: #999;
            padding: 10px 0;
        }
        .row{
            width: 400px;
            height: 50px;
            /*  元素居中*/
            margin: 0 auto;
            display:flex;
            justify-self:center;
            align-items: center;
        }
        /* 对齐 */
        .row span{
            width:100px;
            font-size: 20px;
        }
        .row input{
            width: 300px;
            height: 40;
            line-height: 40px;
            font-size: 20px;
            /* 缩进 */
            text-indent: 0.5em;
            /* 去掉轮廓线 */
            outline: none;
        }
        .row #submit{
            width: 200px;
            height: 40px;
            font-size: 20px;
            line-height: 40px;
            margin: 0 auto;
            color: white;
            background-color: orange;
            border: none;
            border-radius: 10px;
        }
        .row #submit:active{
            background-color:grey;
        }
    </style>
    <div class="container">
        <h3>表白墙</h3>
        <p>输入后点击提交, 会将信息显示在表格中</p>
        <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  id="submit">提交</button>
        </div>
    </div>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
     
    <script>
        //页面加载时,从服务器获取消息列表,在页面显示
        function getMessages(){
            $.ajax({
                type:'get',
                url:'message',
                success:function(body){
                    let container=document.querySelector(".container");
                    for(let message of body){
                        let div=document.createElement('div');
                        div.innerHTML=message.from+'对'+message.to+'说:'+message.message;
                        div.className='row';
                        container.appendChild(div);
                    }
                }
            });
        }
        getMessages();

        //当点击submit会获取input的内容,把内容构成成div插入到页尾
        let submitBtn=document.querySelector('#submit');
        submitBtn.onclick=function(){
            //1.获取内容
            let inputs=document.querySelectorAll('input');
            let from=inputs[0].value;
            let to=inputs[1].value;
            let msg=inputs[2].value;
            if(from=='' || to=="" || msg==""){
                //用户没有填写完,先不提交数据
                return;
            }
            //2.生成新的div,把div加入的页面
            let div=document.createElement('div');
            div.innerHTML=from+'对'+to+'说:'+msg;
            div.className='row';
            let container=document.querySelector('.container');
            container.appendChild(div);
            //3.清空之前输入框的内容
            for(let i=0;i<inputs.length;i++){
                inputs[i].value='';
            }

             //4.把当前的输入框的内容,构造成HTTP post请求,通过ajax发给服务器
             let body={
                from:from,
                to:to,
                message:msg
             };
             //点击按钮提交,要构造数据发送服务器
             $.ajax({
                type:'post',
                url:'message',
                contentType:'appliaction/json;charset=utf8',
                data:JSON.stringify(body),
                    success:function(body){
                        alert("消息提交成功");
                    },
                    error:function(body){
                        alert("消息提交失败");
                    }
                
             });
        }
    </script>
</body>
</html>

2.sql创建表

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

3.后端代码

MessageServlet.java

1.创建Message类,成员变量(from,to,message)

2.doPost()处理提交消息请求

        1.输入字符流转成java对象

        2.通过save方法存入数据库

        3.通过contentType告知页面,返回的数据是json格式

        4.输出

3.doGet()获取消息列表,把内容返回给客户端

        1.从load方法中得到从数据库中得到的信息

         2.把java对象转成json格式

         3.返回数据类型,输出

4.保存消息到数据库

        1.和数据库建立连接

        2.构造SQL语句

        3.执行SQL

        4.关闭

5.从数据库中获取信息

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


@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    private ObjectMapper objectMapper=new ObjectMapper();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Message message=objectMapper.readValue(req.getInputStream(),Message.class);
        save(message);
        resp.setContentType("application/json;charset=utf8");
        resp.getWriter().write("{\"ok\":true}");
    }



    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Message> messages=load();
        String jsonString=objectMapper.writeValueAsString(messages);
        System.out.println("jsonString"+jsonString);
        resp.setContentType("application/json; charset=utf8");
        resp.getWriter().write(jsonString);
    }
    private void save(Message message) {
        Connection connection=null;
        PreparedStatement statement=null;
        try {
            connection=DBUtil.getConnection();
            String sql="insert into message values(?,?,?)";
            statement= connection.prepareStatement(sql);
            statement.setString(1,message.from);
            statement.setString(2,message.to);
            statement.setString(3,message.message);
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }
    }
    private List<Message> load() {
        List<Message> messages=new ArrayList<>();
        Connection connection=null;
        PreparedStatement statement=null;
        ResultSet resultSet=null;
        try {
            connection=DBUtil.getConnection();
            String sql="select*from message";
            statement= connection.prepareStatement(sql);
            resultSet=statement.executeQuery();
            while(resultSet.next()){
                Message message=new Message();
                message.from=resultSet.getString("from");
                message.to=resultSet.getString("to");
                message.message=resultSet.getString("message");
                messages.add(message);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,resultSet);
        }
        return messages;
    }

}

DBUtil.java

1.构造对象

2.初始化事件源,懒汉模式的线程,要进行三步操作

3.连接

4.关闭

public class DBUtil {
    private static final String URL="jdbc:mysql://127.0.0.1:3306/java1?characterEncoding=utf8&useSSL=false";
    private static final String USERNAME="root";
    private static final String PASSWORD="123456";

    private volatile static DataSource dataSource=null;
    private static DataSource getDataSource(){
        if(dataSource==null){
            synchronized (DBUtil.class){
                if(dataSource==null){
                    dataSource=new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setUrl(URL);
                    ((MysqlDataSource)dataSource).setUser(USERNAME);
                    ((MysqlDataSource)dataSource).setPassword(PASSWORD);
                }
            }
        }

        return dataSource;
    }


    public static Connection getConnection() throws SQLException {
        return getDataSource().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();
            }
        }
    }

}

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

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

相关文章

java学习中遇到的问题及解答

你好&#xff0c;我想问一下&#xff0c;为什么在idea编译环境下&#xff0c;有异常的地方它会报错&#xff0c;让你主动添加抛出错误代码呢&#xff1f; 在Java中&#xff0c;有两种类型的异常&#xff0c;一种是受检异常&#xff08;checked exception&#xff09;&#xff0…

一级结构规范 合集

极限状态设计原则4.1限态4.11 极限状态可分为承载能力极限状态、正常使用极限状态和耐久性极限状态。极限状态应符合下列规定:1当结构或结构构件出现下列状态之一时&#xff0c;应认定为超过了承载能力极限状态;1) 结构构件或连接因超过材料强度而破坏&#xff0c;或因过度变形…

安捷伦E4433B信号发生器

E4433B Agilent E4433B ESG-D系列 4G信号发生器安捷伦250kHz-4GHz 品  牌&#xff1a; Agilent 简单介绍 频率范围&#xff1a; E4430B 250K-1GHz E4431B 250K-2GHz E4432B 250K-3GHz E4433B 250K-4GHz 18320918653 供单信道和多信道CDMA用的测量卡用于I和Q的20 MH…

第六章 建造者模式

文章目录 前言一、传统方式解决盖房子需求完整代码抽象房子类 AbstractHouse实现子类 普通房子实现子类 高楼大厦客户端盖房子 二、引入建造者模式建造者模式的四个角色&#xff1a; 产品、抽象建造者、具体建造者、指挥者完整代码House类 (产品角色)抽象父类&#xff08;抽象建…

Node内置模块 【Event事件模块】

文章目录 &#x1f31f;前言&#x1f31f;Event事件模块&#x1f31f;EventEmitter类&#x1f31f;加载events模块&#x1f31f;实例化eventEmitter对象 &#x1f31f;事件方法列表&#x1f31f;使用事件&#x1f31f;异步与同步 &#x1f31f;写在最后 &#x1f31f;前言 哈喽…

ZLMeidiaKit实现推流时(FFmpeg推rtmp流)时非127.0.0.1被拒绝需要鉴权的解决方式

场景 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放: 开源流媒体服务器ZLMediaKit在Windows上运行、配置、按需拉流拉取摄像头rtsp视频流)并使用http-flv网页播放_霸道流氓气质的博客-CSDN博客 在上面搭建ZLMedia…

CE作业(3)

1.基于域名[www.openlab.com](http://www.openlab.com)可以访问网站内容为 welcome to openlab!!! ​ 2.给该公司创建三个子界面分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于[www.openlab.com/student](http://www.openlab.com/student) 网站访问学生信息&…

windows和linux上证书的增删查

文章目录 引言windows上对个人证书的增删查创建证书证书的查找证书的删除证书的安装 Linux上对个人证书的增删查创建证书证书的安装证书的查看证书的删除 Linux上对系统证书的增删查 引言 PS: 我之前看过《图解密码技术》&#xff0c;已经对证书这些概念有基本的了解&#xff…

Docker容器---dockerfile简介

Docker容器---dockerfile简介 一、dockerfile概念1、dockerfile介绍2、基于dockerfile创建3、docker镜像加载原理 二、镜像的创建1、基于现有镜像创建2、基于本地模板创建3、基于dockerfile创建 三、Dockerfile编写1、dockerfile操作指令&#xff08;1&#xff09;FROM 镜像&am…

9. 自注意力机制(Self-attention Part2)

P27 自注意力机制&#xff08;Self-attention Part2&#xff09; 视频链接 P27 自注意力机制&#xff08;Self-attention Part2&#xff09; 计算流程&#xff1a; Multi-head&#xff1a; 应用&#xff1a;

数据结构入门篇:第一篇

数据结构入门篇&#xff1a;第一篇 时间复杂度 数据结构入门篇&#xff1a;第一篇1.时间复杂度2.时间复杂度的练习总结 &#x1f914;首先&#xff0c;为什么要学数据结构&#xff1f; 数据结构的概念&#xff1a;在内存中对数据进行管理&#xff1b; 数据结构的学习能让我们在…

C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图

最终效果&#xff1a; V1.8.2 20230419 文字生成单色BMP图片4.exe 默认1280*720 如果显示不全&#xff0c;请把宽和高加大 字体加大。 首先&#xff0c;用windows画板生成一张1*1白色单色图作为标准&#xff0c;数据如下&#xff1a; 数据解析参考&#xff1a;BMP图像文件完…

【K8S系列】深入解析StatefulSet(二)

序言 那些看似不起波澜的日复一日&#xff0c;一定会在某一天让你看见坚持的意义。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一个容器编排平…

用梯度下降的方式来拟合曲线

文章目录 1. 简述2. 理论原理以二次函数为例整体的梯度下降步骤&#xff1a; 3. 编码实现初始化权重矩阵计算损失和梯度更新权重 4. 结果首先对上一篇文章中的真实数据拟合。测试拟合高次曲线方程数据是2阶的&#xff0c;拟合方程是2阶的数据是4阶的&#xff0c;拟合方程也是4阶…

3年自动化测试(心路历程),从月薪10k到30k我经历了什么?

前言 2018年的时候&#xff0c;由于项目的原因&#xff0c;开始使用Robot Framework测试框架&#xff0c;正因为有Python的基础所以很快就理解了Robot Framework框架的工作原理&#xff0c;并可以根据项目的需要开发系统关键字。2019年随着移动App越来越流行&#xff0c;乘着换…

HTML5超链接和图片基础用法

一、HTML5 超链接&#xff08;链接&#xff09; 超链接可以是一个文本&#xff0c;也可以是一幅图像&#xff0c;您可以点击这些内容来跳转到新的页面或新的文档或者当前文档中的某个部分。 当您把鼠标指针移动到网页中的某个链接上时&#xff0c;箭头会变为一只小手。 1.我…

MATLAB | MATLAB配色不够用,近2000款配色来啦

MATLAB绘图配色不够多&#xff1f;很多python\R语言绘图包都会带着好几套配色方案&#xff0c;比如很常见的ggsci绘图包就自带45套离散配色&#xff0c;于是本工具收集了常见55个绘图包中的离散配色&#xff0c;制作出了这个包含了1967套配色的离散配色包slanCL。 基本使用 以…

机器学习(二):线性回归之梯度下降法

文章目录 专栏导读1、梯度下降法原理2、梯度下降法原理代码实现3、sklearn内置模块实现专栏导读 ✍ 作者简介:i阿极,CSDN Python领域新星创作者,专注于分享python领域知识。 ✍ 本文录入于《机器学习案例》,本专栏精选了经典的机器学习算法进行讲解,针对大学生、初级数据分…

CleanMyMac4.13最新免费mac电脑系统优化软件

CleanMyMac免费mac下载版是一款简单实用的PC清洁管理工具&#xff0c;电脑刚装完系统的时候运行速度超级快&#xff0c;随着时间的推移&#xff0c;你会发现越来越慢&#xff0c;经常会反应卡顿&#xff0c;越来越多的垃圾文件占用了你的磁盘空间&#xff0c;各种过时的日志&am…

数组题目总结 -- 前缀和数组

目录 一. 区域和检索 - 数组不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 二. 二维区域和检索 - 矩阵不可变1. 思路和代码I. 博主的做法&#xff1a;II. 东哥的做法&#xff1a; 2. 总结 一. 区域和检索 - 数组不可变 题目链接&#xff1…