Java零基础教学文档servlet(3)

news2024/12/26 11:38:40

【AJax】

1.传统开发模式的不足

传统开发模式基于浏览器数据传输功能,页面填写数据/展示数据。浏览器通过访问一个URL地址,将页面的数据提交给服务器。服务器将需要展示的数据返回给浏览器,浏览器再进行数据解析,将数据呈现在用户面前。这种模式主要依赖于浏览器的渲染功能,并且浏览器每次渲染是都是整个页面进行渲染。整个页面包含:样式文件,图片资源,DOM标签.每次浏览器渲染时都要进行重新统一渲染,重新请求一些重复的资源数据.但是实际上变化的只是页面上的数据,一些静态资源没有发生变化.这种统一的重新渲染,导致以下不足:

  1. 操作服务器额外的负担,因为浏览器重新请求重复数据,服务器又不记录是否发送过,导致服务器重新发送,网络/磁盘读写都造成额外的负担.

  2. 浏览器重复解析数据,浏览器本身也产生了额外的开销.

程序的设计者,提出了一个理念,能不能只返回想要的数据?如果做到了根据需要返回数据,减少了服务器和浏览器的负担.提出了异步交互的理念.浏览器本身在渲染时,浏览器是占用状态,无法做其它事情的.异步交互,就是指浏览器在渲染时,将渲染的等待时间利用起来,做其它行为.就像同时在做多件事情.

1.1 什么是同步交互
首先用户向HTTP服务器提交一个处理请求。接着服务器端接收到请求后,按照预先编写好的程序中的业务逻辑进行处理,比如和数据库服务器进行数据信息交换。最后,服务器对请求进行响应,将结果返回给客户端,返回一个HTML在浏览器中显示,通常会有CSS样式丰富页面的显示效果。
在这里插入图片描述

如果浏览器在使用中,用户都是等待状态.用户全程的参与了整个请求到数据渲染的过程.类似早期排队充值话费/打饭.

1.2 同步交互的不足

  1. 同步交互的不足之处,会给用户一种不连贯的体验,当服务器处理请求时,用户只能等待状态,页面中的显示内容只能是空白。

  2. 因为已经跳转到新的页面,原本在页面上的信息无法保存,好多信息需要重新填写

  3. 这种交互的方式对于服务器和浏览器而言都存在压力.存在性能的损耗

2.异步交互的概念

指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。例如:在支付宝上充值话费.
在这里插入图片描述

在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。将用户请求放入消息队列,并反馈给用户,系统迁移程序已经启动,你可以关闭浏览器了。然后程序再慢慢地去写入数据库去。这就是异步。异步不用等所有操作等做完,就响应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好.类似于多个线程在进行运行.

3.什么是AJax

Ajax是基于异步交互思想,诞生的复合的前端技术.其核心浏览器厂商约定的一套用于进行网络请求数据交互的API.浏览器厂商通过Javascript暴露了一套API,可以用于使用JS时就能通过网络从服务器获取特定的数据,然后在利用DOM技术和CSS技术,实现页面的数据变化.

由于AJax技术是浏览器厂商提供的API,浏览器厂商各自早期没有统一规范,还由于浏览器技术一直在迭代.前端技术一直在更新.市面上就出现了一些对原生ajax技术进行封装的插件.比较早期就是jQuery插件,现在比较流行的axios插件.由于现在前端推荐DOM操作,比较推崇MVVM思想,而jQuery中很大比重的都是在进行DOM操作,很多企业中,提出了去”j”的理念.

3.1 jQuery中的ajax
由于原生的Ajax存在一些不足,浏览器的兼容性,整个请求需要分为5个步骤相对繁琐.基于这样的原因.jQuery插件对原生ajax进行了封装.简化了ajax的使用.

在使用ajax时,开发者主要请求地址和请求参数及返回的数据.jQuery中的ajax在使用时,主要只需要定义请求地址,参数及返回数据的处理即可.

3.1.1 jQuery中ajax使用

  1. 在页面引入jQuery的JS

  2. 编写前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jQuery-3.6.0.js"></script>
<style>
    p{
        color: red;
    }
</style>
</head>
<body>

<p id="msg"></p>
<button type="button" id="ajaxBtn">jQuery ajax简单案例</button>

<script>
    /* jQuery ajax 简单案例 */
    $("#ajaxBtn").click(function () {
        // 请求的url
        let url = "ajax.do";
        // 请求参数
        let param = {name:"韩梅梅",age:18};
        $.get(url,param,function (rs) {
            console.log("返回数据为:",rs);
            $("#msg").html(rs);
        })
    });
</script>
</body>
</html>

3.1.2 jQuery中核心方法
在这里插入图片描述

3.1.3 ajax方法核心配置参数
在这里插入图片描述

3.1.3.1 ajax方法的演示
3.1.3.1.1 前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jQuery-3.6.0.js"></script>
<style>
    p{
        color: red;
    }
</style>
</head>
<body>

<p id="msg"></p>
<button type="button" id="ajaxBtn">jQuery ajax简单案例</button>
<button type="button" id="ajax">ajax方法演示</button>


<script>
    /* jQuery ajax 简单案例 */
    $("#ajaxBtn").click(function () {
        // 请求的url
        let url = "ajax.do";
        // 请求参数
        let param = {name:"韩梅梅",age:18};
        $.get(url,param,function (rs) {
            console.log("返回数据为:",rs);
            $("#msg").html(rs);
        })
    });

    /* 演示ajax 方法 */
    $("#ajax").click(function () {
        let m = 10;
        let settings = {
            url:"jquery.do",// 请求地址
            type:"post",// 请求方法
            timeout:1000,// 超时时间  1秒
            data:{ // 请求参数
                name:"韩梅梅",
                age:18
            },
            async:false,// 是否异步   如果是异步 则 ajax 函数没有执行完成就能执行之后的程序.如果非异步则必须等待ajax程序执行完成才能执行之后的程序
            // 如果ajax函数中的数据要参与之后程序的运算,必须设置非异步  false
            dataType:"json", // 期望返回的数据类型,一般浏览器会将返回的数据当做自己期望的类型,如果不是期望类型则程序会异常,通过火狐浏览器查看
            beforeSend:function () {
                console.log("我要请求了!!!!")
                //
                console.log("加载中....在转圈圈...")
            },
            success:function (data,req,xh) { // 请求成功时调用的方法
                console.log(data) // 返回的数据
                console.log(req) // 消息
                console.log(xh) // XMLHttpRequest 对象
                // 将数据放入到 p 标签
                $("#msg").html(data);
                // 改变 m的值
                m = m + 100;
            },
            complete:function () {
                // 标识请求完成调用的函数  不论成功还是失败都会调用
                console.log("取消转圈圈...")
            },
            error:function (xh,status) { // error 两种情况触发 :1. url地址错误  2.服务器内部程序异常
                console.log("xh:",xh)  // ajax 对象
                console.log("status:",status) // 错误信息
            }
        };
        $.ajax(settings);
        console.log("m的值:",m);
    });
</script>
</body>
</html>

3.1.3.1.2 后端代码

package com.powernode;

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.io.PrintWriter;

@WebServlet("/jquery.do")
public class JQueryAjaxServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   /*     try {
            // 线程休眠 5 秒
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }*/
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name +" " +age);
        PrintWriter writer = resp.getWriter();
        /* html   head  body   p   style */
        writer.print("{\"name\":\"Hello jQuery ajax\"}");
        writer.flush();
        writer.close();
    }
}

3.1.4 get/post方法演示

在实际使用中,开发者只关注2个点,请求信息和返回的数据.jQuery提供一些方法对ajax方法进行简化,如:get(url,[param],function)/post(url,[param],function).分别表示get类型的异步请求和post异步请求(比较常用).

3.1.4.1 演示案例

/**
 *  演示 get 方法
 */
$("#get").click(function () {
    $.get("jquery.do",{name:"韩梅梅",age:18},function (rs) {
        console.log(rs)
        $("#msg").html(rs);
    })
});
/**
 *  演示 post 方法
 */
$("#post").click(function () {
    $.post("jquery.do",{name:"韩梅梅",age:18},function (rs) {
        console.log(rs)
        $("#msg").html(rs);
    })
});

3.2 axios的使用

首先要在页面引入axios的js插件.参考:axios中文网.

3.2.1 axios应用
3.2.1.1 后端代码

package com.powernode;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
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.io.PrintWriter;

@WebServlet("/axios.do")
public class AxiosServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
//        ServletInputStream inputStream = req.getInputStream();
//        byte[] b = new byte[1024];
//        int len = inputStream.read(b);
//        System.out.println(new String(b,0,len,"UTF-8"));
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        // 将字符串转 对象
        System.out.println(name +" " +age);
        PrintWriter writer = resp.getWriter();
        /* html   head  body   p   style */
        writer.print("{\"name\":\"Hello axios ajax\"}");
        writer.flush();
        writer.close();
    }
}

3.2.1.2 前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/axios.js"></script>
</head>
<body>
<p id="msg"></p>
<button id="get">不带参数的get请求</button>
<button id="getParam">带参数的get请求</button>
<button id="post">post请求</button>
<script>
    /**
     *  演示 axios 的get 请求
     *   axios 默认就是  get 请求
     */
    document.getElementById("get").onclick = function () {
        axios.get("axios.do")
            // 请求完成时调用的函数
            .then(function (response) {
                // 整个响应数据对象
                console.log(response);
                // 默认的axios的配置信息
                console.log(response.config);
                // service 方法返回的具体的数据
                console.log(response.data);
                // 返回的响应头信息
                console.log(response.headers);
                // http 响应码
                console.log(response.status);
            }) // 请求发生异常时调用的函数
            .catch(function (error) {
            console.log(error);
        });
    }

    /**
     * 带参数的get 请求
     */
    document.getElementById("getParam").onclick = function () {
        axios.get("axios.do",{
            params:{
                name:"韩梅梅",
                age:18
            }
        })
            // 请求完成时调用的函数
            .then(function (response) {
                // 整个响应数据对象
                console.log(response);
                // 默认的axios的配置信息
                console.log(response.config);
                // service 方法返回的具体的数据
                console.log(response.data);
                // 返回的响应头信息
                console.log(response.headers);
                // http 响应码
                console.log(response.status);
            }) // 请求发生异常时调用的函数
            .catch(function (error) {
                console.log(error);
            });
    }

    /**
     *  post 请求
     */
    document.getElementById("post").onclick = function () {
        axios.post("axios.do",{
                name:"韩梅梅",
                age:18
            },{
            // 为 post 请求 兼容表单 URL参数编码问题
            transformRequest: [function (data, headers) {
                console.log(" 数据格式处理.....")
                console.log(data)
                // 对 data 进行任意转换处理
                // {name:"hanmeimei",age:18}   ---> name=韩梅梅&age=18
                let formData = new Array();
                // 循环对象
                for(name in data){
                   // item 对象中的属性  : name   age
                    // 根据动态的属性名 获取对应的值
                    let value = data[name];
                    console.log(name,"=",value)
                    formData.push(name+"="+value)
                }
                console.log(formData)
                formData = formData.join("&");
                console.log(formData)
                return formData;
            }],
            }
        )
            // 请求完成时调用的函数
            .then(function (response) {
                // 整个响应数据对象
                console.log(response);
                // 默认的axios的配置信息
               // console.log(response.config);
                // service 方法返回的具体的数据
                //console.log(response.data);
                // 返回的响应头信息
                //console.log(response.headers);
                // http 响应码
                //console.log(response.status);
            }) // 请求发生异常时调用的函数
            .catch(function (error) {
                console.log(error);
            });
    }

</script>

</body>
</html>

4.浏览器跨域访问

在Ajax请求中,JS是基于浏览器进行网络通信的.这种功能必须依附浏览器,出于安全的考虑,浏览器会对JS通信的数据进行检查.浏览器对数据检查通过之后,才会将通信数据移交给JS程序.浏览器最基本检查策略叫同源策略.是一种最基本安全保护机制

4.1 同源策略
在网络访问中,必须存在3种数据:协议/域名/端口.如果3种数据一致就标识同源访问,如果不一致就是非同源访问.默认浏览器只支持同源访问.

以下就是非同源访问的浏览器异常信息.也被称之为跨域访问.
在这里插入图片描述

当前浏览器访问地址:http://localhost:8080/ajax_crud/index.html

ajax的访问地址:http://127.0.0.1:8080/ajax_crud/user.do

由于当前浏览器地址的域名:localhost,但是ajax的地址是127.0.0.1虽然都是标识同一个地址,但是浏览器检测时认为和自己的不一致,所以进行抛出了异常,认为存在跨域访问.

4.2 跨域解决
跨域问题解决方案比较多,例如:jsonp,服务器允许跨域访问设置.浏览器既然会检查数据,服务器返回数据时,直接通知浏览器本次访问是允许跨域访问的.需要通过响应头通知浏览器.

// 允许跨域访问  * 任何访问源
resp.addHeader("Access-Control-Allow-Origin","*");

5.Ajax综合案例

利用ajax 实现增/删除/查/改.

5.1 后端代码
5.1.1 servlet

package com.powernode.servlet;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.powernode.dao.UserDao;
import com.powernode.domain.User;

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.io.PrintWriter;
import java.util.List;

/**
 *   在servlet中 默认只有service 能够提供服务
 *   那么出现 同类请求存在多个  例如 : 用户的请求  新增  删除  修改  查询 等等  难道创建多个 ?
 *   通过设计的方式解决问题:
 *      每个操作中,要求额外传递一个参数 标识是什么操作. 例如 : 如果是新增  则  传递 service = add
 *      删除 则传递  service = delete
 *      修改 则传递 service = update
 *      查询 则传递service = query
 *   在service 方法中 根据 service 参数的值  进行 分条件调用
 */
@WebServlet("/user.do")
public class UserServlet  extends HttpServlet {

    UserDao userDao = new UserDao();

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String service = req.getParameter("service");
        if (StrUtil.equals(service,"add")){
            // 处理 新增的方法
            add(req,resp);
        }else if (StrUtil.equals(service,"delete")){
            // 处理 新增的方法
            delete(req,resp);
        }else if (StrUtil.equals(service,"query")){
            // 处理 新增的方法
            query(req,resp);
        }else if (StrUtil.equals(service,"update")){
            // 处理 新增的方法
            update(req,resp);
        }
    }

    /**
     *  处理更新请求
     * @param req
     * @param resp
     */
    private void update(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String id = req.getParameter("id");
        String realname = req.getParameter("realname");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        userDao.update(Integer.parseInt(id),username,password,realname);
        // 使用UTF-8格式处理字节数据
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("success");
        writer.flush();
        writer.close();
    }

    /**
     * 处理查询请求
     * @param req
     * @param resp
     */
    private void query(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 获取输入的姓名
        String realname = req.getParameter("realname");
        List<User> users = userDao.selectAll(realname);
        // 使用JSON格式输出
        // 表示返回json格式数据
        resp.setContentType("text/json;charset=utf-8");
        // 使用UTF-8格式处理字节数据
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        // 将 List 转 JSON字符串
        String data = JSON.toJSONString(users);
        //输出数据
        writer.write(data);
        writer.flush();
        writer.close();
    }

    /**
     * 处理删除请求
     * @param req
     * @param resp
     */
    private void delete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String id = req.getParameter("id");
        userDao.delete(Integer.parseInt(id));
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("success");
        writer.flush();
        writer.close();

    }

    /**
     * 处理新增请求
     * @param req
     * @param resp
     */
    private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String realname = req.getParameter("realname");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        userDao.add(username,password,realname);
        // 使用UTF-8格式处理字节数据
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("success");
        writer.flush();
        writer.close();
    }
}

5.1.2 dao

package com.powernode.dao;

import cn.hutool.core.util.StrUtil;
import com.powernode.domain.User;

import java.util.List;

/**
 * 用户表操作类
 */
public class UserDao extends BaseDao {

    /**
     *  新增用户
     * @param username
     * @param password
     * @param realname
     */
    public void add(String username, String password,String realname) {
        String sql = "insert into user (username,password,realname) value(?,?,?)";
        super.executeUpdate(sql,username,password,realname);
    }

    /**
     * 删除用户
     * @param id
     */
    public void delete(Integer id) {
        String sql = "delete from user where id=?";
        super.executeUpdate(sql,id);
    }

    /**
     * 修改用户
     * @param id
     * @param username
     * @param password
     * @param realname
     */
    public void update(Integer id, String username, String password,String realname) {
        String sql = "update user set username = ?,password=? ,realname=? where id = ?";
        super.executeUpdate(sql,username,password,realname,id);
    }

    /**
     * 查询所有的用户
     * @param realname
     * @return
     */
    public List<User> selectAll(String realname) {
        // TODO 多个条件 该如何拼接  动态SQL
        String sql = "select id,username,password,realname from user";
        if (StrUtil.isNotBlank(realname)){
            sql = sql +"  where realname like '%"+realname+"%' ";
        }
        return super.executeQueryList(sql,User.class);
    }
}

5.2 列表页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<p><input id="realname"/>
    <button id="searchBtn">查询</button>
</p>
<hr>
<a href="add.html">新增</a>
<hr>
<table id="dataTable">
    <tr>
        <td>ID</td>
        <td>登录名</td>
        <td>密码</td>
        <td>姓名</td>
        <td>操作</td>
    </tr>
</table>
<script src="js/jQuery-3.6.0.js"></script>
<script>
    // 全局性的存储 当前table 用户信息
    let globalUser ;
    /**
     * 渲染表格
     */
    function renderTable() {
        // 获取搜索的关键词
        let realname = $("#realname").val();
        $.get("user.do", {service: "query", realname: realname}, function (rs) {
            // 数组长度如果为 0 表示没有数据
            if (rs.length == 0) {
                // 结束程序
                return false;
            }
            globalUser = rs;
            // 获取表格dom 对象
            let table = $("#dataTable");
            // 清空表格
            // 获取所有 tr 但是 索引大于 0
            $("tr:gt(0)").remove();
            for (let user of rs) {
                let id = user.id;
                let username = user.username;
                let password = user.password;
                let realname = user.realname;
                tr ="<tr><td>"+id+"</td>"+"<td>"+username+"</td>"+"<td>"+password+"</td>"+"<td>"+realname+"</td><td><button οnclick='del("+id+")'>删除</button><button οnclick='update("+id+")'>修改</button></td></tr>"
                table.append(tr);
            }

        });
    }
    $("#searchBtn").click(function () {
        renderTable();
    });
    renderTable();

    /**
     *  删除方法
     * @param id
     */
    function del(id) {
        $.get("user.do",{service:"delete",id:id},function (rs) {
            if (rs == "success"){
                renderTable();
                return false;
            }
            alert("删除失败")
        })
    }

    function update(id) {
        // 循环所有的用户
        for (let user of globalUser) {
            // 如果id一直 说明 就是要修改的用户的
            if (user.id == id){
                // user 本身是 object
                // sessionStorage 存储的 字符串类型
                // JSON.stringify(user) 将对象转化为 json 字符串
                sessionStorage.setItem("user",JSON.stringify(user))
            }
        }
        // 跳转到更新页面
        location.href='update.html';
    }
</script>
</body>
</html>

 

**5.3 新增列表**

```c

```c
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form >
    <p>姓名:<input name="realname" id="realname" /></p>
    <p>用户名:<input name="username" id="username" /></p>
    <p>密码:<input name="password" id="password" /></p>
    <button type="button" id="subBtn">提交</button>
    <button type="button" id="back">返回</button>
</form>
<script src="js/jQuery-3.6.0.js"></script>
<script>
    $("#subBtn").click(function () {
        let realname = $("#realname").val();
        let username = $("#username").val();
        let password = $("#password").val();
        $.post("user.do",{service:"add",realname:realname,username:username,password:password},function (rs) {
            // 如果返回值 success 表示添加成功
            // 返回到 index页面
            if (rs == 'success'){
                location.href = "index.html";
                return false;
            }
            alert("添加失败!");
        })

    });
    $("#back").click(function () {
        location.href = "index.html";
    });
</script>
</body>
</html>

**5.4 修改页面**

```c
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form >
  <p>姓名:<input name="realname" id="realname" /></p>
  <p>用户名:<input name="username" id="username" /></p>
  <p>密码:<input name="password" id="password" /></p>
  <button type="button" id="subBtn">提交</button>
  <button type="button" id="back">返回</button>
</form>
<script src="js/jQuery-3.6.0.js"></script>
<script>
    let user ;
    //向表单填充数据
    function initForm() {
        user = sessionStorage.getItem("user");
        console.log(user)
        // 将字符串转对象
        user = JSON.parse(user);
        $("#realname").val(user.realname);
        $("#username").val(user.username);
        $("#password").val(user.password);
    }
    initForm();
    $("#subBtn").click(function () {
        let realname = $("#realname").val();
        let username = $("#username").val();
        let password = $("#password").val();
        $.post("user.do",{service:"update",id:user.id,realname:realname,username:username,password:password},function (rs) {
            // 如果返回值 success 表示添加成功
            // 返回到 index页面
            if (rs == 'success'){
                location.href = "index.html";
                return false;
            }
            alert("修改失败!");
        })
    });
    $("#back").click(function () {
        location.href = "index.html";
    });
</script>
</body>
</html>

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

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

相关文章

QT quick基础:加载资源文件(字体)

一、加载字体 1、准备字体库 Roboto-Regular.ttf 2、在工程下面新建文件夹fonts&#xff0c;并将字体库放到该文件夹下面。 3、在QT Create 工程中添加字体。 添加现有文件选择Roboto-Regular.ttf。 4、执行qmake 5、在.qml文件加载字体 /* 加载字体 */FontLoader {id: f…

如何在 Windows 10 中恢复已删除的文件

几乎每个 Windows PC 用户都曾意外删除过他们想要保留的文件。尽管您的第一步应该是检查回收站&#xff0c;但它可能不在那里。Windows 10 不会自动将所有已删除的文件保留在回收站中。有时它会永久删除文件&#xff0c;让您再也看不到它们。如果您遇到这种情况&#xff0c;我们…

如何使用Docker一键部署WBO白板并实现固定公网地址远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

AI数字人短视频变现项目:打造短视频运营变现新模式

随着社交媒体和短视频平台的兴起&#xff0c;越来越多的人开始关注如何将短视频变现。在这个时代&#xff0c;创新和科技成为了推动变现模式发展的关键。AI数字人作为一种全新的创新形式&#xff0c;正在迅速进入人们的视野。本文将介绍AI数字人短视频变现项目&#xff0c;以及…

新晋中科院TOP,不到3个月出结果,编辑处理效率真心高!

【SciencePub学术】 Measurement 期刊评说 网 友 辣 评 评说1&#xff1a;不到三个月出结果&#xff0c;挺快的&#xff0c;期刊效率高&#xff0c;2023年12月27日期刊更新成TOP了&#xff0c;值得推荐&#xff01; 评说2&#xff1a;一般送审了就问题不大&#xff0c;超过…

公众号申请数量已超上限的解决方法

一般可以申请多少个公众号&#xff1f; 公众号申请限额在过去几年内的经历了很多变化。对公众号申请限额进行调整是出于多种原因&#xff0c;确保公众号内容的质量和合规性。企业公众号的申请数量从50个到5个最后到2个&#xff0c;对于新媒体公司来说&#xff0c;这导致做不了…

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测。 2.自带数据…

用Perl采集美容化妆目标网站做一个深度调研

在Perl中编写爬虫程序涉及到几个关键步骤&#xff0c;包括使用相关的库来发送HTTP请求和解析HTML内容。首先我们要了解Perl爬虫程序编程得几大步骤&#xff1a;安装必要的Perl模块—创建一个用户代理—发送HTTP请求—解析响应内容—提取所需数据—存储或进一步处理数据。所以说…

设计模式之开闭原则:如何优雅地扩展软件系统

在现代软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。其中&#xff0c;开闭原则作为面向对象设计的六大基本原则之一&#xff0c;为软件系统的可维护性和扩展性提供了强大的支持。本文将深入探讨开闭原则的核心理念&#xff0c;以及如何在实际项目中运用这一原则&a…

2024山东省“信息安全管理与评估“---内存取证(高职组)

2024山东省“信息安全管理与评估“—内存取证(高职组) PS:需要环境私信博主 内存取证: 任务环境说明: 攻击机:kali 物理机:Windows 任务说明:本次需要检测的镜像已放置放在本机桌面上。 这里想学取证的小伙伴可以参考:http://t.csdnimg.cn/EHwpu 1.从内存中获取到用户…

在公网服务器搭建CobaltStrike

FLAG&#xff1a;自律是对抗悲伤的唯一出路 专研方向: 服务器Centos&#xff0c;CS渗透神器 每日emo&#xff1a;04年的猴&#xff0c;过的怎么样了 欢迎各位与我这个菜鸟交流学习 在公网服务器搭建CobaltStrike&#xff1a; 之前玩cs都是在局域网&#xff0c;准备积累以下战…

spring常见漏洞(3)

CVE-2017-8046 Spring-Data-REST-RCE(CVE-2017-8046)&#xff0c;Spring Data REST对PATCH方法处理不当&#xff0c;导致攻击者能够利用JSON数据造成RCE。本质还是因为spring的SPEL解析导致的RCE 影响版本 Spring Data REST versions < 2.5.12, 2.6.7, 3.0 RC3 Spring Bo…

国自然热点|超级增强子“super”在哪?cell重磅发现:新型DNA调控元件——促进子

增强子&#xff08;enhancer&#xff09;&#xff0c;又可称为强化子&#xff0c;是DNA上一段可与蛋白质&#xff08;反式作用因子&#xff0c;trans-acting factor&#xff09;结合的区域&#xff0c;可以被转录因子等蛋白结合从而激活基因转录。1981年&#xff0c;增强子首次…

中仕公考:2024年度国考笔试分数公布,进面名单已出

2024年度考试录用公务员笔试成绩和合格分数线已经公布&#xff0c;考生们可以自行登录公务员专题网站查询成绩。 进面人员名单根据规定的面试比例&#xff0c;按照笔试成绩从高至低的顺序&#xff0c;1月14日已经公布进面名单。 没有进入面试人员名单的考生可以关注调剂&…

上海亚商投顾:沪指冲高回落 旅游板块全天强势

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日冲高回落&#xff0c;创业板指跌近1%&#xff0c;北证50指数跌超3%。旅游、零售板块全天强势&#xf…

智能代码:生成式 AI 在软件开发中的革命性角色

想象一下&#xff0c;在智能手机革命性地改变了我们的生活之后&#xff0c;现在轮到了生成式 AI 在软件开发领域掀起风暴。你知道吗&#xff0c;如果代码能自己编写自己&#xff0c;这将是多么惊人的一步&#xff1f;这就好比我们现在能轻松地用手机应用管理日常生活一样&#…

vs2022配置OpenCV测试

1&#xff0c;下载Opencv安装包 OpenCV官网下载地址&#xff1a;Releases - OpenCV 大家可以按需选择版本进行下载&#xff0c;官网下载速度还是比较慢的&#xff0c;推荐大家使用迅雷进行下载 下载安装包到自定义文件夹下 双击安装 按以下图示进行安装 2、 添加环境变量 打…

Vue v-model 详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

精品基于Uniapp+springboot车辆充电桩缴费管理系统管理系统App-地图

《[含文档PPT源码等]精品基于Uniappspringboot充电桩管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇&#xff0c;它有个旋转叶片&#xff0c;每个旋转叶片的编号是&#xff0c;请输出它旋转后&#xff0c;中心点与地面的直线距离哪个叶片最近&#xff0c;输出此旋转叶片的编号。默认以“”的形式。 当时&#xff1a; 当或时&#xff0c;…