12-代码实战——服务器版表白墙

news2025/2/23 6:52:45

目录

1.版本一:将数据存到内存中

①约定前后端交互接口

a.添加表白信息:

b.查询表白列表:

②在webapp包下创建message-wall.html前端文件

③在java包下创建AddMessageServlet后端类

④在java包下创建MessageListServlet后端类

2.版本二:将数据存到数据库中

①创建数据库, 创建 messages 表

②在pom.xml中添加MySQL JDBC依赖

③在utils包下创建 DBUtils 类

④在java包下创建AddMessageServletV2后端类

⑤在webapp包下创建message-wallv2.html前端页面

⑥在java包下创建MessageListServletV2后端类


1.版本一:将数据存到内存中

①约定前后端交互接口

所谓 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节。

具体来说,就是允许⻚⾯给服务器发送哪些 HTTP 请求,并且每种请求预期获取什么样的 HTTP 响应。

  • Java里不会直接去操作内存,但后端所有的Servlet类是运行在内存中,这里所说的将数据存到内存中,就是在后端程序中创建一个集合List,List里有一个对象,将数据存到List中,就相当于是存到内存中了。
  • 当不重启Tomcat时,换浏览器都会展示提交的数据;但若重启Tomcat,会释放内存,不会展示提交的数据了。
  • 后端拿到前端传递的3个数据后,将数据放到List里,并且提供一个查询接口。
  • 总共2个接口:①添加表白信息的接口;②查询表白列表的接口。

a.添加表白信息:

  1. url:/message/add
  2. type:POST
  3. 参数:from=xxx&to=yyy&msg=zzz
  4. 返回值:int类型数字

b.查询表白列表:

  1. url:/message/list
  2. type:GET
  3. 参数:无
  4. 返回值:[{"from":"", "to":"", "msg":""}, ...](json对象)

注:不建议写成一个url,不同的type,触达不同的业务。因为ajax使用哪个类型不能决定执行哪个业务方法。

②在webapp包下创建message-wall.html前端文件

<!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, initialscale=1.0">
    <title>表白墙</title>
    <style>
       * {
            margin: 0;
            padding: 0;
       }
        .container {
            width: 400px;
            margin: 0 auto;
       }
        h1 {
            text-align: center;
            padding: 20px 0;
       }
        p {
            color: #666;
            text-align: center;
            font-size: 14px;
            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: 304px;
            height: 40px;
            color: white;
            background-color: orange;
            border: none;
       }
        .submit:active {
            background-color: #666;
       }
    </style>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<div id="container" class="container">
    <h1>表白墙</h1>
    <p>输⼊后点击提交, 会将信息显示在表格中</p>
    <div class="row">
        <span>谁: </span>
        <input id="from" class="edit" type="text">
    </div>
    <div class="row">
        <span>对谁: </span>
        <input id="to" class="edit" type="text">
    </div>
    <div class="row">
        <span>说什么: </span>
        <input id="message" class="edit" type="text">
    </div>
    <div class="row">
        <input type="button" value="提交" class="submit" onclick="mySubmit()">
    </div>
    <div id="allMsg">
    </div>
</div>
<script>
    //添加表白信息
    function mySubmit() {
        var from = jQuery("#from");
        var to = jQuery("#to");
        var msg = jQuery("#message");

        //1.非空效验
        if(from.val().trim() == "") {
            alert("请先输入from!");
            from.focus(); //聚焦光标
            return false; //不走下面的代码了
        }
        if(to.val().trim() == "") {
            alert("请先输入to!");
            to.focus();
            return false;
        }
        if(msg.val().trim() == "") {
            alert("请先输入msg!");
            msg.focus();
            return false;
        }

        //2.ajax提交数据给后端
        jQuery.ajax({
            url:"message/add", //提交到后端的地址
            type:"POST", //提交类型
            data:{
                from:from.val(),
                to:to.val(),
                msg:msg.val()
            }, //data是前端给后端提交的key值/参数
            success:function(result) { //回调函数,匿名函数,result是后端给前端返回的数据,result是一个int类型的值
                if(result != null && result > 0) {
                    alert("恭喜:添加成功!");
                    //刷新表白列表
                    getAllMsg();
                } else {
                    alert("抱歉:添加失败,请重试!");
                }
            }
        });
    }

    //查询表白列表
    function getAllMsg() {
        jQuery.ajax({
            url:"message/list", //最前面没有'/'
            type:"GET",
            data:{},
            success:function(result) { //result是一个json对象
                if(result != null && result.length > 0) {
                    //有表白数据
                    var msgHtml = "";
                    for(var i = 0; i < result.length; i++) {
                        msgHtml += 
                        '<div class = "row">'
                            + result[i].from +'对'
                            + result[i].to +'说'
                            + result[i].message 
                            + '</div>';
                    }
                    jQuery("#allMsg").html(msgHtml);
                } else if(result != null && result.length == 0) {
                    //没有表白数据
                    console.log("没有表白信息");
                } else {
                    alert("访问出错!");
                }
            }
        });
    }
    //要在页面加载时就执行,那么直接在下面调用即可
    getAllMsg();
</script>
</body>
</html>

③在java包下创建AddMessageServlet后端类

public class StringUtils {
    /**
     * 用来判null和判空的,如果为null或空,返回false
     * @param str
     * @return
     */
    public static boolean hasLength(String str) {
        return !(str == null || str.length() == 0);
    }
}
import lombok.Getter;
import lombok.Setter;
import utils.StringUtils;
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 java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 添加表白信息
 */
@WebServlet("/message/add")
public class AddMessageServlet extends HttpServlet {
    public static List<Message> msgList = new ArrayList<>();

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int result = -1;
        //1.得到前端参数并效验
        String from = req.getParameter("from");
        String to = req.getParameter("to");
        String msg = req.getParameter("msg");
        if(StringUtils.hasLength(from) && StringUtils.hasLength(to) && StringUtils.hasLength(msg)) {
            //2.将表白对象加入到集合(内存)
            msgList.add(new Message(from, to, msg));
            result = 1;
        }
        //3.将结果返回给前端
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().println(result);
    }
}

@Setter
@Getter
class Message {
    private String from;
    private String to;
    private String message;

    public Message(String from, String to, String message) {
        this.from = from;
        this.to = to;
        this.message = message;
    }
}

④在java包下创建MessageListServlet后端类

import com.fasterxml.jackson.databind.ObjectMapper;
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 java.io.IOException;
import java.util.List;

/**
 * 查询表白列表
 */
@WebServlet("/message/list")
public class MessageListServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        List<Message> messageList = AddMessageServlet.msgList;
        resp.setContentType("application/json; charset=utf-8");
        ObjectMapper objectMapper = new ObjectMapper();
        resp.getWriter().println(objectMapper.writeValueAsString(messageList));
    }
}

2.版本二:将数据存到数据库中

把表白墙程序修改成服务器版本JDBC+Servlet,这样即使页面关闭、服务器重启,表白墙的内容也不会丢失。

①创建数据库, 创建 messages 表

②在pom.xml中添加MySQL JDBC依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>

③在utils包下创建 DBUtils 类

DBUtils 类主要实现以下功能:

  1. 创建 MysqlDataSource 实例,设置 URL, username, password 等属性。
  2. 提供 getConnection ⽅法,和 MySQL 服务器建⽴连接。
  3. 提供 close ⽅法,⽤来释放必要的资源。
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtils {
    //单例模式3步:
    //①声明一个私有的构造方法
    private DBUtils() {

    }

    //②提供一个私有的对象属性
    private static volatile MysqlDataSource mysqlDataSource;
    private static volatile Connection connection;

    //③提供一个公共的对外访问的方法,并且这个方法要加volatile和DCL双重效验锁
    private static MysqlDataSource getMysqlDataSource() {
        if(mysqlDataSource == null) {
            synchronized (DBUtils.class) {
                if(mysqlDataSource == null) {
                    mysqlDataSource = new MysqlDataSource();
                    mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/messagewall?character=utf8&useSSL=true");
                    mysqlDataSource.setUser("root");
                    mysqlDataSource.setPassword("12345678");
                }
            }
        }
        return mysqlDataSource;
    }

    //1.get connect
    public static Connection getConnection() {
        if(connection == null) { //首次访问
            synchronized (DBUtils.class) {
                if(connection == null) {
                    try {
                        MysqlDataSource dataSource = getMysqlDataSource();
                        connection = (Connection) dataSource.getConnection();
                    } catch (SQLException throwables) {
                        throwables.printStackTrace();
                    }
                }
            }
        }
        return connection;
    }

    //2.提供关闭资源的方法
    public static void close(ResultSet resultSet, PreparedStatement statement, Connection connection) throws SQLException {
        if(resultSet != null) {
            resultSet.close();
        }
        if(statement != null) {
            statement.close();
        }
    }
}

④在java包下创建AddMessageServletV2后端类

import com.mysql.jdbc.Connection;
import lombok.SneakyThrows;
import utils.DBUtils;
import utils.StringUtils;
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 java.io.IOException;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

/**
 * 添加表白信息
 */
@WebServlet("/message/add2")
public class AddMessageServletV2 extends HttpServlet {
    public static List<Message> msgList = new ArrayList<>();

    @SneakyThrows
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int result = -1;
        //1.得到前端参数并效验
        String from = req.getParameter("from");
        String to = req.getParameter("to");
        String msg = req.getParameter("msg");
        if(StringUtils.hasLength(from) && StringUtils.hasLength(to) && StringUtils.hasLength(msg)) {
            //2.将表白对象加入到数据库
            //2.1.得到Connect
            Connection connection = DBUtils.getConnection();
            //2.2.拼接sql,创建执行器
            String sql = "insert into messages(`from`,`to`,`message`) values(?,?,?)";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,from);
            statement.setString(2,to);
            statement.setString(3,msg);
            //2.3.执行执行器,并返回结果
            result = statement.executeUpdate();
            //2.4.关闭资源
            DBUtils.close(null, statement, connection);
        }
        //3.将结果返回给前端
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().println(result);
    }
}

⑤在webapp包下创建message-wallv2.html前端页面

<!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, initialscale=1.0">
    <title>表白墙——连接数据库版本</title>
    <style>
       * {
            margin: 0;
            padding: 0;
       }
        .container {
            width: 400px;
            margin: 0 auto;
       }
        h1 {
            text-align: center;
            padding: 20px 0;
       }
        p {
            color: #666;
            text-align: center;
            font-size: 14px;
            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: 304px;
            height: 40px;
            color: white;
            background-color: orange;
            border: none;
       }
        .submit:active {
            background-color: #666;
       }
    </style>
    <script src="js/jquery-1.9.1.min.js"></script>
</head>
<body>
<div id="container" class="container">
    <h1>表白墙</h1>
    <p>输⼊后点击提交, 会将信息显示在表格中</p>
    <div class="row">
        <span>谁: </span>
        <input id="from" class="edit" type="text">
    </div>
    <div class="row">
        <span>对谁: </span>
        <input id="to" class="edit" type="text">
    </div>
    <div class="row">
        <span>说什么: </span>
        <input id="message" class="edit" type="text">
    </div>
    <div class="row">
        <input type="button" value="提交" class="submit" onclick="mySubmit()">
    </div>
    <div id="allMsg">
    </div>
</div>
<script>
    //添加表白信息
    function mySubmit() {
        var from = jQuery("#from");
        var to = jQuery("#to");
        var msg = jQuery("#message");

        //1.非空效验
        if(from.val().trim() == "") {
            alert("请先输入from!");
            from.focus(); //聚焦光标
            return false; //不走下面的代码了
        }
        if(to.val().trim() == "") {
            alert("请先输入to!");
            to.focus();
            return false;
        }
        if(msg.val().trim() == "") {
            alert("请先输入msg!");
            msg.focus();
            return false;
        }

        //2.ajax提交数据给后端
        jQuery.ajax({
            url:"message/add2", //提交到后端的地址
            type:"POST", //提交类型
            data:{
                from:from.val(),
                to:to.val(),
                msg:msg.val()
            }, //data是前端给后端提交的key值/参数
            success:function(result) { //回调函数,匿名函数,result是后端给前端返回的数据,result是一个int类型的值
                if(result != null && result > 0) {
                    alert("恭喜:添加成功!");
                    //刷新表白列表
                    getAllMsg();
                } else {
                    alert("抱歉:添加失败,请重试!");
                }
            }
        });
    }

    //查询表白列表
    function getAllMsg() {
        jQuery.ajax({
            url:"message/list2", //最前面没有'/'
            type:"GET",
            data:{},
            success:function(result) { //result是一个json对象
                if(result != null && result.length > 0) {
                    //有表白数据
                    var msgHtml = "";
                    for(var i = 0; i < result.length; i++) {
                        msgHtml += 
                        '<div class = "row">'
                            + result[i].from +'对'
                            + result[i].to +'说'
                            + result[i].message 
                            + '</div>';
                    }
                    jQuery("#allMsg").html(msgHtml);
                } else if(result != null && result.length == 0) {
                    //没有表白数据
                    console.log("没有表白信息");
                } else {
                    alert("访问出错!");
                }
            }
        });
    }
    //要在页面加载时就执行,那么直接在下面调用即可
    getAllMsg();
</script>
</body>
</html>

⑥在java包下创建MessageListServletV2后端类

import com.fasterxml.jackson.databind.ObjectMapper;
import com.mysql.jdbc.Connection;
import lombok.SneakyThrows;
import utils.DBUtils;
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 java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 查询表白列表
 */
@WebServlet("/message/list2")
public class MessageListServletV2 extends HttpServlet {
    @SneakyThrows
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查询数据库中的表白列表
        List<Message> list = new ArrayList<>();
        //1.得到connection
        Connection connection = DBUtils.getConnection();
        //2.拼接sql,创建执行器
        String sql = "select * from messages";
        PreparedStatement statement = connection.prepareStatement(sql);
        //3.执行sql,返回resultSet,并循环将数据添加到list中
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()) {
            String from = resultSet.getString("from");
            String to = resultSet.getString("to");
            String message = resultSet.getString("message");
            list.add(new Message(from,to,message));
        }
        //4.关闭资源
        DBUtils.close(resultSet, statement, connection);

        resp.setContentType("application/json; charset=utf-8");
        ObjectMapper objectMapper = new ObjectMapper();
        resp.getWriter().println(objectMapper.writeValueAsString(list));
    }
}

PS:HashMap的遍历写法:

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

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

相关文章

华为OD机试之乱序整数序列两数之和绝对值最小(Java源码)

乱序整数序列两数之和绝对值最小 题目描述 给定一个随机的整数&#xff08;可能存在正整数和负整数&#xff09;数组 nums&#xff0c;请你在该数组中找出两个数&#xff0c;其和的绝对值(|nums[x]nums[y]|)为最小值&#xff0c;并返回这个两个数&#xff08;按从小到大返回&…

NXP IMX6ULL的官方文档、官方BSP、交叉编译工具链下载

目录 1 官网下载BSP以及相关文档 1.1 文档下载 1.2 NXP 官方uboot和kernel源码下载 1.3 官方评估板硬件资料下载 1.4 官方BSP下载 2 官网SDK下载 3 交叉编译工具链下载及安装 买了块IMX6ULL的开发板&#xff0c;然后移植uboot和kernel的时候&#xff0c;不想直接用开发板…

English Learning - L3 综合练习 7 TED-Living Beyond the Limits 2023.06.14 周三

English Learning - L3 综合练习 7 TED-Living Beyond the Limits 2023.06.14 周三 句 1扩展 go 句 2句 3句 4 - 6句 7-8句 9 - 10句 11扩展 detour 句 12 -13句 14扩展生词 句 15 -16句 17 -18扩展 patchwork 句 18句 19扩展生词 句 20句 21扩展生词 句 22句 23句 24句 25 -26…

国产麒麟配置规范

配置规范问题&#xff1a; 麒麟的加固 1.检查设备密码复杂度策略 /etc/pam.d/password-auth 添加/etc/pam.d/system-authpassword requisite pam_cracklib.so ucredit-1 lcredit-1 dcredit-1在password required pam_cracklib.so 后添加 minlen6 2.检查是否设置口令生存周…

103.实战网页行动呼吁部分-第三节

上节课我们实现的内容是这样的&#xff1a; ● 首先&#xff0c;我们设置一下label的字体样式 .cta-form label {display: block;font-size: 1.6rem;font-weight: 700;margin-bottom: 1.2rem; }● 接着设置输入框的样式 .cta-form input {width: 100%;padding: 1.2rem;font…

以产品为主导的增长揭开 Zipline 十亿美元估值的秘密

如今一提到物流&#xff0c;人们常常会将之定性为红海市场。然而&#xff0c;无人机配送服务的出现却预示着物流行业的变革。从2023年到2026年&#xff0c;全球包裹配送业务的价值预计将以每年53%的速度增长&#xff0c;到2026年底&#xff0c;其价值将超过60亿美元。在摩根斯坦…

CMU15-445 2022 Fall 通关记录 —— Project 1: Buffer Pool

指导书 Project #1 - Buffer Pool | CMU 15-445/645 :: Intro to Database Systems (Fall 2022) — 项目 #1 - 缓冲池 | CMU 15-445/645 :: 数据库系统简介&#xff08;2022 年秋季&#xff09; Task #1&#xff1a;Extendible Hash Table 首先应当了解 可扩展哈希表 的概念…

Anaconda jupyter lab安装及pandas2.x初体验

jupyter lab安装 之前写了一篇&#xff1a; Anaconda、Jupyter的安装部署及使用问题总结 最近又用python比较多&#xff0c;升级了一下本机的anaconda版本&#xff0c;并使用jupyter lab来编写python脚本&#xff0c;本文记录一下升级、使用过程。 安装anaconda 下载安装包 …

独家专访LAION创始人:高中生与科学家同酬,Discord上一呼百应

在LAION&#xff0c;大家都是无偿的。我们不像公司雇佣员工&#xff0c;所以我们不会付钱。一旦你开始付钱&#xff0c;就会有这样的讨论&#xff1a;高中生应该拿多少工资&#xff1f;谷歌的高级工程师应该拿多少工资&#xff1f; 我已经有足够的钱过上好日子了&#xff0c;现…

MongoDB聚合操作-02

一、聚合操作 聚合操作处理数据记录并返回计算结果。 聚合操作组值来自多个文档&#xff0c;可以对分组数据执行 各种操作以返回单个结果。 聚合操作包含三类&#xff1a;单一作用聚合、聚合管道、MapReduce。 单一作用聚合&#xff1a;提供了对常见聚合过程的简单访问&#…

马原第二章复习 1.实践和认识 80-109

实践 (一) 实践的本质 人类能动改造世界的客观物质活动 实践具有三个基本特征 客观实在性(体现在构成实践的诸多要素) 主观能动性(实践是一种有目的有计划的活动) 客观物质性 (二) 实践的基本结构 实践主体 实践客体 实践中介 辨析:实践客体不等于客观事物 客观事物只有…

市场份额被微软步步蚕食,Zoom已到生死存亡关头

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 Zoom (ZM)这几年一直在竞争加剧、视频会议市场增长放缓以及投资者对该公司的高期望下艰难挣扎。 虽然Zoom的股价已较高点时大幅下跌&#xff08;Zoom的股价已较2021年8月的高点暴跌了80%以上&#xff09;&#xff0c;但猛兽…

day57|动态规划17-最长回文子串问题

回文子串&#xff1a;强调连续 回文子序列&#xff1a;不强调连续 647. 回文子串的个数 暴力思路&#xff1a;三层for循环双指针思路&#xff1a;动态规划dp数组 dp[i][j]&#xff1a; 根据字符串的形式和所解决的问题确定dp数组的形式和含义。 递归公式&#xff08;分情况讨…

B046-cms01-后台搭建 界面修改 分页 GirdManager

目录 cms项目介绍Maven跳转到后台首页视图解析器页面和静态资源准备资源分布controller控制器 跳转到文章展示页面index.JSPArticleControllerarticle.jsp gridManager初体验和显示文章数据时间和是否启用显示Articlearticle.jsp 展示文章类型ArticleServiceImplarticle.jsp 按…

短视频seo源码部署--LINUX环境

抖音矩阵系统源码/抖音seo矩阵系统/抖音账号矩阵源码/短视频seo源码部署 *基于PHP语言&#xff0c;linux环境&#xff0c;MVC框架进行研发&#xff0c;开源部署 开源性质使得用户可以根据自己的需求对其进行二次开发和定制。然而&#xff0c;对于该软件的部署却是一项非常关键…

Python异步编程之web框架 异步vs同步 Redis并发对比

1|0测试基本信息 主题&#xff1a;比较异步框架和同步框架在RedisIO操作的性能差异python版本&#xff1a;python 3.8数据库&#xff1a;redis 5.0.7压测工具&#xff1a;locustweb框架&#xff1a;同步&#xff1a;flask 异步&#xff1a;starlette请求并发量: 模拟10个用户服…

ubuntu下,安装配置CUDA

一、下载文件。 到下面的官网链接&#xff0c;下载你自己需要的版本。我喜欢11.7 CUDA Toolkit Archive | NVIDIA Developer 二、安装 可能的错误&#xff1a; Failed to verify gcc version. --Linux安装CUDA GCC版本不兼容 sudo sh cuda_xxxxxxxxxxxxxx_linux.run --overr…

【vue+websocket】vue本地链接websocket正常,线上部署websocket 无法加载响应数据【已解决】

1.nginx配置&#xff0c;进行反向代理 location /链接websocket的名称 {proxy_pass http://localhost:websocket端口号/链接websocket的名称;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade"; }2.开放websoc…

Ansible源码学习(一)

一、背景说明 基于Ansible1.1源码学习 二、目录结构 ansible核心目录 ansible ├─bin # 入口命令 │ ├─ansible │ ├─ansible-doc │ ├─ansible-playbook │ ├─ansible-pull ├─lib # 核心代码 │ └─ansible │ ├─callback_plugins …

Netty核心技术六--Netty核心模块组件

1. Bootstrap、ServerBootstrap Bootstrap 意思是引导&#xff0c;一个 Netty 应用通常由一个Bootstrap 开始&#xff0c;主要作用是配置整个 Netty 程序&#xff0c;串联各个组件&#xff0c;Netty 中 Bootstrap 类是客户端程序的启动引导类&#xff0c;ServerBootstrap 是服…