当前位置: 首页 > news >正文

ssm-springmvc-学习笔记

简介

简单的来说,就是一个在表述层负责和前端数据进行交互的框架

帮我们简化了许多从前端获取数据的步骤

springmvc基本流程

用户在原本的没有框架的时候请求会直接调用到controller这个类,但是其步骤非常繁琐

所以我们就使用springmvc进行简化

当用户发送请求时,首先到达的是Servlet,解析用户的请求,然后去mapping类寻找用户请求的是类中的哪一个方法

接着寻找到是哪个类之后,在发送request到Adapter去,此时adapter会拆解request然后将其中有用的参数发送给handler执行对应的逻辑

接着handler执行完毕后再发送adapter处理JSON串给servlet一个respone报文,返回给前端做出数据响应

核心组件

1. DispatcherServlet :  SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
2. HandlerMapping :  SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]
3. HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器![经理]
4. Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
5. ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

springmvc运用大致流程

首先声明一下controller

通过requestMapping指定该类的访问路径

package com.atguigu.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloController {//     对外访问的地址,到handlerMapping注册的注册@RequestMapping("springmvc/hello")@ResponseBody//直接返回字符串给前端不需要找视图public String Hello(){System.out.println("hello");return "springMvc Hello";}
}

接着我们声明一个配置类,将各种springmvc需要的类放入ioc容器当中

通过Bean组件放入ioc容器


//TODO: 导入handlerMapping和handlerAdapter的三种方式
//1.自动导入handlerMapping和handlerAdapter [推荐]
//2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载
//3.使用@Bean方式配置handlerMapper和handlerAdapter
@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 进行controller扫
//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class MvcConfig implements WebMvcConfigurer {@Beanpublic HandlerMapping handlerMapping(){return new RequestMappingHandlerMapping();}@Beanpublic HandlerAdapter handlerAdapter(){return new RequestMappingHandlerAdapter();}}

那么我们知道spring中将类放入ioc容器中是需要读取一些配置文件的

那么将springmvc需要的各种工具类放入ioc容器中依靠的是如下的接口

AbstractAnnotationConfigDispatcherServletInitializer
package com.atguigu.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;//该类可以被web项目加载,会初始化ioc容器,会设置dispatcherServlet的地址
public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}//    设置我们项目的配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MvcConfig.class};}//    配置springmvc内部自带的servlet的访问地址@Overrideprotected String[] getServletMappings() {return new String[]{"/"};
//        单个斜杠就代表着处理所有的用户请求的意思}
}

那么上述的方法是如何实现将类放入ioc容器中呢?

我们先介绍一个接口

这个接口里面有一个onStartUp函数,其中这个函数会在web项目启动的时候调用

web容器初始化讲解

我们来找寻

AbstractAnnotationConfigDispatcherServletInitializer

的继承关系然后找出web容器初始化的原理

当我们点进去它的父类之后,我们再进去它的父类观察

再父类里面我们发现有一个

registerDispatcherServlet

方法,这个方法就是将web容器放入ioc容器当中的方法,我们点进去观察

点进去这个方法之后,我们发现有一个名为

createServletApplicationContext();

的方法,我们再点进去观察

我们在这里发现,有一个

AnnotationConfigWebApplicationContext();

类,这个类再spring中是用于读取配置类和配置文件将类导入ioc容器中的类

紧接着我们发现,在这个类中,我们发现了一个

getServletConfigClasses();

这个方法。是不是很熟悉?

我们回到最开始的地方观察

在最开始的继承了上述所有类的子类中,是不是有一个这样的方法

将配置类通过反射装入数组,然后再父类的函数中调用数组将其放入了ioc容器

如果对象数组不为空就将其配置类放入ioc容器进行注册

里面还有servletmapping的代码,用于将地址映射的类也装入ioc容器中

SpringMvc接收数据

1.访问路径设置

Java代码展示

该代码中和新注释就是@ResquestMapping

该注释能够使得这个controller响应一个user的网页路径请求

并且写在该类下的所有方法的请求路径都是

/user/方法上的request路径

其余的原理都写在了注释里

package com.atguigu.requestmapping;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;@Controller
@RequestMapping("user")
public class UserController {//    handler->handlerMapping@RequestMapping("login")public String login() {return "login";}//    可以通过一个字符数组装入注册的地址,可以响应多个请求地址,method用于指定前端发送什么请求类型才会响应@RequestMapping(value = {"register","login"},method = RequestMethod.GET)public String register(){return "register";}//    模糊匹配,*表示前面如果是/user,则后面不管是/user/dasdasdasd /user/ds都能匹配 不过多层不可匹配/user/a/a这样就不能匹配
//    **表示前面如果是/user,则后面不管是/user/aa/aaaa/aaaa/,多少层都能够匹配
//    @GetMapping表示该方法以get方式接收请求实际源码只不过是多加了一个method 指明了请求方式罢了@GetMapping({"/user/*","/user/**"})public String modifyPassword(){return "modifyPassword";}}

2.接收参数

 @RequestMapping("data")@ResponseBody
//    形参列表,填写对应的名称参数即可! 请求参数名 = 形式参数名即可,这样会自动赋值public String data(String name,int age){System.out.println("name: "+name+"  age: "+age);return "name: "+name+"  age: "+age;}

通过指定requestMapping注释能够指定接收路径

通过ResponseBody能够指定该类直接返回给前端字符串进行接收

1.@Param注解

通过value指定传入参数时的key名字,就算是传入的key名字和参数名相同也会报错

required用于指定是否是必须被传入的参数,默认值是true代表必须传入,否则报错

 

2.一名多值

可以通过一个列表接收传入的多个值

但是注意,如果未使用requestParam那么就会报错

因为未使用requestParam就会代表着直接将一个字符串赋值给了一个列表报错

3.实体类接收参数

只需要将传入的参数名和实体类名保持一致即可

4.路径传参接收

要点:在路径标签中指定其路径的时候使用花括号将其括起来

然后再参数列表中声明一个与路径中花括号括起来的key值相同的名字即可

这样就可以获取到路径中的值,如下图结果所示

不过要注意,我们需要使用@PathVariable写在参数名前面,不然正常情况下默认规定其通过param方式获取数据

即便参数列表中参数名不相同依旧可以指定value的对应值与mapping注解中的key值传参

5.json数据接收

Java在没有导入对应的json转换依赖的时候是不能够获取到json数据的

我们导入一个json依赖

在配置类上方添加一个

@EnableWebMvc

注解就可以使得适配器转化json数据并发送给类进行接收

@EnableWebMvc解释

@EnableWebMvc注解效果等同于在 XML 配置中,可以使用 `<mvc:annotation-driven>` 元素!我们来解析`<mvc:annotation-driven>`对应的解析工作!

让我们来查看下`<mvc:annotation-driven>`具体的动作!

先查看标签最终对应解析的Java类

查看解析类中具体的动作即可

打开源码:org.springframework.web.servlet.config.MvcNamespaceHandler

打开源码:org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser

在对应的源码中,我们可以发现他将一个Adapter(经理)加入了ioc容器,并且在Adapter对象中加入了json字符串适配器能够解析json串

在源码中由于已经将Adapter和Handler加入了ioc容器,我们就不需要在手动生成这两对象假如ioc容器中,只需要添加一个注解即可

6.接收cookie数据

先来介绍一下cookie是什么

Cookie,即“小甜饼”的意思,在计算机领域中,特指一种由服务器发送到用户浏览器并保存在用户计算机(客户端)上的小型文本文件。它满足RFC6265标准,通常用于辨别用户身份、跟踪用户活动、保存用户设置等。以下是对Cookie的详细解释:

一、Cookie的定义

Cookie是一种技术,允许网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据。这些数据以“名/值”对(name-value pairs)的形式储存,通常经过了加密处理,因此一般用户看到的只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。

二、Cookie的作用

  1. 会话管理:Cookie最初也是最主要的作用就是用于会话管理。当用户登录一个网站时,服务器会生成一个包含会话ID的Cookie并发送给浏览器,浏览器将这个Cookie保存在本地。此后,每次用户发送请求时,浏览器都会自动将这个Cookie发送给服务器,服务器通过会话ID识别用户身份,从而保持用户的登录状态。
  2. 个性化设置:Cookie还可以用来保存用户的个性化设置,如主题、语言、字体大小等。这样,当用户再次访问网站时,网站可以根据Cookie中的信息为用户提供更加个性化的体验。
  3. 购物车功能:在电子商务网站中,Cookie经常被用来实现购物车功能。当用户将商品添加到购物车时,这些信息会被保存在Cookie中。这样,即使用户关闭了浏览器或换了一台电脑,只要Cookie还在,购物车中的商品信息就不会丢失。
  4. 跟踪用户行为:网站可以使用Cookie跟踪用户在网站上的行为,如访问了哪些页面、停留了多长时间、点击了哪些链接等。这有助于网站分析用户行为,优化网站设计和内容。
  5. 广告定向:除了网站自己设置的Cookie外,还有一些第三方Cookie,它们通常由广告商或数据分析公司设置。这些Cookie可以用来跟踪用户在多个网站上的行为,从而为用户提供更加精准的广告定向服务。

三、Cookie的类型

  1. 会话Cookie(Session Cookies):这种类型的Cookie在浏览器关闭后就会被删除,主要用于保存用户的会话信息。
  2. 持久Cookie(Persistent Cookies):与会话Cookie不同,持久Cookie会在用户的计算机上长期保存,直到其过期时间到达或被用户手动删除。这种类型的Cookie常用于保存用户的登录状态、个性化设置等信息。
  3. 安全Cookie(Secure Cookies):安全Cookie只能通过HTTPS协议传输,不能通过未加密的HTTP协议传输。这增加了Cookie在传输过程中的安全性。
  4. HttpOnly Cookie:HttpOnly是一个标志属性,用于防止JavaScript代码访问特定的Cookie。当设置了HttpOnly属性的Cookie被创建后,它将无法通过客户端脚本(如JavaScript)进行访问。这有助于减少跨站脚本攻击(XSS)的风险。

四、Cookie的安全性问题及防范措施

虽然Cookie在许多方面都非常有用,但它们也存在一些潜在的安全风险,如XSS攻击、CSRF攻击、Cookie劫持和隐私泄露等。为了防范这些风险,网站可以采取以下措施:

  1. 设置HttpOnly属性、对输出进行编码等,以防止XSS攻击。
  2. 使用Token验证、检查请求的来源等,以防止CSRF攻击。
  3. 使用HTTPS协议对Cookie进行加密传输、设置SameSite属性等,以防止Cookie劫持。
  4. 遵循最小必要原则收集和使用用户数据,并采取加密、匿名化等安全措施,以保护用户隐私。

综上所述,Cookie作为一种重要的客户端技术,在互联网应用中发挥着举足轻重的作用。然而,在使用Cookie的过程中,我们也需要注意其潜在的安全风险,并采取相应的措施进行防范和保护。

那么我们如何接收cookie数据呢

我们在Java类中编写如下一个类,在参数中通过cookievalue指定cookiename的请求的参数名字

我们先用save通过响应报文存储一个cookie数据

可以通过图片看到存储成功了

接着我们通过cookiename这个key值从cookie中取出对应的value值显示在屏幕上

7.接收请求头数据

通过RequestHeader标签写在参数上,就能够通过参数获取到对应请求头的中的key值为Host的数据

8.获取原生api对象

SpringMVC接收数据总结

SpringMVC响应数据(输出数据)

两种开发模式介绍

1.前后端不分离介绍

整体调用流程

1.浏览器通过向服务端发送请求进行一些数据交互和页面跳转请求

2.controller层接收后通过三层架构一步步发送到mapper层(Dao层)

3.dao层通过和数据库交互获取数据返回到controller进行数据封装处理

4.在前后端不分离项目中,controller会将数据放入共享域中,并且找到需要跳转的html页面

5.然后前端页面会从共享域中拿取数据,并且将模板页面发送给controller层

6.接着将controller层中返回到的html页面发送给浏览器

7.主要用于小型的管理系统的开发

开发流程

我们首先在webapp下面的web-inf的文件中声明一个.jsp文件这是一个网页

接着我们创建一个配置类,让他继承WebMvcConfigurer

继承这个类之后我们就可以将视图解析器装入ioc容器中了(该类还封装了很多mvc容器需要的类,视图解析器的作用是将.jsp文件进行解析)

我们在重写的方法中,通过registry将文件的index.jsp的文件进行前后缀注册,以便能够定位到视图的位置

接着我们创建一个jspcontroller能够将视图返回给前端

其注意要点图里面就有

其中setAttribute是将数据放入共享数据域的

观察jsp文件,在共享数据区域获取数据

这是返回的结果

转发与重定向实现

转发指的是访问项目内的文件,范围只能是项目内

重定向指可以是向内也可以是向外

其在springMVC中的实现如下

先观察一下资源文件的访问路径是/jsp/index

转发

在转发中,我们先指定转发的访问路径将其设置为forward

然后我们在方法内返回视图文件的访问路径即可,但是要注意

在访问路径前面需要加一个forward编译器才能判定他是在进行转发

否则会直接识别为这是资源文件的位置进行解析,就如开发流程那里所说的一眼

通过转发的方式我们也到达了forward的文件的位置

重定向

其注意要点如图所示

这是向内重定向

同样也有向外重定向

2.前后端分离模式

主要通过json和前端进行数据交互

前端都是调用的一个后端接口获取数据

一般用于大型商业部署项目开发,多端部署

返回json串

其原理如下图所示

核心的注解是一个@ResponeseBody

通过responesebody能够告知adapter我们即将返回的是一个json串

然后让adapater进行处理,将Java类对象转化为一个json串发送给前端

通过使用responseBody能够使得返回视图和转发重定向的语法全部生效

具体controller类的编写如下

通过controller添加到ioc容器

通过requestmapping指定访问路径

接着在需要返回json串的类/方法上添加@ResponseBody即可返回一个json串

也可以是返回一个list对象

这两个方法的返回结果如下图所示

RestController注解

可以观察源码,同时包含了controller和responsebody注解

能够使用这一个注解替代controller和responsebody注解

返回静态资源

我们现在文件目录下面放入一个静态图片资源

我们在平常的客户端请求文件的路径时是访问不到的

因为默认情况下当服务端接收请求之后,回去handlerMapping()中寻找有没有对应的handler请求路径

此时会发现没有对应的请求路径,那么就会发生错误

那么我们如何解决这种情况呢

在配置类中重写一个如红圈所示的接口就可以实现找到静态资源

那么其原理是什么呢

我们点进去接口里面进行观察,如红箭头所指的类是返回静态资源得以成功的方法

接着点进去那个添加Servlet进行观察

我们可以发现,他添加了一个handler对静态资源进行处理

那么这个handler是如何对静态资源进行处理的呢

在这个handler是这样处理的,假如我们没有找到路径,那么就会对图片资源的路径进行内部转发

通过转发去寻找请求地址所需要的资源

原理图

Servlet接收到一个请求,先去handlerMapping寻找有没有对应的controller类查找数据

发现没有,那么handlerMapping就会找DefaultServletHandler去转发图片的路径寻找资源

结果如下

RESTFul风格

一种基于http协议的规范编码风格

其请求路径的设计如下图所示

全局异常处理机制

什么是声明式异常和编程式异常?

编程式:在代码内部有详细的异常捕捉

声明式:在外部使用一个配置文件对需要进行异常捕获的文件进行包裹,有异常时就会调用外部异常处理代码进行处理

全局异常处理注释

所有需要的异常都在图中写清楚了

详解再图片下方写

@ControllerAdvice和@RestControllerAdvice解析

ControllerAdvice:标识这是一个全局异常处理类,当全局异常发生时就会寻找该类进行处理,可以返回逻辑视图和转发重定向

RestControllerAdvice:点进去后其实可以发现源代码里面有controlleradvice和responsebody注解在里面

responseBody是告知这个类会返回一个json字符串

@ExceptionHandler

异常处理的类,在其后面的括号内的参数是用于指定该方法处理什么类型的异常

拦截器

类似于javaweb中的Filter(过滤器)

对一些特殊的请求进行拦截处理

拦截器 Springmvc VS 过滤器 javaWeb:

- 相似点
    - 拦截:必须先把请求拦住,才能执行后续操作
    - 过滤:拦截器或过滤器存在的意义就是对请求进行统一处理
    - 放行:对请求执行了必要操作后,放请求过去,让它访问原本想要访问的资源
- 不同点
    - 工作平台不同
        - 过滤器工作在 Servlet 容器中
        - 拦截器工作在 SpringMVC 的基础上
    - 拦截的范围
        - 过滤器:能够拦截到的最大范围是整个 Web 应用
        - 拦截器:能够拦截到的最大范围是整个 SpringMVC 负责的请求
    - IOC 容器支持
        - 过滤器:想得到 IOC 容器需要调用专门的工具方法,是间接的
        - 拦截器:它自己就在 IOC 容器中,所以可以直接从 IOC 容器中装配组件,也就是可以直接得到 IOC 容器的支持

其作用范围如图所示

因为使用了springmvc框架,那么在程序内部是只有一个DispatcherServlet进行请求处理的

假如使用filter的话,只能在Servlet外部即整个springMVC框架外部进行拦截处理,一刀切,并不能在里面的各种资源调用的内部进一些业务逻辑的处理

那么使用拦截器就可以解决这一问题

拦截器作用的位置

拦截器如何使用

首先在配置类中注册一下拦截器(注意,图中的这种注册方式是拦截全部请求的,至于具体到方法的后续会讲解到)

拦截器类的书写,我们需要继承一个HanlerInterceptor类

其需要重写如下三个方法

preHandle

postHandle

afterCompletion

preHandle方法

其参数和注意事项如下

其中handler就是我们进行拦截的目标方法

preHandler是在目标方法执行前执行的代码

postHandle方法

其参数和主义的事项如下

其中modelAndView返回的是一个视图或者共享域对象

不需要时为空

afterCompletion方法

在前面两个方法执行完毕后调用

其中ex参数是当目标方法发生异常时传入,并进行输出

拦截器的指定拦截

链式调用

在将拦截器类进行注册后添加一个addpathPatterns就可以进行拦截

排除拦截

在前一个大的路径内,指定一个在大路径内的小路径就可以进行小路径的拦截

拦截的顺序

根据注册的先后进行拦截,其源码其实是所有的拦截类放入一个数组

然后prehandler是正序遍历数组进行方法调用,所以先进入的类会先执行

接着post和after方法是逆序遍历,也就是说,先进入的类后遍历

源码

通过mapping(秘书)对对应的拦截方法进行获取

观察下面的代码,下方红箭头所指通过handler获取拦截方法执行的目标方法

在红箭头的上方,有一个拦截方法,他会判断前置prehadler的返回结果,假如是一个false那么就进入方法执行return代表着剩下的目标方法的逻辑不执行,实现了拦截

参数校验

可以通过给实体类的变量上添加注解,不符合对应的要求的就会报错

在对应的实体类中添加对应的注解

接着我们需要在对应的接收前端数据的controller层接收对应实体类参数的方法中打的参数上添加

@Validdated注解!!!

如果不添加那自动校验就不会生效

以字符串不能为空举例当字符串为空时,会将报错信息默认的返回

但是我们发现这种方法前端不容易读懂,所以我们需要自定义的定义报错信息的返回

我们需要定义一个BindingResult类进行错误的接收

注意,该类一定要在参数列表中紧挨着需要校验的实体类

接着我们通过hasErrors判断是否报错

如果报错,我们定义一个集合将错误参数放入并返回

总结

调用流程,很关键

相关文章:

ssm-springmvc-学习笔记

简介 简单的来说&#xff0c;就是一个在表述层负责和前端数据进行交互的框架 帮我们简化了许多从前端获取数据的步骤 springmvc基本流程 用户在原本的没有框架的时候请求会直接调用到controller这个类&#xff0c;但是其步骤非常繁琐 所以我们就使用springmvc进行简化 当用…...

nVisual 登录页页面配置说明

一、概述 nVisual登录页面可根据具体客户需要通过public\config\access.js文件进行自定义配置。页面可以大致分为4个部分&#xff0c;头部、底部、可移动区域以及页面中间的信息填写区域。其中头部和底部又包含头部左侧、头部中间、头部右侧、底部左侧、底部中间、底部右侧六个…...

Qt6开发自签名证书的https代理服务器

目标&#xff1a;制作一个具备类似Fiddler、Burpsuit、Wireshark的https协议代理抓包功能&#xff0c;但是集成到自己的app内&#xff0c;这样无需修改系统代理设置&#xff0c;使用QWebengineview通过自建的代理服务器&#xff0c;即可实现https包的实时监测、注入等自定义功能…...

crapy 爬虫框架的使用

1.scrapy框架安装 安装前先安装python3和pycharm 社区版 执行命令安装scrapy&#xff0c; pip install scrapy 2.创建项目 执行命令&#xff1a; scrapy startproject test_spider 如图&#xff1a; 3.使用pycharm大开项目并设置pipenv虚拟机环境 虚拟环境是为了依赖隔…...

Edge SCDN 边缘安全加速有什么用?

Edge SCDN是最新推出的边缘安全加速服务&#xff0c;它是一种融合了安全防护和内容分发加速功能的网络服务技术&#xff0c;通过在网络边缘部署服务器节点&#xff0c;来优化内容的传输和用户的访问体验&#xff0c;同时保障网络安全。 抵御 DDoS 攻击&#xff1a; Edge SCDN …...

使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件

使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件 使用aarch64-unknown-linux-musl编译生成静态ARM64可执行文件1. 安装aarch64-unknown-linux-musl目标2. 安装交叉编译工具链安装musl-cross-make 3. 配置Rust编译器使用交叉编译工具链4. 编译你的Rust项目5. 运行或…...

u-boot移植、配置、编译学习笔记【刚开始就中止了】

教程视频地址 https://www.bilibili.com/video/BV1L24y187cK 【这个视频中途停更了…原因是实际中需要去改u-boot的情况比较少】 使用的u-boot的源码 视频中使用的是 u-boot-2017.03 学习到这里&#xff0c;暂停u-boot的移植、配置、编译学习&#xff0c;原因是经过与老师…...

torchaudio.load 段错误

使用 torchaudio.load 时出现崩溃&#xff0c;如图 解决&#xff1a; 安装 ffmpeg ​conda install ffmpeg -c conda-forge 尝试但没解决问题的方法包括 重装 cuda&#xff0c;重装 pytorch&#xff0c;安装 PySoundFile、SoundFile、sox。...

自定义函数库

求两点距离 double dis(double x1, double y1, double x2, double y2){return sqrt(pow(x2-x1, 2)pow(y2-y1, 2)); }判断闰年 bool isLeapYear(int year){return year%40 && year%100!0 || year%4000; }判断素数 bool isPrime(int num){if(num<2) return false;f…...

Tomcat的下载和使用,配置控制台输出中文日志

目录 1. 简介2. 下载3. 使用3.1 文件夹展示3.1.1 控制台输出乱码 3.2 访问localhost:80803.3 访问静态资源 4. 总结 1. 简介 Tomcat&#xff0c;全称为Apache Tomcat&#xff0c;是一个开源的Web应用服务器和Servlet容器&#xff0c;由Apache软件基金会的Jakarta项目开发。它实…...

STM32应用开发——BH1750光照传感器详解

STM32应用开发——BH1750光照传感器详解 目录 STM32应用开发——BH1750光照传感器详解前言1 硬件介绍1.1 BH1750简介1.2 硬件接线 2 软件编程2.1 软件原理2.1.1 IIC设备地址2.1.2 IIC读写2.1.3 BH1750指令集2.1.4 BH1750工作流程2.1.5 BH1750测量模式 2.2 测试代码2.3 运行测试…...

java jar包加密 jar-protect

介绍 java 本身是开放性极强的语言,代码也容易被反编译,没有语言层面的一些常规保护机制,jar包很容易被反编译和破解。 受classfinal&#xff08;已停止维护&#xff09;设计启发,针对springboot日常项目开发,重新编写安全可靠的jar包加壳加密技术,用于保护软件版权。 使用说…...

NMEA/观测文件/导航电文

NMEA-0183 NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式。它包含了定位时间&#xff0c;纬度&#xff0c;经度&#xff0c;高度&#xff0c;定位所用的卫星数&#xff0c;DOP&#xff0c;差分状态和校正时段等很多信息。 参考&#xff1a;GPS NMEA数据包解析…...

HTTPS的工作原理深入解析

在当今互联网时代&#xff0c;网络安全已经成为了一个备受关注的话题。随着越来越多的个人隐私和商业数据被传输在网络中&#xff0c;如何确保这些数据在传输过程中的安全性成为了每个网络开发者和用户关注的核心问题之一。而HTTPS&#xff08;HyperText Transfer Protocol Sec…...

pandas.core.frame.DataFrame怎么进行对象内容的读写

在 Python 中&#xff0c;pandas.core.frame.DataFrame 是 Pandas 数据库的核心数据结构&#xff0c;可以方便地读取和操作表格数据。以下是几种常见的读取内容的方法&#xff1a; 读取特定列 通过列名获取数据。 # 假设 df 是一个 DataFrame data df["列名"] # …...

OFCA-OpenHarmony人才认证题库答案

单选题 1.[单选题] 位于后台的应用&#xff0c;启动组件需校验的权限是: A: ohos.permission.DISTRIBUTED_DATASYNC B: ohos.permission.START_ABILITIES_FROM_BACKGROUND C: ohos.permission.ABILITY_BACKGROUND_COMMUNICATION D: ohos.permission.START_INVISIBLE_ABIL…...

若依微服务如何获取用户登录信息

文章目录 1、需求提出2、应用场景3、解决思路4、注意事项5、完整代码第一步&#xff1a;后端获取当前用户信息第二步&#xff1a;前端获取当前用户信息 6、运行结果后端测试&#xff1a;前端展示&#xff1a; 总结 1、需求提出 在微服务架构中&#xff0c;获取当前用户的登录信…...

题目 2778: 判断数正负

题目 2778: 判断数正负 时间限制: 2s 内存限制: 192MB 提交: 12161 解决: 6681 题目描述 给定一个整数N&#xff0c;判断其正负。 输入格式 一个整数N(-109 < N < 109) 输出格式 如果N > 0, 输出positive&#xff1b; 如果N 0, 输出zero&#xff1b; 如果N < 0, 输…...

【Hexo】博客自动生成AI摘要

工具介绍 如何让博客支持AI摘要&#xff0c;使用TianliGPT自动生成文章的AI摘要 摘要AI-文章摘要生成工具 文章摘要是一个专业的文字摘要生成工具&#xff0c;你可以将需要提取摘要的文本内容发送给TianliGPT&#xff0c;稍等一会他就可以给你发送一个基于这段文本内容的摘要。…...

vue3-count-to实现数字动态增长效果

vue3-count-to 是一个用于 Vue 3的数字计数动画库&#xff0c;常用于在页面上实现数字的动态增长效果&#xff0c;类似于从某个起始值渐变到目标值的效果。它可以用来显示各种数字、统计数据或展示动画效果。 1 安装 vue3-count-to 首先&#xff0c;你需要安装 vue3-count-to …...

第一课【输入输出】(题解)

1.向世界问好 题目描述 编程输出以下内容: Hello World! Im a C program. 输入格式 本题无输入。 输出格式 请按照样例输出&#xff0c;注意大小写、空格、感叹号&#xff0c;句号&#xff0c;单引号都必须使用英文输入法里的符号。 样例输入/输出 输入数据 1 本题无…...

边缘AI和智能音频专家XMOS全球首家增值经销商(VAR)落地中国

强强合作——XMOS与飞腾云达成全球首家增值经销协议以用智能音频技术和产品服务全球厂商和消费者 中国深圳&#xff0c;2024年12月——全球领先的软件定义系统级芯片&#xff08;SoC&#xff09;开发商XMOS宣布&#xff1a;公司已与飞腾云科技达成增值分销协议&#xff0c;授权…...

实战 | 某院校小程序记录

视频教程在我主页简介里 目录&#xff1a; 前言&#xff1a; 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#xff0c;奇葩弱口令离…...

正则表达式——参考视频B站《奇乐编程学院》

智能指针 一、背景&#x1f388;1.1. 模式匹配&#x1f388;1.2. 文本替换&#x1f388;1.3. 数据验证&#x1f388;1.4. 信息提取&#x1f388;1.5. 拆分字符串&#x1f388;1.6. 高级搜索功能 二、原料2.1 参考视频2.2 验证网址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…...

【Vue + Print.js】前端打印, 自定义字体大小, 自定义样式, 封装共享样式

在前端开发中&#xff0c;打印功能是一个常见的需求&#xff0c;尤其是在生成报表、打印用户资料或者导出文档时&#xff0c;通常需要通过前端代码进行打印。Print.js 是一个非常流行的 JavaScript 库&#xff0c;它提供了简单而强大的打印功能&#xff0c;允许你灵活控制打印内…...

python模拟练习第一期

问题一 如果一个数 p 是个质数&#xff0c;同时又是整数 a的约数&#xff0c;则 p 称为 a的一个质因数。 请问 2024 有多少个质因数&#xff1f; 步骤 1: 分解 2024 首先&#xff0c;2024 是偶数&#xff0c;说明可以被 2 整除。我们从 2 开始进行除法分解&#xff1a; 202…...

Java-25 深入浅出 Spring - 实现简易Ioc-01 Servlet介绍 基本代码编写

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…...

华硕奥创软件在线安装和离线安装方法

华硕奥创软件在线安装和离线安装方法 1. 华硕奥创软件介绍2. 华硕奥创软件在线安装2.1 第一种2.2 第二种 3. 华硕奥创软件离线安装3.1 概述3.2 华硕奥创软件离线包下载方式 4. 卸载华硕奥创软件4.1 概述4.2 华硕奥创卸载软件下载与使用方式 结束语 1. 华硕奥创软件介绍 华硕奥…...

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展&#xff0c;AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统&#xff0c;AI技术赋予监控系统实时分析、智能识别和精准预警的能力&#xff0c;让“被动监视”转变为“主动防控”。 二、AI监控应用…...

SQL Server数据库还原差异备份

适用范围&#xff1a;SQL Server 本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中还原差异数据库备份。 限制和局限 不允许在显式或隐式事务中使用 RESTORE。 无法在早期版本的 SQL Server 中还原较新版本的 SQL Server创建的备份。 在…...

Python 给 Excel 写入数据的四种方法

Python 在数据处理领域应用广泛&#xff0c;其中与 Excel 文件的交互是常见需求之一。 本文将介绍四种使用 Python 给 Excel 文件写入数据的方法&#xff0c;并结合生活中的例子进行解释&#xff0c;帮助新手小白快速上手。 1. 使用 openpyxl 库 openpyxl 是一个用于读写 Exc…...

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…...

【电子通识】电流倒灌为什么需要注意?

电流倒灌是一个很常见的问题,以“IO电流倒灌”为关键词在百度上进行搜索,可以找到很多相关案例。 电流倒灌问题在5V电平的单片机时代几乎不会发生,主要是因为5V单片的IO耐压值高,单片机内部结构对IO保护设计很好。 到了3.3V单片机时代,这类问题有一定的偶发性,但…...

Elasticsearch 集群部署

Elasticsearch 是一个分布式的搜索和分析引擎&#xff0c;广泛应用于日志分析、全文搜索、实时数据分析等场景。它以其高性能、高可用性和易用性而著称。本文档将引导您完成一个基本的 Elasticsearch 集群配置&#xff0c;包括节点间的通信、客户端访问、安全设置等关键步骤。我…...

Windows系统VSCode 搭建ESP-IDF环境

VS Code&#xff0c;安装ESP-IDF插件 快捷键CTRLSHIFTP&#xff0c;弹出显示所有命令的窗口&#xff0c;选择ESP-IDF的欢迎 使用第一个选项&#xff0c;要选择一个ESP-IDF版本&#xff0c;选最新的就行 点击Install,等待下载 提示安装成功&#xff0c;如果过程中出现python已存…...

在centos 7.9上面安装mingw交叉编译工具

1.说明 为了在centos上面编译windows的程序&#xff0c;需要安装mingw工具&#xff0c;mingw工具是可以编译windows程序的一些工具链&#xff0c;使用方式和linux一致 2.下载脚本 使用脚本方式编译&#xff0c;github的脚本位置&#xff1a;https://github.com/Zeranoe/ming…...

【Java笔记】LinkedList 底层结构

一、LinkedList 的全面说明 LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复)&#xff0c;包括null线程不安全&#xff0c;没有实现同步 二、LinkedList 的底层操作机制 三、LinkedList的增删改查案例 public class LinkedListCRUD { public stati…...

【深入理解java中的设计模式】

深入理解java中的设计模式 设计模式是软件工程中的最佳实践&#xff0c;它们提供了解决特定问题的模板或蓝图。在Java中&#xff0c;设计模式通常被分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。 创建型模式 单例模式 (Singleton Pattern) 描述: 保证一个类…...

详解下c语言下的多维数组和指针数组

在实际c语言编程中&#xff0c;三维及以上数组我们使用的很少&#xff0c;二维数组我们使用得较多。说到数组&#xff0c;又不得关联到指针&#xff0c;因为他们两者的联系太紧密了。今天我们就详细介绍下c语言下的多维数组(主要是介绍二维数组)和指针。 一、二维数组 1.1&am…...

如何使用 Python 发送 HTTP 请求?

在Python中发送HTTP请求最常用的库是requests&#xff0c;它提供了简单易用的API来发送各种类型的HTTP请求。 除此之外&#xff0c;还有标准库中的http.client&#xff08;以前叫做httplib&#xff09;和urllib&#xff0c;但它们相对更底层&#xff0c;代码量较大&#xff0c…...

活动预告 |【Part2】Microsoft Azure 在线技术公开课:基础知识

课程介绍 参加“Azure 在线技术公开课&#xff1a;基础知识”活动&#xff0c;培养有助于创造新的技术可能性的技能并探索基础云概念。参加我们举办的本次免费培训活动&#xff0c;扩充自身的云模型和云服务类型知识。你还可以查看以计算、网络和存储为核心的 Azure 服务。 课…...

神经网络基础-激活函数

文章目录 1. 什么是激活函数2. sigmoid 激活函数3. tanh 激活函数4. ReLU 激活函数5. SoftMax 激活函数6. 其他常见的激活函数7. 激活函数的选择方法 1. 什么是激活函数 激活函数用于对每层的输出数据进行变换, 进而为整个网络注入了非线性因素。此时, 神经网络就可以拟合各种…...

Debedium如何忽略Oracle的purge命令

报错 截至目前3.0版本&#xff0c;Debezium的Oracle Connector并不支持purge table这个指令。 所以&#xff0c;在使用Debezium解析Oracle变更的时候&#xff0c;如果在源端执行了类似 purge table "$BIN… 的语句&#xff0c;就会导致Debezium罢工&#xff0c;日志里显…...

基于 webRTC Vue 的局域网 文件传输工具

文件传输工具&#xff0c;匿名加密&#xff0c;只需访问网页&#xff0c;即可连接到其他设备&#xff0c;基于 webRTC 和 Vue.js coturn TURN 服务器 docker pull coturn/coturn docker run -d --networkhost \-v $(pwd)/my.conf:/etc/coturn/turnserver.conf \coturn/coturn…...

opencv Canny边缘检测

canny阈值越高,检测到的边缘数量越少 # 导入OpenCV库&#xff0c;用于图像处理 import cv2 import numpy as np # 从matplotlib库中导入pyplot模块&#xff0c;用于绘制图像 from matplotlib import pyplot as plt # 创建一个名为window的窗口&#xff0c;窗口大小自…...

数仓高频面试 | 数仓为什么要分层

大家好&#xff0c;我是大D呀。 关于数仓分层&#xff0c;在面试过程中几乎是必问的。不过&#xff0c;面试官一般也不会直接考你数仓为什么要分层&#xff0c;而是在你介绍项目时&#xff0c;可能会换一种形式来穿插着问&#xff0c;比如数据链路为什么要这样设计&#xff0c…...

Coconut:探索大语言模型的连续思维链推理能力

目录 简介&#xff1a; 什么是Coconut&#xff1f; 为什么我们需要Coconut&#xff1f; Coconut如何工作&#xff1f; 实验结果怎么样&#xff1f; Coconut的优势&#xff1a; 结论&#xff1a; 简介&#xff1a; 你有没有想过&#xff0c;计算机是如何像人类一样思考问…...

2024年安徽省职业院校技能大赛水利工程BIM建模与应用

2024年安徽省职业院校技能大赛 赛 项 规 程 赛项名称&#xff1a; 水利工程BIM建模与应用 赛项组别&#xff1a; 高职组 承办单位&#xff1a; 安徽水利水电职业技术学院 目录 一、赛项名称… 1 二、竞赛目标… 1 三、竞赛内容… 2 四、竞赛方式… 3 五、竞赛流程… 4 七、技术…...

vue常用命令汇总

nvm 一个nodejs版本管理工具&#xff0c;解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 npm 可以管理 nodejs 的第三方插件。 vue-cli 是Vue提供的一个官方cli,专门为单页面应用快速搭建繁杂的脚手架。 nginx 是一个高性能的HTTP和反向代理we…...

ios上架构建版本没苹果电脑怎么上传

在app store上架的时候&#xff0c;遇到下图的问题&#xff1a; 点击蓝色加号的时候&#xff0c;并没有构建版本可以选择 从图中可以看出&#xff0c;它给我们推荐了很多上传工具&#xff0c;比如xcode、transporter或命令行工具之类的&#xff0c;但是这些工具都是只能在苹果…...