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

【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 () {// 请求的urllet 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 () {// 请求的urllet 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函数中的数据要参与之后程序的运算,必须设置非异步  falsedataType:"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 {@Overrideprotected 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 {@Overrideprotected 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=18let 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();@Overrideprotected 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 多个条件 该如何拼接  动态SQLString 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.mzph.cn/news/627056.shtml

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

相关文章

【复习】人工智能 第7章 专家系统与机器学习

专家系统就是让机器人当某个领域的专家&#xff0c;但这章专家系统不咋考&#xff0c;主要靠书上没有的机器学习。 一、专家系统的基本组成 二、专家系统与传统程序的比较 &#xff08;1&#xff09;编程思想&#xff1a; 传统程序 数据结构 算法 专家系统 知识 推理 &…

maya , motionbuilder 骨骼动画相关操作与脚本

文章目录 Maya导入时增加namespacemaya 解除/增加父子关系maya 修改骨骼局部坐标系显示骨骼局部坐标系删除不需要的骨骼重命名骨骼重定向基础细节 Motionbuildermb同时打开两个动画文件 Maya 导入时增加namespace import pymel.core as pm pm.namespace(add"src") …

C++面试问题合集之哈希

1.什么是哈希 哈希&#xff08;Hash&#xff09;是一种将数据映射到固定大小的值&#xff08;哈希值&#xff09;的过程。在计算机科学中&#xff0c;哈希函数将任意长度的数据&#xff08;输入&#xff09;转换为固定长度的哈希值&#xff08;输出&#xff09;。哈希函数通过对…

SpringBoot项目打包

1.在pom.xml的build>plugins中加入如下配置 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.1.0</version><configuration>…

C++ STL--->stack和queue

文章目录 stackstack实现参考源码 queuequeue实现参考源码 stack stack文档 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的&#xff0c;容器适配器…

什么是Nginx

概念 Nginx (engine x)是一个高性能的HTTP和反向代理web服务器同时也提供IMAP/POP3/SMTP服务 主要功能反向代理 通过配置文件可以实现集群和负载均衡 静态资源虚拟化 图解 常见服务器 apache 超过百万并发后性能下降 nginx 操作简单支持并发量大 什么是代理 代理简单来说&a…

html+css 浮动、清除浮动、什么是BFC?、如何开启BFC

浮动 介绍&#xff1a; 其实早期的浮动是用来文字环绕图片效果,但是后来发现浮动还可以设置页面布局问题 块元素在文档流中默认垂直排列&#xff0c;如果希望块元素在页面中水平排列&#xff0c;可以使块元素脱离文档流 特点&#xff1a; 哪个元素设置浮动&#xff0c;哪个…

VUE3,自定义控制keep-alive缓存

安装插件 npm install vite-plugin-vue-setup-extend --save 在vite.config.ts中 import VueSetupExtend from vite-plugin-vue-setup-extend ..... plugins&#xff1a;[ vue(), VueSetupExtend(), ..... ] useKeepalive.ts import { ref } from "vue" export const…

win10系统postgresql重装软件后原数据如何迁移

1、备份postgresql安装目录下的data文件夹 2、重新安装postgresql同一版本的软件 3、停止postgresql-x64-12服务 4、替换data文件夹 删除postgresql安装后新的的data文件夹 删除后将第一步备份的data文件夹粘贴过来&#xff0c;还是同一位置 5、启动postgresql-x64-12服务 …

树莓派调用usb摄像头(三)

查看是否检索到摄像头 因为我的摄像头是usb 的所以使用一下命令查看摄像头 安装fswebcam sudo apt-get install fswebcam输入以下命令&#xff0c;开启摄像头 fswebcam --no-banner -r 640x480 image3.jpg sudo apt-get install cmake libjpeg8-dev 提示&#xff1a;Packag…

配置dns主从服务器,能够实现正常的正反向解析

一.DNS域名服务器原理及作用等介绍 1.DNS简介&#xff1a; DNS是互联网上的一项服务&#xff0c;担任域名和IP地址相互映射的一个分布式数据库&#xff0c;相较于IP&#xff0c;域名更便于记忆能够使人更方便的访问互联网。但是计算机只能基于IP来识别对方&#xff0c;而且要上…

vue3+ts+vite配置项目引入@surely-vue/table less报错

在项目当中报错Inline JavaScript is not enabled. Is it set in your options? 修改配置如下&#xff1a; return {css: {preprocessorOptions: {less: {javascriptEnabled: true //开启less编译&#xff0c;注意&#xff1a;这个很重要}}},}

怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准

2023年12月27日&#xff0c;上海怿星电子科技有限公司测试实验室&#xff08;下称&#xff1a;EPT LABS&#xff09;通过CNAS实验室认可批准&#xff0c;并于2024年1月5日正式取得CNAS实验室认可证书&#xff08;注册号CNAS L19826&#xff09;&#xff0c;标志着怿星科技的实验…

mysql group_concat函数使用

CREATE TABLE aa (id int(11) DEFAULT NULL,name varchar(50) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb41、基本查询 SELECT * FROM aa;2、以id分组&#xff0c;把name字段的值打印在一行&#xff0c;逗号分隔(默认) select id,group_concat(name) from aa group …

mac pro “RESP.app”意外退出 redis desktop manager

文章目录 redis desktop manager下载地址提示程序含有恶意代码“RESP.app”意外退出解决办法&#xff1a;下载python3.10.并安装重新打开RESP如果还是不行&#xff0c;那么需要替换错误路径&#xff08;我的没用&#xff09;外传 最近在研究redis的消息&#xff0c;看到了strea…

iOS UI掉帧和卡顿优化解决方案记录

UI卡顿原理 在 VSync 信号到来后&#xff0c;系统图形服务会通过 CADisplayLink 等机制通知 App&#xff0c;App 主线程开始在 CPU 中计算显示内容&#xff0c;比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去&#xff0c;由 GPU 进行…

vba设置excel单元格背景色

vba设置excel单元格背景色位蓝色 Sheet1.Cells(hang, 2).Interior.Color RGB(0, 0, 255) 参考链接 【VBA】给单元格设置背景色_vba 将一行底色置绿色-CSDN博客https://blog.csdn.net/s_h_m114_2/article/details/105787093 参考2 知乎 VBA--单元格的背景色设置 特此…

一文读懂【北交所】开通条件及交易规则!

近期市场持续萎靡不振&#xff0c;北交所却在大涨调整后&#xff0c;还能继续拉升&#xff0c;前些天还打起了“麻将”&#xff0c;“东南西北中”花式齐飞。这带给投资者朋友们极大的信心&#xff01;那么有些朋友还没有跟上吃肉&#xff0c;还不了解什么是北交所&#xff1f;…

GitLab Runner 实现项目 CI/CD 发布

Gitlab Runner简介 Gitlab实现CICD的方式有很多&#xff0c;比如通过Jenkins&#xff0c;通过Gitlab Runner等&#xff0c;今天主要介绍后者。Gitlab在安装的时候&#xff0c;就默认包含了Gitlab CI的能力&#xff0c;但是该能力只是用于协调作业&#xff0c;并不能真的去执行…