表白墙(web版)

news2024/10/5 21:18:18

文章目录

  • 前言
  • 一、需求分析
    • 1.表白墙页面设计
    • 2.表白墙功能
  • 二、实现
    • 1.客户端
    • 2.服务器端
    • 3.连接数据库


前言

前面前端部分写过一个表白墙页面,但是它不能存储提交信息,为了能够让它在提交信息后可以保存其信息,页面刷新后信息依然存在,这里通过使用js、servlet和mysql将其实现为一个web版的表白墙。


一、需求分析

1.表白墙页面设计

表白墙的页面如下图所示,记录谁对谁说了什么。
在这里插入图片描述

2.表白墙功能

(1)页面刷新的时候,用户提交的数据仍然存在;
(2)服务器重新启动,用户提交的数据仍然存在。
在这里插入图片描述

二、实现

代码部署如下图中的红框部分。
在这里插入图片描述

1.客户端

表白墙页面的前端代码之前博客也写到过,这里只需要在添加两处内容就可以。
(1)在表白墙页面输入信息,点击提交按钮,通过点击事件浏览器向服务器发送一个post请求,将用户输入的信息发给服务器。

代码如下(示例):
在button.onclick中添加上以下代码,将用户输入信息提交给服务器。
其中data是放在body中的内容,stringify会将对象转为Json格式的字符串,和ObjectMapper中的writeValueAsString()类似。
success是回响函数,向服务器发送请求成功,则会执行该函数。

            //4.点击提交按钮,会给服务器发送 post 请求
            let data = {
                from: from,
                to: to,
                message: message
            }
            $.ajax({
                type: 'post',
                url: 'messageWall',
                //stringify 将对象转为JSON格式的字符串
                //放body的内容
                data: JSON.stringify(data),
                contentType: "application/json; charset=utf-8",
                success: function(body) {
                    console.log("提交成功");
                }
            });

(2)在页面刷新的时候或者服务器重启的时候,表白墙页面(浏览器)从服务器那通过get请求获取到以前用户输入过的信息。

代码如下(示例):
该函数的功能是从服务器中获取数据,将获取的数据插入到页面中。
需要注意的是:success回响函数中,jquery在满足(contentType="application/json"和body是json数组)两个条件下自动把json数组转为对象数组。

        let div = document.querySelector('.container');
        //获取服务器数据
        function getMessage() {
            $.ajax({
                type: 'get',
                url: 'messageWall',
                success: function(body) {
                    // body是响应的body的内容(Json数组)
                    //jquery 在同时满足contentType是application/json 和 body是json数组 的情况下 
                    //会自动把 json数组 转成 json对象数组
                    for(let i=0;i<body.length;i++) {
                        let message = body[i];
                        //将body中的每一数组中的每一个对象添加到页面上
                        let row = document.createElement('div');
                        row.className = "row";
                        row.innerHTML = message.from + "对" + message.to + "说" + message.message;
                        div.appendChild(row);
                    }
                }
            });
        }
        getMessage();

2.服务器端

服务器端主要是响应客户端发来的一个post请求,get请求。
post请求通过重写HttpServlet中的doPost()方法,将请求数据保存到数据库中(save()方法);
get请求通过重写HttpServlet中的doGet()方法,从数据库中获取数据(load()方法),将其数据返回给浏览器。

代码如下(示例):

	//ObjectMapper为Jackson的核心技术,可以调用它的方法
    public ObjectMapper objectMapper = new ObjectMapper();
    //使用集合保存提交信息
    //public ArrayList<Message> messageList = new ArrayList<Message>();

    //获取一个页面(含有提交信息)
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //显示设置浏览器的响应格式,不需要让浏览器猜测
        resp.setContentType("application/json; charset=utf-8");
        //将对象信息转为json字符串写入响应返回给浏览器
        //获取数据库中的数据
        List<Message> messageList = null;
        try {
            messageList = load();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        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);
        //保存到数组中
        //messageList.add(message);
        //保存到数据库中
        try {
            save(message);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //设置响应状态
        resp.setStatus(200);
        //打印提交成功信息
        System.out.println("提交数据成功:"+message.getFrom()+"对"+message.getTo()+"说"+message.getMessage());
    }

3.连接数据库

save():主要是将请求数据放在数据库中。
load():主要是将从数据库中获取数据。
主要有以下步骤:
1.获取数据源;
2.与数据库(mysql)建立连接;
3.构造SQL语句;
4.执行SQL语句;
5.关闭资源。
由于连接数据库只需要操作一次,所以将其封装为一个单例模式(只有一个实例),采用饿汉方式涉及线程不安全,则采用synchronized保证线程安全。
连接数据库(示例):

//由于进行存储和读取数据时数据库只需要连接一次,则将其封装为单例模式(只有一个实例)
public class DBUtil {
    //数据源
    private static volatile DataSource dataSource = null;
    //构造方法设为私有的,程序员在使用的时候,不小心进行new的时候会有报错提醒
    private DBUtil() {}

    public static DataSource getDataSource() {
        //单列模式的饿汉模式会出现线程不安全情况,这里通过使用两个if一个锁保证线程安全
        //第一个if判断是为了提高效率
        if(dataSource == null) {
            synchronized (DBUtil.class) {
                if (dataSource == null) {
                    dataSource = new MysqlDataSource();
                    ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java105?characterEncoding=utf8&useSSL=false");
                    //数据库用户名和密码
                    ((MysqlDataSource)dataSource).setUser("root");
                    ((MysqlDataSource)dataSource).setPassword("xxxxxx");
                }
            }
        }
        return dataSource;
    }
}

save()(示例):

    //保存用户提交信息到数据库
    private void save(Message message) throws SQLException {
        //1.获取数据源
        DataSource dataSource = DBUtil.getDataSource();
        //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 = " + ret);

        //5.关闭资源
        statement.close();
        connection.close();
    }

load()(示例):

    //获取数据库中的数据
    private List<Message> load() throws SQLException {
        //1.获取数据源
        DataSource dataSource = DBUtil.getDataSource();
        //2.建立连接
        Connection connection = dataSource.getConnection();

        //3.构造SQL
        String sql = "select * from message";
        PreparedStatement statement = connection.prepareStatement(sql);

        //4.执行SQL,并将查询结果返回
        List<Message> listMessage = new ArrayList<>();
        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            Message message = new Message();
            message.setFrom(resultSet.getString("from"));
            message.setTo(resultSet.getString("to"));
            message.setMessage(resultSet.getString("message"));
            listMessage.add(message);
        }
        return listMessage;
    }

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

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

相关文章

itk配准整理(1)

示例地址&#xff1a; itk\ITK\Examples\RegistrationITKv4\ImageRegistration7.cxx 说明&#xff1a;itk二维图像的配准&#xff1a;平移旋转缩放 效果图&#xff1a; 运行结果&#xff1a; 52 53.6213 [0.8333298229719548, -0.17450270771316403, -12.806452097490313, -1…

在Win10中使用YAMAHA S-YXG50软波表

曾经非常经典的一款软波表YAMAHA S-YXG50我个人非常的喜欢。在XP系统的时代&#xff0c;是我必装的软件&#xff0c;用来听一些MIDI音质和效果很好。而如今玩MIDI的人越来越少了&#xff0c;软波表的时代也被人渐渐的遗忘了。 如今想要怀旧的话&#xff0c;只能够找一台老电脑…

LINUX的XEN和KVM到底区别在什么地方?

本文调研的是 Completely Fair Scheduler 算法, 它当前是 Linux 中 SCHED_NORMAL(非实时任务) 一类 task 的默认调度器. 实际上, 运行在 Guest OS 中的应用程序线程还受到 Guest OS 的调度, 分时运行在 vCPU 上, 但这不在本文调研范围内. 本文仅调研 vCPU 被如何调度到 pCPU 上…

WebDAV之葫芦儿·派盘+无聊笔记

无聊笔记 支持webdav方式连接葫芦儿派盘。 无聊笔记是一款深受用户认可的系统工具,随时都可以进行软件的操作,也可以在线进行笔记的记录,系统会进行智能的保存,满足了用户日常中的需求,可以把软件作为备忘录,笔记本,摘抄录等。 无聊笔记是一个功能强大的记录工具,您…

代码随想录算法训练营第四十二天| LeetCode416. 分割等和子集

一、LeetCode416. 分割等和子集 1&#xff1a;题目描述&#xff08;416. 分割等和子集&#xff09; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 2&#xff1a;解题思路 本题需要使用01背包的…

合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!

2022年10月27日&#xff0c;方正璞华PLM事业部负责人王志起先生与日立方代表正式签订“方正璞华PLM产品销售合作框架协议”。 根据协议&#xff0c;双方将围绕璞华PLM产品推广、客户拓展、全生命周期运营服务等领域&#xff0c;开展多元化、多层级的深度融合合作&#xff0c;共…

HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

CV&#xff1a;计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧 导读&#xff1a;计算机视觉技最强学习路线&#xff0c;博主花了三个晚…

Class加载过程

文章目录java解释执行热点代码编译类生命周期加载&#xff08;Loading&#xff09;验证&#xff08;Verification&#xff09;准备&#xff08;Preparation&#xff09;解析&#xff08;Resolution&#xff09;初始化&#xff08;Initialization&#xff09;使用&#xff08;Us…

并发编程(三)原子性(2)

【 悲观锁与乐观锁 】&#xff1a; 【悲观锁】&#xff1a; 一定会被别人打断&#xff1b;我必须得上锁。synchronized就是悲观锁。 【乐观锁】&#xff1a; 乐观锁又称之为——无锁、自旋锁、CAS 。 厕所里的人认为不会有其他人来上厕所和我竞争。 【举例解释CAS操作】&a…

SOHO帮客户找新品,如何拿到最优价?要不要选择大型机械类产品?

做外贸&#xff0c;无论是贸易公司还是工厂&#xff0c;又或者是SOHO。都有机会帮助客户采购自己主打产品之外的其他产品&#xff0c;有些人就会问&#xff0c;对于客户咨询的新产品&#xff0c;我们本身没有熟悉的供应商&#xff0c;这个时候要怎么去找到好的供货商&#xff1…

世界技能大赛夺冠背后,亚马逊云科技如何培养云计算技能人才?

云计算相关专业的就业前景如何&#xff1f; 人社部数据显示&#xff0c;到2025年我国云计算人才缺口将高达近150万。另一方面&#xff0c;根据艾瑞咨询《中国云计算行业洞察与人才分析》报告&#xff0c;2019年云计算领域人才月均薪酬在1万元以上的占比达93.7%&#xff0c;3万元…

VK3606D抗电机马达干扰直接输出6键触摸芯片,电容式6通道触控检测IC低电平有效,无触摸4秒进入待机模式常用于工控面板/空调/风扇/家电等

VINKA/永嘉微电的VK3606D SOP16是一种具有自动校准功能&#xff0c;低待机电流&#xff0c;抗电压波动等特性的&#xff0c;6按键电容式触摸触控检测IC&#xff0c;适用于温控器&#xff0c;86面板触摸开关&#xff0c;智能家居等抗干扰场所 型号&#xff1a;VK3606D 封装形…

WebGL、GPU硬件加速、GLSL、光栅化

一、介绍 WebGL经常被当成3D API&#xff0c;人们总想“我可以使用WebGL和一些神奇的东西做出炫酷的3D作品”。 事实上WebGL仅仅是一个光栅化引擎&#xff0c;它可以根据你的代码绘制出点&#xff0c;线和三角形。 想要利用WebGL完成更复杂任务&#xff0c;取决于你能否提供合…

CentOS Stream 9 配置静态 IP

系统环境&#xff1a; OS&#xff1a;CentOS Stream 9 CentOS Stream 9 不同于以往版本的 CentOS&#xff0c;没有之前的网络设置相关的命令&#xff0c;如&#xff1a; service network start/restart/status systemctl start/restart/status network设置网卡 IP 的配置文件…

新媒体研究杂志社新媒体研究编辑部新媒体研究杂志2022年第18期目录

本期聚焦 出版学核心期刊自媒体运营状况与其学术影响力关系研究 程海燕;季佳乐; 1-5 理论研究 《新媒体研究》投稿&#xff1a;cnqikantg126.com 网络社群网民情绪感染研究综述 单悦影;祁凯; 6-922 基于CiteSpace的被遗忘权研究综述 徐怡; 10-14 应用研究 …

MCE | RNA 逆转录小提示

Tips 1&#xff1a;防止 RNA 模板的降解毫无疑问&#xff0c;RNA 质量对 cDNA 合成结果会产生重要影响。但 RNA 很脆弱&#xff0c;易于降解。为了保证 RNA 的完整性&#xff0c;我们需要小心又小心&#xff0c;比如在冰上操作&#xff0c;用 RNase-free 的枪头和离心管&#x…

力扣27.移除元素【顺序表】

&#x1f648;个人主页&#xff1a;阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;你所看到的惊艳&#xff0c;都曾被平庸所历练。 前言&#xff1a; 在解题过程中一定要画图进行思考&#xff0c;然后再敲代码。 文章目录移除…

计算属性computed、过滤器定义Vue.filter()

计算属性是为了计算得到一个结果而设计的&#xff1b;放在Vue中computed里面定义&#xff1a;如果我们想在页面上打印一个变量&#xff0c;那就直接“{{变量}}”放在大括号里面&#xff0c;然后变量在data里面定义好初始值&#xff0c;就可以在页面上输出了&#xff0c;比如&am…

策略验证_指标买点分析技法_运用KDJ随机指标选择买点

写在前面&#xff1a; 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文&#xff1b; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法&#xff0c;文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…