表白墙(服务器版)

这篇具有很好参考价值的文章主要介绍了表白墙(服务器版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

表白墙(服务器版)

一、准备工作

我们之前实现过这样一个表白墙,具体前端代码参考 表白墙 这篇文章
表白墙(服务器版)
但是我们之前写的这个表白墙有一些问题:
1.如果我们刷新页面/重新开启,之前的数据就不见了
2.我们只能在单机操作,其他机器不能看见
于是我们现在就来解决这些问题,让服务器来存储用户提交的数据,当有新的浏览器打开该页面时,在从服务器获取数据,首先我们创建一个web项目,引入相关依赖
表白墙(服务器版)
在src下创建webapp/WEB-INF/web.xml,并在pom.xml下面引入mysql依赖,servlet依赖和jackson依赖

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.1</version>
        </dependency>
    </dependencies>

引入依赖之后记得刷新,
然后创建servelet类,并指明访问路径为message,具体实现我们后面在具体写

@WebServlet("/messagewell")
public class MessageWellServlet extends HttpServlet {
    

然后我们将我们之前写好的表白墙前端代码导入到webapp目录下,大家之前去我之前的文章里复制即可
表白墙(服务器版)

二、前后端交互

既然我们想要进行前后端交互,就得约定好接口,前端给服务器发什么样的HTTP请求,服务器返回什么样的HTTP响应
1.页面加载,浏览器从服务器获取表白信息
前端请求: GET/message
响应: HTTP/1.1 200OK,返回json数组形式的数据

2.提交表白信息,浏览器将表白信息发送到服务器
前端请求:POST/message,发送json形式的数据
响应:HTTP/1.1 200OK

后端

表白墙(服务器版)
我们前端提交数据后,使用json格式发给服务器,我们需要构建一个这样的类,然后使用jackson进行接收数据

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

我们来实现一下当前端提交数据时,我们服务器的处理

    List<Message> list = new ArrayList<>();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ObjectMapper objectMapper = new ObjectMapper();
        //将body中的内容进行读取
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
        //将获取到的message对象加入到成员变量list中
        list.add(message);
        //设置响应状态码
        resp.setStatus(200);
    }

有了doPost的基础,我们doGET方法就简单的多了,直接将list中的所有数据写回响应即可

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应格式
        resp.setContentType("application/json; charset=utf8");
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(resp.getWriter(),list);
    }

表白墙(服务器版)
该方法是将java对象转成json字符串,并将其写入到响应中,如果大家觉得这个方法看起来费劲的话,大家也可以换一种方法

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应格式
        resp.setContentType("application/json; charset=utf8");
        ObjectMapper mapper = new ObjectMapper();
        //将java对象转成json字符串
        String jsonResp = mapper.writeValueAsString(list);
        resp.getWriter().write(jsonResp);
    }

前端

我们前端需要发送两部分请求:
1.post,当我们点击提交表白信息的时候发起
2.get,我们加载页面的时候发起

我们使用VScode打开前端代码,引入jquery依赖

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

表白墙(服务器版)
然后我们使用ajax构造请求
表白墙(服务器版)
我们看一下我们之前写的前端代码,当我们onclick提交时,我们只是构造了一个div加入到页面内,现在我们增加一下,让其提交给后端
表白墙(服务器版)

我们将输入框读取到的数据,构建成一个js对象,但是我们body只能传输字符串不能传输对象,于是我们需要将对象转成一个json格式的字符串

   strBody = JSON.stringify(body);
            strBody = JSON.stringify(body);
            $.ajax({
                type: 'post',
                url: 'messagewell',
                data: strBody,
                contentType: "application/json; charset=utf8",
                success: function(body) {
                    console.log("数据提交成功");
                }
            });

然后使用ajax将数据提交给服务器,我们来测试一下当前代码,我们使用tomcat部署,并访问
表白墙(服务器版)
表白墙(服务器版)
然后我们点击提交,我们看到确认发送了一个HTTP请求
表白墙(服务器版)
表白墙(服务器版)
这里就证明我们提交表白信息这一前后端操作是正确的
接下来我们来实现当我们刷新页面时读取服务器数据,我们使用ajax发送GET请求

        //当我们页面加载时,给服务器发送GET请求,获取数据,添加到页面中
        $.ajax({
            type: 'get',
            url: 'messagewell',
            success: function(body) {
                //此数body就是一个js格式的字符串,但是我们这里需要js对象数组
                //jquery会帮我们将js对象字符串解析成js对象数组
                for(let message of body) {
                    let rowDiv = document.createElement('div');
                    rowDiv.className = 'row';
                    rowDiv.innerHTML = message.from + ' 对 ' + message.to + ' 说 ' + message.message;
                    containerDiv.appendChild(rowDiv);
                }
            }
        })

我们这里的body,jquery为我们将js格式字符串解析为js对象数组,我们需要创建div标签,将每个js对象的数据添加到里面,然后将div添加到页面即可
现在我们重启服务器来验证一下
表白墙(服务器版)
我们先随便提交几条数据,然后我们来尝试一下刷新页面
表白墙(服务器版)
我们刷新后,数据仍然在页面上,我们在刷新的同时,给服务器发送了一个GET请求
表白墙(服务器版)
同样的服务器将所有的表白信息响应给我们的浏览器
表白墙(服务器版)
这样一个服务器版本的表白墙就实现完成了,大家需要注意的是我们的数据是在内存中存放的,如果我们重启服务器之后,之前的数据就不见了,如果想要持久化存储就需要借助数据库了

三、数据库版本

我们这里只需要创建一张message信息表,表中有三个属性(from,to,message)
表白墙(服务器版)
大家需要注意我们在创表过程中的一些问题,因为我们的from和to是我们mysql中的关键字,所以我们需要加上`,接下来我们就使用JDBC来和数据库进行交互操作
因为我们数据库连接操作和关闭资源需要频频使用,所以我们这里创建一个DBUtil工具类来简化操作

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.*;
//DButi作为工具类,供其他类使用
public class DBUtil {
    private static DataSource dataSource = new MysqlDataSource();
    static{
        //对datasuorce初始化
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/zd?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("自己的密码");
    }
    //通过该方法获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.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();
            }
        }
    }
}

接下来我们在servlet类下实现两个方法,save()将我们前端提交的数据添加到数据库中,load()将我们数据库中的所有数据返回给前端

    public void save(Message message) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            //获取连接
            connection = DBUtil.getConnection();
            //构造sql语句
            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);
            //执行sql
            statement.executeUpdate();
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭连接
            DBUtil.close(connection,statement,null);
        }
    }
    public List<Message> load() {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        List<Message> messageList = new ArrayList<>();
        try {
            //获取连接
            connection = DBUtil.getConnection();
            //构造sql语句
            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");
                messageList.add(message);
            }
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭连接
            DBUtil.close(connection,statement,resultSet);
        }
        return messageList;
    }

表白墙(服务器版)
表白墙(服务器版)文章来源地址https://www.toymoban.com/news/detail-417830.html

到了这里,关于表白墙(服务器版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jenkins实现自作自定义镜像并推送Harbor并编写目标服务器准备脚本

    部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。 添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。 deploy.sh

    2024年01月18日
    浏览(65)
  • Spring Boot 在启动之前还做了哪些准备工作?

    目录 一:初始化资源加载器 二:校验主要源 三:设置主要源 四:推断 Web 应用类型

    2024年02月05日
    浏览(39)
  • 一、服务器准备

    本案例使用VMware Workstation Pro虚拟机创建虚拟服务器来搭建Linux服务器集群,所用软件及版本如下: Centos7.7-64bit 第一种方式:通过iso镜像文件来进行安装(不推荐) 第二种方式:直接复制安装好的虚拟机文件(强烈推荐) 在资料里边已经提供了一个安装好的虚拟机node1(注意,

    2024年02月22日
    浏览(24)
  • 详细讲解下网络请求到f5和nginx和网关和服务器之前的联系和顺序关系

    在一个典型的网络请求流程中,涉及到 F5、Nginx、网关以及最终的服务器。让我们一步步分析它们之间的联系和顺序关系: 客户端发起请求 : 客户端(如浏览器、移动应用)通过发送 HTTP 请求向服务器请求特定资源(比如网页、图片、数据等)。 DNS解析 : 客户端会首先对

    2024年02月03日
    浏览(26)
  • 我们在选择服务器的时候,经常会看到单线服务器,多线服务器和BGP服务器,那这些线路的服务器有存在哪些不同呢?

    我们在选择服务器的时候,经常会看到单线服务器,多线服务器和BGP服务器,那这些线路的服务器有存在哪些不同呢? 单线 所谓的单线服务器是单网卡单个IP,指只有电信、联通或者移动一条线路。 缺点:由于线路单一,所选线路为电信线路时,联通或移动的用户访问时可

    2024年02月12日
    浏览(37)
  • 分布式 - 服务器Nginx:一小时入门系列之Nginx环境准备

    1. Nginx 环境准备 虚拟机镜像,基于Centos7,网盘链接: https://pan.baidu.com/s/1NmCR-vdAcZLouRRn9V1yTA 密码: 1b60,虚拟机的用户名/密码:root/123456,使用的环境和应用放置在/home目录下: 目录 简介 说明 AdminLTE-3.2.0 静态web后台管理系统 静态web的配置演示 apps/ruoyi-admin.jar 若依后台管理系统

    2024年02月14日
    浏览(31)
  • unity学习(19)——客户端与服务器合力完成注册功能(1)入门准备

    逆向服务器用了三天的时间,但此时觉得一切都值,又可以继续学习了。 服务器中登录请求和注册请求由command变量进行区分,上一层的type变量都是login。 从注册入手!视频对应的应该是第七讲。 点击注册按钮,输入账号密码,实测可以在服务器收到编码后的字符串,但此时

    2024年02月21日
    浏览(82)
  • 服务器工作环境要求

    在开展网站服务之前,合适的服务器工作环境是必不可少的。服务器工作环境指需要一定的软硬件条件来保障服务器可以正常地运转和提供高效率的服务。在这篇文章中,我们将会详细讲解服务器工作环境所需的要素。 一、硬件要求 服务器硬件方面包括了基本的电脑构造和

    2024年01月20日
    浏览(28)
  • unity的学习,准备搞一款mmo小游戏,服务器和客户端从零学

    先学一下unity,mmo服务器框架到时候在学习一下,暂时服务器简单做一下 如代码所示,简单了解一下。 我个人感觉不要一个放在Awake函数中,一个放在Start中。因为这只适合两个脚本使用,如果多个脚本还是没有办法解决脚本执行的顺序。在这里设置脚本的执行顺序,添加进

    2023年04月21日
    浏览(38)
  • 运行配置停止之前未连接应用程序服务器, 原因: java.io.1OException:Failed to retrieve RMIServer stub:javax.naming. ServiceU

    直接修改JMX端口可以直接解决 win+r输入cmd,然后输入 netstat -aon|findstr 1099 回车 输入 taskkill -f -pid 18280 这里的18280换成你查询的,然后就成功终止了在1099上的进程。打开tomcat就会成功。

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包