Java网络开发(Tomcat)——登陆和注册功能 的 迭代升级 从Jsp到JavaScript + axios + vue 同步到异步

news2024/11/23 1:46:44

目录

  • 引出
  • 前置工作vue+axios+resp
    • 0.vue版本的jsp模板
    • 1.导包--Json:pom.xml文件:
    • 2.新建一个专门用来处理响应的实体类ResData
    • 3.在axios中,所有响应必须是 resp.getWriter().write() 的方式,核心代码如下
    • 4.在jsp前端代码中导包:
    • 5.删除form表单,把页面都放在div框里,并且加上id=“app”
    • 6.在script中写逻辑
  • 登陆功能+保存登陆的用户名
    • 1.前端代码,loginVue.jsp文件 & 保存登陆用户名
    • 2.后端代码如下,LoginServlet.java文件:
    • 3.然后在index页面显示登陆的用户名
  • 注册功能
    • 1.前端代码registerVue.jsp
    • 2.后端代码RegisterServletVue.java
  • 附录:Vue+Axios遇到的bug汇总
      • 1.导包失败net:ERR ABORTED 404
      • 2.未定义错误msg is not defined,data写成date
      • 3.之前的form表单没有删
      • 4.没有加this,报未定义异常imgbtn is not defined
      • 5.post请求没加上下文,POST请求404,Uncaught (in promise)
      • 6.let app = new Vue没有加new
      • 7.一个没有报错信息的bug--应该写在created里
      • 8.一个报错定位不清楚的bug
  • 总结

引出

在之前的jsp版本的登陆和注册中,如下面博客:
Java网络开发(Tomcat)—— 登陆 和 注册功能 的实现 & 从html 到 jsp 迭代升级 & session保存登陆信息

在这里插入图片描述

本质是用同步请求实现登陆和注册功能,在学习Js+axios+vue之后,就可以用异步的方式来实现登陆,主要博客如下:

Java网络开发(Asynchronous)—— 从 Jsp 到 Ajax 的 axios 到 vue & 同步请求 到 异步请求

前端基础(JavaScript)——基础语法(变量,分支…)& Json对象【重要】& 函数定义 & 事件

前端基础(Vue)——基础语法({{}}, v-model, :src=“imagSrc“, v-for)& 事件@click & 属性和方法(this.add() + this.name)


前置工作vue+axios+resp

0.vue版本的jsp模板

要点:head导包;div框+id;script里写逻辑

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/vue.min-v2.5.16.js"></script>
</head>
<body>
<div id="app">

</div>

<script>
    let app = new Vue({
        // 选择操作的div区域
        el:"#app",
        // 数据区
        data:{},
        // 方法区
        methods:{},
        // 文档加载之后就执行
        created(){},
        // 整个页面全部加载完成后再执行
        mounted(){},
    })
</script>

</body>
</html>

带有axios请求的vue框架:

<script>
    let app = new Vue({
        el:"#app",
        data:{
            bookTypeList:[]
        },
        methods(){},
        // 文档加载之后就执行
        created(){
            axios.get("/day06/types/list/vue")
                .then(response=>{
                    console.log(response)
                    let resp = response.data;
                    console.log(resp);
                    this.bookTypeList=resp.data;

                },error=>{
                    console.log(error)
                })
        },
    })
</script>

1.导包–Json:pom.xml文件:

<!--    fastjson包-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.76</version>
    </dependency>

2.新建一个专门用来处理响应的实体类ResData

package com.tianju.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 响应的实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResData {
    // 返回码,200正常,10001参数错误。。。
    private Integer code;
    // 正常标识,success,ok
    private String msg;
    // 具体的信息,可以是对象
    private Object data;
}

3.在axios中,所有响应必须是 resp.getWriter().write() 的方式,核心代码如下

resp.getWriter().write(JSON.toJSONString(new ResData(1001, "输入为空", null)));

4.在jsp前端代码中导包:

<head>
    <title>用户登陆页面e</title>
<%--    如果没有加day06--%>
<%--    bug--%>
    <link rel="stylesheet" href="/day06/bootstrap/css/bootstrap.css">
    <script src="/day06/js/axios.min.js"></script>
    <script src="/day06/js/jquery-3.5.1.js"></script>
    <script src="/day06/bootstrap/js/bootstrap.js"></script>
    <script src="/day06/js/vue.min-v2.5.16.js"></script>

</head>

5.删除form表单,把页面都放在div框里,并且加上id=“app”

<div id="app">
        用户名:<input type="text" v-model="username"><br>&nbsp;&nbsp;码:<input type="password" v-model="password"><br>
        <span style="color: darkred">{{msg}}</span><br>
        <button @click="login">登陆</button>
        <button @click="reset">重置</button>
</div>

6.在script中写逻辑

<script>
    let app = new Vue({
        el:"#app",
        data:{},
        methods:{},
    })
</script>

登陆功能+保存登陆的用户名

登陆功的代码如下:

1.前端代码,loginVue.jsp文件 & 保存登陆用户名

  • localStorage.setItem(“username”,resp.data)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登陆页面e</title>
<%--    如果没有加day06--%>
<%--    bug--%>
    <link rel="stylesheet" href="/day06/bootstrap/css/bootstrap.css">
    <script src="/day06/js/axios.min.js"></script>
    <script src="/day06/js/jquery-3.5.1.js"></script>
    <script src="/day06/bootstrap/js/bootstrap.js"></script>
    <script src="/day06/js/vue.min-v2.5.16.js"></script>

</head>
<body>
<%--如果忘记删除form表单--%>
<%--bug--%>
<div id="app">
        用户名:<input type="text" v-model="username"><br>
        密&nbsp;&nbsp;码:<input type="password" v-model="password"><br>
        <span style="color: darkred">{{msg}}</span><br>
        <button @click="login">登陆</button>
        <button @click="reset">重置</button>
</div>
<script>
    let app = new Vue({
        el:"#app",
        data:{
            username:"",
            password:"",
            msg:""
        },
        methods:{
            login(){
                let params = new URLSearchParams();
                params.append("username",this.username);
                params.append("password",this.password)
                axios.post("/day06/comUser/login/vue",params)
                    .then(response=>{
                        console.log(response);
                        console.log(response.data);
                        let resp=response.data;
                        if (resp.code==200)
                        {
                            alert(resp.msg);
                            localStorage.setItem("username",resp.data)
                            location.href = "/day06/company/messList"
                        }
                        else
                        {
                            this.msg=resp.msg;
                        }
                    })
            },
            reset(){
                this.username="";
                this.password="";
                this.msg=""
            }

        }
    })
</script>

</body>
</html>

2.后端代码如下,LoginServlet.java文件:

package com.tianju.servlet.comUser;

import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.tianju.entity.ComUser;
import com.tianju.entity.ResData;
import com.tianju.service.IComUserService;
import com.tianju.service.impl.ComUserServiceImpl;
import com.tianju.util.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;

/**
 * 用户登陆的servletVue
 */
@WebServlet("/comUser/login/vue")
public class LoginServletVue extends HttpServlet {
    private IComUserService comUserService = new ComUserServiceImpl();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 输入不为空
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (StringUtils.isBlank(username) || StringUtils.isBlank(password)){
            resp.getWriter().write(JSON.toJSONString(
                    new ResData(1001, "输入为空", null)));
            return;
        }

        // 进行验证
        ComUser comUser = comUserService.queryByUsername(username);
        if (comUser==null || !comUser.getPassword().equals(SecureUtil.md5(password))){
            resp.getWriter().write(JSON.toJSONString(new ResData(1002, "用户名 | 密码错误", null)));
            return;
        }

        // ++++++登陆成功的用户对象存储到session中=====用户确定后续的操作是谁做的
        req.getSession().setAttribute("user", comUser);

        resp.getWriter().write(JSON.toJSONString(new ResData(200, "ok", comUser.getUsername())));

    }
}

3.然后在index页面显示登陆的用户名

欢迎您:
<%--这个改成vue的 --%>
<%--${sessionScope.user.username}--%>
{{username}}

核心代码如下:

<script>
    let app = new Vue({
        el:"#app",
        data:{
            username:"",
        },
        methods:{},
        created(){
            this.username=localStorage.getItem("username")
        }

    })
</script>

注册功能

在这里插入图片描述

1.前端代码registerVue.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册页面</title>
    <link rel="stylesheet" href="/day06/bootstrap/css/bootstrap.css">
    <script src="/day06/js/axios.min.js"></script>
    <script src="/day06/js/jquery-3.5.1.js"></script>
    <script src="/day06/bootstrap/js/bootstrap.js"></script>
    <script src="/day06/js/vue.min-v2.5.16.js"></script>
</head>
<body>
<div id="app">
    用户名:<input type="text" v-model="username"><br>&nbsp;&nbsp;码:<input type="text" v-model="password"><br>
    确认密码:<input type="text" v-model="rePassword"><br>&nbsp;&nbsp;&nbsp;别:
    男<input type="radio" v-model="gender" value="男"><input type="radio" v-model="gender" value="女"><br>
    出生日期:<input type="date" v-model="birthday"><br>
    <%--    如果要让验证码在点击时自动更新--%>
    验证码:<input type="text" v-model="imgCode">

    <img :src="imgsrc" @click="imgbtn">

    <br>

    <span style="color: darkred">{{msg}}</span><br>
    <button @click="register">注册</button>
    <button @click="reset">重置</button>
    <a href="/index.jsp">退出</a>

</div>

<script>
    let app = new Vue({
        el:"#app",
        data:{
            username:"",
            password:"",
            rePassword:"",
            gender:"",
            birthday:"",
            imgCode:"",
            msg:"",
            imgsrc:"/day06/register/image/get",

        },
        methods:{
            register(){
                let params = new URLSearchParams();
                params.append("username",this.username);
                params.append("password",this.password);
                params.append("rePassword",this.rePassword);
                params.append("gender",this.gender);
                params.append("birthday",this.birthday);
                params.append("imgCode",this.imgCode);
                console.log(params);
                axios.post("/day06/comUser/register/vue",params)
                    .then(response=>{
                        console.log(response);
                        console.log(response.data);
                        let resp = response.data;
                        if (resp.code==200)
                        {
                            alert("登陆成功");
                            // 保存登陆到local
                            localStorage.setItem("username",this.username);
                            // 跳转到index
                            location.href = "/day06/compMess/list.jsp";
                        }
                        else if (resp.code==1002){
                            // 更新一下验证码
                            this.imgbtn();
                            this.msg=resp.msg;
                        }
                        else
                        {
                            this.msg=resp.msg;
                        }
                    })
            },
            reset() {
                this.username="";
                this.password="";
                this.rePassword="";
                this.gender="";
                this.birthday="";
                this.imgCode="";
                this.msg="";
            },
            imgbtn(){
                // 切换图片
                this.imgsrc = '/day06/register/image/get?'+new Date().getMilliseconds();
            }
        }
    })
</script>

</body>
</html>

2.后端代码RegisterServletVue.java

package com.tianju.servlet.comUser;

import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.tianju.entity.ComUser;
import com.tianju.entity.ResData;
import com.tianju.service.IComUserService;
import com.tianju.service.impl.ComUserServiceImpl;
import com.tianju.util.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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 用vue版本的注册的servlet
 */
@WebServlet("/comUser/register/vue")
public class RegisterServletVue extends HttpServlet {
    private IComUserService comUserService = new ComUserServiceImpl();
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 用户注册的业务逻辑
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String rePassword = req.getParameter("rePassword");
        String sex = req.getParameter("gender");
        String birthday = req.getParameter("birthday");
        System.out.println(username+password+rePassword+sex+birthday);
        // +++加入+验证码输入
        String imgCode = req.getParameter("imgCode");

        // 1.输入不为空;
        if (StringUtils.isBlank(username)
        || StringUtils.isBlank(password)
        || StringUtils.isBlank(rePassword)
        || StringUtils.isBlank(sex)
        || StringUtils.isBlank(birthday)
        || StringUtils.isBlank(imgCode)){
            resp.getWriter().write(JSON.toJSONString(
                    new ResData(1001, "输入为空", null)));

            return;
        }

        // +++++判断验证码是否正确
        HttpSession session = req.getSession();
        // 从session中获取验证码
        String yzm = (String)session.getAttribute("yzm");
        // 忽略大小写 .equalsIgnoreCase
        if (!yzm.equalsIgnoreCase(imgCode)){
            resp.getWriter().write(JSON.toJSONString(
                    new ResData(1002, "验证码不正确", null)));
            return;
        }


        // 2.用户名不重复;
        ComUser comUserDb = comUserService.queryByUsername(username);
        if (comUserDb!=null){
            resp.getWriter().write(JSON.toJSONString(
                    new ResData(1003, "用户名重复", null)));
            return;
        }

        // 3.两次密码输入一致;
        if (!password.equals(rePassword)){
            // 两次密码不一致
            resp.getWriter().write(JSON.toJSONString(
                    new ResData(1004, "两次密码输入不一致,请检查", null)));
            return;
        }


        // 进行密码加密存储
        ComUser comUser = new ComUser();
        comUser.setPassword(SecureUtil.md5(password));
        comUser.setUsername(username);
        try {
            comUser.setBirthday(sdf.parse(birthday));
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        comUser.setSex(sex);

        System.out.println(comUser);


        // 4.保存信息到数据库
        comUserService.add(comUser);

        // 5.注册成功跳转到登陆页面
        resp.getWriter().write(JSON.toJSONString(
                new ResData(200, "注册成功", null)));

    }
}

附录:Vue+Axios遇到的bug汇总

1.导包失败net:ERR ABORTED 404

报错信息:

GET http://localhost:8080/bootstrap/css/bootstrap.css net:ERR ABORTED 404

在这里插入图片描述

2.未定义错误msg is not defined,data写成date

报错信息:ReferenceError:msg is not defined

在这里插入图片描述

另一种情况,不太好找:

在这里插入图片描述

3.之前的form表单没有删

导致发送两次请求
在这里插入图片描述

在这里插入图片描述

4.没有加this,报未定义异常imgbtn is not defined

Uncaught (in promise) ReferenceError: imgbtn is not defined

在这里插入图片描述

5.post请求没加上下文,POST请求404,Uncaught (in promise)

报错信息:

http://localhost:8080/comUser/register/vue 404

Uncaught (in promise)
{message:‘Request failed with status code 404’,name:‘AxiosError’,

在这里插入图片描述

6.let app = new Vue没有加new

报错信息:

vue.min-v2.5.16.js:6 Uncaught TypeError: Cannot read properties of undefined (reading ‘_init’)

在这里插入图片描述

7.一个没有报错信息的bug–应该写在created里

在这里插入图片描述

8.一个报错定位不清楚的bug

报错信息:

Uncaught TypeError: e.bind is not a function

在这里插入图片描述


总结

1.vue+axios前端固定格式,后端必须用resp.getWriter().write() ;
2.localStorage的应用,保存登陆成功的用户名;
3.登陆和注册功能的异步实现,JavaScript + axios + vue + resp;
4.遇到的诸多bug汇总,

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

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

相关文章

浅谈一级机电管道设计中的压力与介质温度

管道设计是工程设计中的一个非常重要的部分&#xff0c;管道的设计需要考虑到许多因素&#xff0c;其中就包括管道设计压力分类和介质温度分类。这两个因素是在设计管道时必须非常严格考虑的&#xff0c; 首先是管道设计压力分类。在管道设计中&#xff0c;根据工作要求和要传输…

详解 Ansible 自动化运维,提升工作效率

概要 Ansible 是一个模型驱动的配置管理器&#xff0c;支持多节点发布、远程任务执行。默认使用 SSH 进行远程连接。无需在被管理节点上安装附加软件&#xff0c;可使用各种编程语言进行扩展。 一、Ansible基本架构 上图为ansible的基本架构&#xff0c;从上图可以了解到其由以…

算法刷题-关于链表,你该了解这些!

关于链表&#xff0c;你该了解这些&#xff01; 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域…

mybatis-plus分页查询(springboot中实现单表和多表查询)

一、mybatis-plus单表查询 使用mybatis-plus实现单表分页查询 非常方便&#xff0c;主要操作步骤如下&#xff1a; 配置分页查询拦截器进行分页查询 1.首先&#xff0c;打开mybatis-plus官网的插件&#xff08;插件主体&#xff09; 或者点击mybatis-plus插件 我是配置在s…

KameAI:探索AI驱动的未来,体验聊天GPT与AI绘画的奇妙世界

人工智能的崛起与发展随着科技的飞速发展&#xff0c;人工智能(AI)已经逐渐成为我们生活中不可或缺的一部分。它的出现不仅改变了我们与世界的互动方式&#xff0c;还为各行各业带来巨大的便利。今天&#xff0c;我们就来聊一聊一个类似ChatGPT的人工智能网站—KameAI&#xff…

Nautilus Chain全球行分享会,上海站圆满举办

在北京时间 6 月 9 日&#xff0c;由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动&#xff0c;在上海顺利举办&#xff0c;本次分享会联合主办方还包 括 Stanford Blockchain Accelerator、Zebec Protocol、Tiger VC DAO、Crypto PHD、Rootz L…

Nginx【反向代理负载均衡动静分离】--上

Nginx【反向代理负载均衡动静分离】–上 先看2 个实际需求&#xff0c;引出Nginx 需求1: 访问不同微服务 示意图 需求2: 轮询访问服务 示意图 解决方案: Nginx 反向代理 负载均衡 动静分离 高可用集群 Nginx 在分布式微服务架构的位置 基本介绍 Nginx 是什么? 能干什…

solr快速上手:配置IK中文分词器(七)

0. 引言 solr作为搜索引擎&#xff0c;常用在我们对于搜索速度有较高要求且大数据量的业务场景&#xff0c;我们之前已经配置过英文分词器&#xff0c;但是针对中文分词不够灵活和实用&#xff0c;要实现真正意义上的中文分词&#xff0c;还需要单独安装中文分词器 solr快速上…

【shell 基础13】输入输出与重定向

文章目录 一. 标准输入和标准输出二、重定向1. 定义2. 输出的重定向3. 对标准错误输出重定向4. 输入的重定向 一. 标准输入和标准输出 linux中有三种标准输入输出&#xff0c;分别是STDIN&#xff0c;STDOUT&#xff0c;STDERR&#xff0c;文件描述符分别是 0、1、2。 当运行…

Android Paging3分页+ConcatAdapter+空数据视图+下拉刷新(SwipeRefreshLayout)+加载更多+错误重试 (示例)

文章目录 引入库数据模型定义分页 adapter加载更多 adapter空数据 adapter分页数据源ViewModel 提供加载数据源的方法结合以上实现的 Fragment数据重复问题 引入库 implementation androidx.paging:paging-runtime-ktx:3.1.1paging 库&#xff0c;目前还是有点小bug &#xff…

Java开发技巧-数据结构-使用HashSet判断主键是否存在、使用Pair成对结果返回/Triple三个对象返回

场景 Java中使用HashSet判断主键是否存在 HashSet实现Set接口&#xff0c;由哈希表&#xff08;实际上是HashMap&#xff09;实现&#xff0c;但不保证set的迭代顺序&#xff0c;并允许使用null元素。 HashSet的时间复杂度跟HashMap一致&#xff0c;如果没有哈希冲突则时间复…

EXCEL函数笔记1(数学函数、文本函数、日期函数)

数学函数 取整&#xff1a;INT(number) 取余&#xff1a;MOD(number,除数) 四舍五入&#xff1a;ROUND(number&#xff0c;保留几位小数) 取绝对值&#xff1a;ABS(number) 根号处理&#xff1a;SQRT&#xff08;number&#xff09; 0到1随机数&#xff1a;RAND&#xff08;&am…

Python神器Anaconda图文安装教程

来源&#xff1a;投稿 作者&#xff1a;Fairy 编辑&#xff1a;学姐 Anaconda简介 Anaconda是一种数据科学和机器学习的开发环境&#xff0c;它包含了大量的Python包、工具和库&#xff0c;以及可视化界面和集成开发环境。「Anaconda可以方便地管理Python环境和安装第三方软件…

⑧电子产品拆解分析-1拖4USB拓展坞

⑧电子产品拆解分析-1拖4USB拓展坞 一、功能介绍二、电路分析以及器件作用1、内部电路拆解 三、参考资料学习 一、功能介绍 ①USB2.0一拖四通讯&#xff1b;②具备OTG功能&#xff0c;可适配大部分USB接口设备&#xff1b; 二、电路分析以及器件作用 1、内部电路拆解 分析&am…

【分布式存储】聊一下分布式存储中分片机制

为什么需要分片 在服务端领域&#xff0c;主要特点是支撑7*24小时不间断的服务&#xff0c;而最终对各种行为会生产对应的数据&#xff0c;比如用户登陆/注册&#xff0c;发起订单交易、支付、身份验证&#xff0c;短信验证等情况都需要存储起来&#xff0c;其中包括各种各样的…

浏览器工作原理分析与首屏加载

正文 1. 页面加载时间线 我们先来一个老生常谈的面试题&#xff1a;从输入 URL 到页面加载完成的过程中都发生了什么事情&#xff1f; 这个面试题本身也是一个开放题&#xff0c;不同方向的工程师侧重也不一样。大抵的过程可以简化为&#xff1a; st>start: 输入URL e>…

WPS表格处理

wps表格中公式出来的内容如何转为纯文本 选中公式算出的结果区域&#xff0c;复制&#xff0c;在原区域上右键&#xff0c;选择性粘贴为数值&#xff0c;就转成文本了&#xff0c;当然公式也就消除了。 wps表格如何设置整列公式&#xff1f; 1、先来看看下面这个例子需做出商…

图像分割算法

文章目录 前言1. 基于区域的分割方法1.1 区域生长算法1.2 区域分裂合并算法1.3 分水岭算法1.3.1 分水岭算法原理1.3.2 opencv-python中分水岭算法的应用 2. 基于图的分割方法2.1 Grabcut图像分割 源码仓库地址 前言 图像分割是指将图像分成若干互不重叠的子区域&#xff0c;使…

如何卸载MySQL数据库以及删除所有有关信息

目录 前言 第一步 卸载mysql程序 第二步 删除安装目录的mysql项目 第三步 删除MySQL的相关注册表 第四步 删除C盘下的 C:\ProgramData\MySQL所有的文件 第五步 删除 C:\Documents and Settings\All Users\Application Data\MySQL 下的文件夹 第六步 重启电脑 尾语 前言…

使用crictl pull时报错:“unknown service runtime.v1alpha2.ImageService”

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 引言&#xff1a; crictl 是 kubernetes cri-tools 的一部分&#xff0c;是专门为 kubernetes 使用 …