1.数据校验-拦截器-全局异常-json数据处理

news/2024/5/15 22:35:07/文章来源:https://blog.csdn.net/qq_62898618/article/details/126817219

目录

1.数据校验-拦截器-全局异常-json数据处理

1. JSR303

2. JSR303中含有的注解

3. spring中使用JSR303进行服务端校验

3.1 导入依赖包

3.2 添加验证规则

3.3执行校验

3.4 错误信息的展示

4. SpringMVC定义Restfull接口

5.1 增加spring配置

5.2 Controller

5.3 格式化返回数据

2. 拦截器介绍

1.1 什么是拦截器

1.2 与web过滤器的区别

1.3 执行时机

1.3 应用场景

2. 入门案例

1. 拦截器介绍

1.1 什么是拦截器

1.2 与web过滤器的区别

1.3 执行时机

1.3 应用场景

2.入门案例

2.1 创建自定义拦截器

2.2 配置文件

4. 开发示例

1.全局异常

1. 为什么使用全局一场处理

2. 异常处理流程

3. SpringMVC异常分类

4. 使用示例

4.1 SpringMVC自带的简单异常处理器

4.2 通过接口实现全局异常

4.3 使用注解方式定义全局异常

4.4 RestController异常处理


1.数据校验-拦截器-全局异常-json数据处理

1. JSR303

JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在 JavaEE6.0中,JSR303通过在Bean 属性中标注类似 @NotNull @Max 等标准的注解指定校验规则,并通过标准的验证接口对 Bean进行验证。

2. JSR303中含有的注解

@Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 true @AssertFalse 被注释的元素必须为 false @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 @Size(max=, min=) 被注释的元素的大小必须在指定的范围内 @Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 @Past 被注释的元素必须是一个过去的日期 @Future 被注释的元素必须是一个将来的日期 @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式


Hibernate Validator 附加的注解 @NotBlank(message =) 验证字符串非null,且长度必须大于0 @Email 被注释的元素必须是电子邮箱地址 @Length(min=,max=) 被注释的字符串的大小必须在指定的范围内 @NotEmpty 被注释的字符串的必须非空 @Range(min=,max=,message=) 被注释的元素必须在合适的范围内

注:HIbernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解外,另外HIbernate Validator还有JSR-380的实现

3. spring中使用JSR303进行服务端校验

3.1 导入依赖包

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.7.Final</version>
</dependency>

3.2 添加验证规则

package com.zking.mybatis01.model;
​
import lombok.Data;
​
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
​
@Data
public class Book {//定义分组 验证 public static interface Add{}public  static  interface  Edit{}
​@NotNull(message = "bid 不可为空" ,groups = Edit.class)private Integer bid;//只有我在调用莫个接口才会生效 @NotBlank(message = "bname 书本名称不可为空" ,groups = { Add.class,Edit.class })private String bname;@NotNull(message = "price 书本价格不可为空" ,groups = { Add.class,Edit.class })private Double price;private String fileid;
}
​

3.3执行校验

在请求处理方法中,使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过, 另外,验证参数后必须紧跟BindingResult参数,否则spring会在校验不通过时直接抛出异常。

注:@Valid和@Validated的区别 两者的作用是一样的,但@Validated功能更丰富,有分组功能。

//@ModelAttribute("books") 必须保存 参数 |  @Validated(Book.Add.class) 调用定义好的接口 只有被标记成添加的才会生效 
@RequestMapping("endtBook")             public String endtBook(@Validated(Book.Add.class) @ModelAttribute("books") Book bo, BindingResult bindingResult) {//如果出现 参数异常 返回为true 直接返回添加界面if(bindingResult.hasErrors()){
​return "book/endtbook";}
​if (bo.getBid() != null) {book.updBooks(bo);} else {book.addBooks(bo);}return "redirect:/bookList";}

3.4 错误信息的展示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
//spring web提供的form 标签
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body>
​
<f:form action="endtBook" modelAttribute="books" method="post"><f:hidden path="bid"/>
​<br><!-- <f:errors path="bname" /> 异常信息 -->书名:  <f:input path="bname" /><f:errors path="bname" />   
​<br>价格: <f:input path="price"/><f:errors path="price" />
​<br><input type="submit" value="提交">
</f:form>
</body>
</html>

实现效果

 

4. SpringMVC定义Restfull接口

json 数据处理 理解

在前后端分离开发中,服务端通过Json对象返回数据给前端使用。

导入架包

  <!-- 导入解析 Json的包  --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency>

5.1 增加spring配置

<!-- 转换器,将返回消息转换为json -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters"><list><ref bean="mappingJackson2HttpMessageConverter"/></list>
</property>
</bean>
​<!-- 处理中文编码,(spring通过该配置自动设置响应头)-->
<bean id="mappingJackson2HttpMessageConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
<property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>text/json;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list>
</property>
</bean>

注:spring为简化开发提供了丰富的组件,在使用时需要将组件配置到spring中,并为这些组件提供合适的参数。

5.2 Controller

 

5.3 格式化返回数据

在前后端分离模式的开发中,提供给前端使用的数据(或提供给第三方系统)通常需要按双方协商定义的格式返回,以方便解析。一般有两种处理方式:1)将用户Map组织格式化返回的数据,2)定义一个放回数据的实体来格式化返回的数据。

定义数据返回格式:

package com.zking.mybatis01.utils;
​
import org.springframework.validation.Errors;
​
import java.util.HashMap;
​
public class RetrunData extends HashMap<String, Object> {
​public RetrunData(int code, String msg, Object data) {this.put("code", code);this.put("msg", msg);this.put("data", data);}
​public void setCode(int code) {this.put("code", code);}
​public void setMsg(String msg) {this.put("msg", msg);}
​public void setData(Object data) {this.put("data", data);}
​public void setErrors(Object errors) {this.put("errors", errors);}
​
​
}
​

测试

package com.zking.mybatis01.controller;
​
import com.zking.mybatis01.utils.RetrunData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
​
import java.util.ArrayList;
import java.util.List;
​
@Controller
public class TestController {
​//发送异步请求  如果时普通的 controller 发送异步请求 需要添加注解@ResponseBody@RequestMapping("test")public RetrunData Mytest(){
​List<String > c= new ArrayList<>();c.add("e0");
​return new RetrunData(1,"buhao",c);}
}

2. 拦截器介绍

1.1 什么是拦截器

SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。

1.2 与web过滤器的区别

依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

过滤器:

  • 依赖与servlet容器,基于在实现上基于函数回调,可以对几乎所有请求进行过滤

  • 基于servlet标准,只要是web工程即可使用,通用性强

  • 过滤器的出现早已拦截器

拦截器:

  • 属于springmvc技术,必须依赖于springmvc环境采用使用

  • springmvc拦截器通常对处理器(controller)进行拦截

  • 拦截器只能拦截dispatcherServlet处理的请求

  • 可以使用spring提供的容器,及强大的依赖注入

1.3 执行时机

来自官方文档): 执行处理程序之前的拦截点。在HandlerMapping确定适当的处理程序对象之后,但在HandlerAdapter调用处理程序之前调用。DispatcherServlet处理执行链中的处理程序,该执行链由任意数量的拦截器组成,处理程序本身位于末尾。使用此方法,每个拦截器可以决定中止执行链,通常发送HTTP错误或写入自定义响应。

1.3 应用场景

1)日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。 2)权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面; 3)性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录); 4)通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个Controller中的处理方法都需要的,我们就可以使用拦截器实现。

2.入门案例

2.1 创建自定义拦截器

public class CustomInterceptor implements HandlerInterceptor {
​
​@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("CustomInterceptor  preHandle");return true;}
​@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("CustomInterceptor  postHandle");}
​@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("CustomInterceptor  afterCompletion");}
}

关于拦截器接口中定义的方法的说明:

  • preHandle方法 作用:用于对拦截到的请求进行预处理,方法接收布尔(true,false)类型的返回值,返回true:放行,false:不放行。 执行时机:在处理器方法执行前执行 方法参数: 1)request请求对象 2)response响应对象 3)handler拦截到的方法处理

  • postHandle方法 作用:用于对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改 执行时机:在处理器的方法执行后,视图渲染之前 方法参数: 1)request请求对象 2)response响应对象 3)handler拦截到的处理器方法 4)ModelAndView处理器方法返回的模型和视图对象,可以在方法中修改模型和视图

  • afterCompletion方法 作用:用于在整个流程完成之后进行最后的处理,如果请求流程中有异常,可以在方法中获取对象 执行时机:视图渲染完成后(整个流程结束之后) 方法参数: 1)request请求参数 2)response响应对象 3)handler拦截到的处理器方法 4)ex异常对象

拦截器的处理流程

 

为更好的理解拦截器接口中定义的方法的参数,可以使用如下代码:

  @Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {if(handler instanceof HandlerMethod){HandlerMethod handlerMethod = (HandlerMethod) handler;log.info("当前拦截的方法为:{}",handlerMethod.getMethod().getName());log.info("当前拦截的方法参数长度为:{}",handlerMethod.getMethod().getParameters().length);log.info("当前拦截的Bean为:{}",handlerMethod.getBean().getClass().getName());System.out.println("开始拦截---------");String uri = request.getRequestURI();System.out.println("拦截的uri:"+uri);}log.info("视图名称:"+modelAndView.getViewName());log.info("传给视图的模式:"+modelAndView.getModel().toString());System.out.println("CustomInterceptor02 postHandle");}

2.2 配置文件

在spring-mvc.xml文件中配置拦截器
​
  <mvc:interceptors><mvc:interceptor><!-- 该拦截器会拦截所有的请求 --><mvc:mapping path="/**"/><bean class="com.zking.mybatisdemo.interceptor.CustomInterceptor"/></mvc:interceptor><!-- 可在此 添加多个拦截器<mvc:interceptor><mvc:mapping path="/**"/><bean class="com.zking.mybatisdemo.interceptor.CustomInterceptor"/></mvc:interceptor>--></mvc:interceptors>

4. 开发示例

登录验证, 开发步骤:

  • 开发登录功能,当用户登录成功,将用户记入session

  • 开发拦截器,如果用户访问除登录功能之外的其他资源,则验证是否登录,否则不允许访问

1) 登录页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body><c:if test="${not empty error}"><div>${error}</div></c:if><form action="<%=request.getContextPath()%>/user/login" method="post">用户名: <input type="text" name="name"> <br data-tomark-pass>        密码: <input type="password" name="password"><br data-tomark-pass>        <input type="submit" value="提交"></form>
</body>
</html>

2)登录Controller

@Controller
public class LoginController {
​@RequestMapping("/")public String loginPage() {return "login";}
​@PostMapping("/user/login")public String login(String name, String password, HttpSession session, Model model) {
​if("admin".equals(name) && "123".equals(password)) {session.setAttribute("user", name);return "index";}model.addAttribute("error", "用户名或密码错误");return "login";}
​@GetMapping("/user/logout")public String logout(HttpSession session) {session.removeAttribute("user");return "redirect:/";}
}

3)编写index.jsp页面,可以是任何内容,可用于演示即可。 在index中加入退出系统的代码(也是为方便演示)

<a href="<%=request.getContextPath()%>/user/logout">退出</a>

测试可以登录后,可以进行拦截器的编写了

4)拦截器的编写,参考代码

public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
​String uri = request.getRequestURI();String contextPath = request.getContextPath();
​//登录页面,放行if (uri.endsWith(contextPath+"/") || uri.indexOf("/user/login") >= 0) {return true;}
​//其他情况需要验证登录HttpSession session = request.getSession();Object user = session.getAttribute("user");
​//已登录,放行if (Objects.nonNull(user)) {return true;}
​session.setAttribute("error", "请先登录");//request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);response.sendRedirect(contextPath+"/");
​//不再处理其他拦截器,直接返回return false;}
​
}

5) 将拦截器配置到spring-mvc.xml

    <mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.zking.mybatisdemo.interceptor.LoginInterceptor"></bean></mvc:interceptor></mvc:interceptors>

1.全局异常

1. 为什么使用全局一场处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

2. 异常处理流程

 

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

3. SpringMVC异常分类

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; 2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器; 3)使用@ControllerAdvice + @ExceptionHandler

4. 使用示例

4.1 SpringMVC自带的简单异常处理器

SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

1)在spring-mvc.xml 中加入如下配置

  
 <!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 ,需要在WEB-INF/jsp 下定义error.jsp 错误页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> <property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --> <property name="exceptionMappings"><props><prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean> 

2)配置错误页面 在WEB-INF/jsp 目录下,创建error.jsp, 与上面的spring-mvc.xml中的配置相对应

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><h1>系统异常,请与管理员联系</h1>
</body>
</html>

3)可以在Controller中直接抛出一个异常进行测试。

4.2 通过接口实现全局异常

通过实现异常处理处理接口HandlerExceptionResovler处理全局异常。

1) 实现接口

@Component
public class GlobalException implements HandlerExceptionResolver {
​@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
​ModelAndView mv = new ModelAndView();mv.setViewName("error");if(ex instanceof RuntimeException) {mv.addObject("msg", ex.getMessage());}
​return mv;}
}

注意: 使用这种方式,请将spring-mvc.xml中配置的全局异常删除。

4.3 使用注解方式定义全局异常

定义全局异常处理器:

@ControllerAdvice
public class HandlerGlobalException {
​@ExceptionHandlerpublic ModelAndView handler(Exception ex) {
​ModelAndView mv = new ModelAndView();if(ex instanceof RuntimeException) {mv.addObject("msg", ex.getMessage());}mv.setViewName("error");
​//如果系统直接返回JSON格式的错误数据,可以如下操作//mv.setView(new MappingJackson2JsonView());return mv;}
​
}

4.4 RestController异常处理

处理上面的mv.setView(new MappingJackson2JsonView());这种方式,来将错误信息使用JSON方式返回外,还可以使用如下方式:

@RestControllerAdvice = @ControllerAdvice + @ResponseBody

@RestControllerAdvice
public class HandlerRestGlobalException {
​@ExceptionHandlerpublic Map<String,Object> handler(Exception e) {Map<String,Object> map = new HashMap<>();if(e instanceof RuntimeException) {map.put("cod", -1);map.put("msg", e.getMessage());}return map;}
}

注意:返回JSON格式的数据,需要Jackson的支持,在pom.xml中加入jackson的依赖 还需要在 spring配置文件中配置好 jackson

       
 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version></dependency>

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

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

相关文章

Mstsc(远程桌面连接)命令的高级用法

Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但是如果说这个命令还有高级用法,估计很多人都没有用过,其实这个命令还是很强大的,今天咱们就来说一下mstsc的高级用法Mstsc远程桌面连接,这个是微软操作系统自带的一个命令,相信很多人都用过,但…

20220912--CSP-S模拟4

A. 石子游戏 B. 大鱼吃小鱼 C. 黑客 D. 黑客-续A. 石子游戏 首先了解一个叫做 \(\operatorname{Nim}\) 游戏的玩意 通常的 \(\operatorname{Nim}\) 游戏的定义是这样的: 有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)” 如果轮…

自制操作系统日志——第十二天

自制操作系统日志——第十二天 从今天开始&#xff0c;我们将花费两天的时间来进行计算机中定时器的制作。有了定时器后&#xff0c;才能够为程序和cpu更加便利的进行计时。可能会稍难一些了&#xff01;&#xff01;&#xff01; 做好准备&#xff0c;冲&#xff01;&#xf…

ConcurrentLinkedQueue解析

概述 ConcurrentLinkedQueue实际对应的是LinkedList,是一个线程安全的无界队列&#xff0c;但LinkedList是一个双向链表&#xff0c;而ConcurrentLinkedQueue是单向链表。ConcurrentLinkedQueue线程安全在于设置head、tail以及next指针时都用的cas操作&#xff0c;而且node里的…

00Android studio安装

目录一.下载Android studio二.安装Android studio三.打开软件一.下载Android studio 官网&#xff1a;https://developer.android.google.cn/studio 下载&#xff1a;由于是国外的网站&#xff0c;国内下载会比较慢 二.安装Android studio 打开&#xff1a; 点击【Next】 点击…

猿创征文|瑞吉外卖——管理端_员工管理

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 专栏&#xff1a;瑞吉外卖 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;一本好书&#xff0c;就像高级武功秘籍一样&#xff0c;哪怕只是从里面领悟到个一招半势&…

C# StringBuilder 底层深入原理分析以及使用详解

目录前言什么是StringBuilderStringBuilder的成员StringBuilder增加元素原理StringBuilder扩容原理Capacity&#xff1a;1&#xff0c;元素数量&#xff1a;0Capacity&#xff1a;1&#xff0c;元素数量&#xff1a;1Capacity&#xff1a;2&#xff0c;元素数量&#xff1a;2Ca…

开学季征文|卷生卷死之新学期大学生自救指南!!!

你好&#xff0c;这里是前情提要 正所谓 “ 宁可卷死自己&#xff0c;也要卷死同学 ” &#xff0c;在这个万物皆卷的时代&#xff0c;“卷”似乎早已与我们变得不可分割血脉相融&#xff0c;有道是卷卷更健康。我也知道卷卷更好&#xff0c;可是天不遂人愿&#xff0c;因为疫情…

Redis_09_Redis集群实现Sentinel哨兵应对高可用

文章目录一、前言二、Sentinel原理2.1 Sentinel原理2.2 Sentinel选主2.3 Sentinel功能小结三、Sentinel实践3.1 Sentinel配置3.2 实践&#xff1a;Sentinel基本使用3.2.1 实践&#xff1a;Sentinel搭建3.2.2 实践&#xff1a;主节点宕机之后的选主过程(Sentinel保证高可用)3.2.…

ERROR 2003 (HY000) Can‘t connect to MySQL server on ‘localhost3306‘ (10061)解决办法

这个解决办法是我根据网上一系列的方法准备突然成功的&#xff0c;所以我想可能是由于本身其不稳定造成的 首先&#xff0c;我在官网上下载了mysql文件&#xff0c;这个网上随便找都能找到怎么下载的 然后打开文件后&#xff0c;发现没有my.ini 所以我就找了一个文档放了进去…

【线性代数】MIT Linear Algebra Lecture 6: Column space and nullspace

Author&#xff5c; Rickyの水果摊 Time &#xff5c; 2022.9.12 Lecture 6: Column space and nullspace Lecture Info Instructor: Prof. Gilbert Strang Course Number: 18.06 Topics: Linear Algebra Official Lecture Resource: Resource Index of Linear Algebra …

HCIP-双机热备

一,双机热备原理 1.1双机热备简介FW部署在网络出口位置时,如果发生故障会影响到整网业务。为提升网络的可靠性,需要部署两台FW并组成双机热备。双机热备需要两台硬件和软件配置均相同的FW。两台FW之间通过一条独立的链路连接,这条链路通常被称之为“心跳线”。两台FW通过心…

美团面试官:高并发、任务执行时间短的业务怎样使用线程池?

前言 无论是互联网大厂还是一些中游公司的面试基本都会问到多线程与并发编程的知识&#xff0c;所以今天小编在这里做了关于这方面知识的一个笔记分享送给即将面试跳槽的程序员朋友们&#xff01; 首先关于多线程与并发的知识总结了一个思维导图&#xff0c;分享给大家 如果你…

【Pytorch】2022 Pytorch基础入门教程(完整详细版)

一、Pytorch 1.1 简介 Pytorch是torch的python版本&#xff0c;是由Facebook开源的神经网络框架&#xff0c;专门针对 GPU 加速的深度神经网络&#xff08;DNN&#xff09;编程。Torch 是一个经典的对多维矩阵数据进行操作的张量&#xff08;tensor &#xff09;库&#xff0…

从校园智能门锁预见万物互联的未来

随着物联网、移动互联网、大数据、云计算等信息技术的创新发展&#xff0c;被信息化驱动的教育行业实现了技术深化融合&#xff0c;智慧校园正逐步落地生根、开花结果。校园智能门锁是智慧校园的基础载体&#xff0c;也是实现教育信息化的基础载体。 NO.1校园智能门锁构建一体化…

【CSDN竞赛第五期】“三而竭”采用等比求和公式法的思考

原题题目 一鼓作气再而衰三而竭。 小艺总是喜欢把任务分开做。小艺接到一个任务&#xff0c;任务的总任务量是n。 第一天小艺能完成x份任务&#xff0c;第二天能完成x/k ... ...第t天能完成x/(k^(t-1))。 小艺想知道自己第一天至少完成多少才能完成最后的任务。 公式推导 第一…

[项目管理-25]:高效沟通的利器,结构思考力与树形结构化表达

作者主页(文火冰糖的硅基工坊)&#xff1a;文火冰糖&#xff08;王文兵&#xff09;的博客_文火冰糖的硅基工坊_CSDN博客 本文网址&#xff1a; 目录 前言&#xff1a; 第1章 结构化思考力概述 1.1 非结构化思考力的问题与结构化思路力的好处 1.2 什么是结构化思路力 1.3…

mysql中的mvcc机制

MVCC多版本并发控制 简述MySQL锁 在InnoDB引擎下&#xff0c;按锁的粒度分类&#xff0c;可以分为行锁和表锁。 行锁实际上是作用在索引之上的。当我们的SQL命中了索引&#xff0c;那锁住的就是命中条件内的索引节点(这就是行锁)&#xff0c;如果没有命中索引&#xff0c;那锁…

MySQL的主从复制

MySQL的主从复制 1、概述 主从复制是指将主数据库的 **DDL &#xff08;数据定义语句&#xff09;**和 **DML &#xff08;数据操作语句&#xff09;**操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#…

【flask进阶】Flask实现自定义分页(python web通用)

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域新星创作者。&#x1f61c;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;&#x1f4e3; 系列专栏&#xff1a;flask框架快速入门&a…