阶段七-Day01-SpringMVC
一、Sping MVC的介绍
1. 使用Front(前端)设计模式改写代码
1.1 目前我们的写法
目前我们所写的项目,持久层、业务层的类都放入到Spring容器之中了。他们之间需要注入非常方便,只需要通过@Autowired注解即可。
但是由于Servlet整个生命周期都是被Tomcat进行管理的,一个功能对应一个Servlet并且无法把Servlet放入到Spring容器中。所以每次编写Servlet时都需要编写init方法先获取到Spring容器,然后从Spring容器中取出需要使用的Bean。
1.2 使用Front设计模式的写法
Front(前端)设计模式就是有一个前端(不是前端专业那个前端,是最前面的意思)统一入口,在统一入口根据请求url调用自己的编写的普通方法。
通过一个Servlet进行分发,把每个功能分发到每个单独的普通类的普通方法
1.3 使用Front设计模式优点
这样带来的好处是:
只需要在一个Servlet中编写获取容器Bean的代码,减少了代码冗余。
不需要为每个控制器都创建一个类,而是可以在一个普通Java类中提供普通实例方法代表以前servlet中的service方法。
因为可以自己编写普通Java类,这类可以放入到Spring容器中,注入Service更方便。
同时因为是自己编写的Java,所以可以进行一些封装,对其他操作进行简化。(代码中没有体现)
2. Spring MVC介绍
Spring MVC 虽然在平时认为是一个独立的框架。但其本质为Spring 框架的一个扩展,在Spring官方ZIP包就是一个spring-webmvc.jar的jar包。
Spring MVC在Spring官方的Projects的顶级项目中并没有,可以认为Spring MVC属于Spring Framework的二级子项目。
Spring MVC是基于Front设计模式,总体效果和上面我们自己写的Front结果类似,但Spring MVC作为一个框架,肯定要比我们写的代码复杂很多,功能也强大很多。
Spring MVC中已经帮助编写了前端入口的DispatcherServlet,里面编写了请求分发功能,但是并没有提供@WebServlet
注解,需要我们在web.xml手动编写<servlet>
配置。
EmpController在Spring MVC称为控制器类(Handler),里面的方法称为:控制单元(HandlerMethod)
M:模型层:包含数据校验
V:视图层: 国际化,标签库
C:控制层: 转发重定向,参数,拦截器,作用域等
3. Spring中的父子容器问题
因为Spring MVC属于Spring的子框架,所以Spring MVC中可以使用Spring框架的全部内容。
Spring 官方为Spring MVC专门定义了一个容器,这个容器里面放Spring MVC中全部Bean,且这个容器属于Spring容器的子容器。
有这样的一个规定:Spring MVC子容器可以调用Spring 父容器的全部内容。但是Spring父容器不能调用Spring MVC子容器内容。
二、Spring MVC环境搭建
1. 创建项目并添加依赖
Spring MVC 在平时随意可以当成一个独立框架看待,但其本质只是Spring Framework中的spring-webmvc.jar文件,这个jar文件依赖了spring web模块和Spring框架核心功能的5个依赖。所以在只使用Spring MVC框架时需要导入spring-webmvc依赖即可。
<dependencies><!-- 依赖了Spring框架核心功能的5个依赖以及Spring整合Web的依赖spring-web --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.16</version></dependency></dependencies>
2. 创建Spring MVC配置文件
与Spring配置文件同理,这个文件的名称是随意的,只要和web.xml中配置对应上就可以。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- springmvc容器配置文件 --><!-- 目的: 扫描@Component注解,将控制器交给springmvc容器--><context:component-scan base-package="com.sh.controller"/><!-- 让Spring MVC的注解生效 --><mvc:annotation-driven></mvc:annotation-driven><!-- 注释驱动 -->
</beans>
3. 编写web.xml内容
因为SpringMVC源码中并没有@WebServlet的注解,所以需要手动配置,在web.xml中配置
web.xml的配置是为了让前端控制器DispatcherServlet生效。并且加载Spring MVC的配置文件。
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!-- 配置前端控制器 (DispatcherServlet)--><servlet><servlet-name>ds</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 为了创建springmvc容器 需要配置springmvc的配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- tomcat启动之后创建servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>ds</servlet-name><url-pattern>/query</url-pattern></servlet-mapping></web-app>
1. 由于配置了 <load-on-startup>1</load-on-startup>Tomcat启动时就会创建DispatcherServlet对象 2. DispatcherServlet对象创建后执行初始化方法servletConfig对象读取servlet的初始化参数(init-param)创建SpringMVC容器.(设置spring容器为父容器,父容器就是一个属性,是逻辑上的父子关系,不是继承关系)springMVC配置文件中配置了扫描包的注解的路径<context:component-scan base-package="com.sh.controller"/>通过注解,可以将控制器类交给SpringMVC容器管理 3. 只要获取到了SpringMVC容器就可以获取SpringMVC容器中的控制器类对象 4.DispatcherServlet映射路径为/ ,表示除了.jsp文件,其他全部匹配 5.客户端发起请求,协议://ip:port/query访问资源query与DispatcherServlet 中配置的映射路径(/)可以匹配,通过控制器类找到控制单元,可以根据请求资源和控制 单元的注解值找到对应的控制单元,执行控制单元,处理请求
4. 创建控制器类
Spring MVC自定义控制器类都是以Controller结尾。
这些类都是放在controller的包中。
控制单元方法的访问权限修饰符没有强制要求,但是多写成public的。
控制单元的方法名没有要求,只要满足Java方法名定义要求就可以。
@Controller
public class EmpController {/* 控制单元 *///请求映射 (控制单元映射的路径,根据该路径可以找到该控制单元)@RequestMapping("/query")public String query(){System.out.println("query");/** 最底层默认请求转发,即使不指定返回值,默认也会使用转发* */return "index.jsp";}
}
三、@RequestMapping注解
@RequestMapping注解可以写在控制器类上,也可以写在控制单元方法上。
如果写在类上,表示当前类所有控制单元的映射路径,都以指定路径开头。
如果写在方法上,表示当前方法的映射路径。最终访问这个控制单元的映射路径为:类上@RequestMapping映射路径+方法上@RequestMapping映射路径。
这种在类上写@RequetMapping的写法,在以后做管理类型项目、或网站后台项目中使用的比较多。平时在练习的时候绝大多数是直接在控制单元上写@RequestMapping注解,而不在类上写@RequestMapping。
package com.sh.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/*
* @RequestMapping : 可以使用在控制类上,也可以用在控制单元上
* 1. 用在控制类上, 访问控制单元方法时,必须加上控制器类上@RequestMapping中的注解值
* 2. 用在控制单元方法上, 当前控制单元映射的请求路径
* @RequestMapping注解也映射路径时,可以省略/,例如/emp与emp
*
* @RequestMapping注解中的属性:
* 1.path : 映射的路径
* 映射一个访问路径: path = {"aa"} 可以省略{}
* 映射多个访问路径: path = {"aa","bb"}
* 2.value:和path作用相同,只有一个value属性时,value可以省略
* 3.name:添加描述信息
* 4.method:只允许使用该种请求方式才能访问* RequestMethod.POST* RequestMethod.GET* ...** 简化:* @GetMapping -》 @RequestMapping(method = RequestMethod.GET)* @PostMapping -》@RequestMapping(method = RequestMethod.POST)** 5.params: 指定子请求中必须携带的请求参数* 6.headers: 指定请求中必须携带的请求头** * */
@Controller
@RequestMapping("emp")
public class EmpController {/* 控制单元 *///请求映射 (控制单元映射的路径,根据该路径可以找到该控制单元)@RequestMapping("query")public String query(){System.out.println("query");/** 最底层默认请求转发,即使不指定返回值,默认也会使用转发* */return "/index.jsp";}@RequestMapping(path = "aa")public String aa(){System.out.println("aa");return "/index.jsp";}@RequestMapping(path = {"bb","cc"})public String bb(){System.out.println("bc");return "/index.jsp";}@RequestMapping(path = "dd",name = "bc")public String dd(){System.out.println("bc");return "/index.jsp";}//只允许get请求访问@RequestMapping(path = "ee" ,method = RequestMethod.GET)public String ee(){System.out.println("bc");return "/index.jsp";}@RequestMapping(path = "ff",params = "name")public String ff(){System.out.println("bc");return "/index.jsp";}@RequestMapping(value = "hhh", produces = "text/plain;charset=utf-8")@ResponseBody//@ResponseBody注解与produces属性一般会一起使用,设置响应的编码与类型public String hh(){System.out.println("hh() 执行了");return "aaa你好";}
}
produces只有在使用@ResonseBody注解中才生效。
四、映射路径
1. 映射路径介绍
映射路径在之前Java EE阶段中学习过,就是web.xml中<url-pattern>
的值或者@WebServlet("")注解的值。
映射路径无论是在Servlet中还是在Spring MVC中,都表示:当URL中出现指定路径时会执行Servlet的方法或执行Spring MVC的控制单元。
2. 多级路径
映射路径:既然名字中已经叫做路径了,所以写法上也支持路径的写法。
@RequestMapping("/test/test2")
public String test2(){return "first.jsp";
}
3. 多级路径中注意事项
3.1 多层路径中最优写法
只需要在返回值中使用绝对路径就可以减少出错的情况。
跳转时 / 表示项目根目录,也就是webapp目录的根目录。
4. Ant风格的映射路径
在Spring MVC中支持Ant风格的映射路径写法。所谓的Ant风格就是支持三种特殊的符号。
符号 | 解释 |
---|---|
? | 匹配任意单字符 |
* | 匹配0或者任意数量的字符 |
** | 匹配0或者更多数量的目录 |
解释说明:
使用Ant的特殊符号时,表示模糊匹配。可能出现客户端发送过来的URL能匹配上多个映射路径,这时的优先级为:
固定值 (bjsxt1) > ?形式(bjsxt?) > 一个*
号(/*
) > (/**)
形式
// 优先级最高
@RequestMapping("/sh1")
public String testAnt1(){System.out.println("sh");return "/first.jsp";
}
// 优先级低于sh1。sh开头,后面跟个任意内容符号
@RequestMapping("/sh?")
public String testAnt2(){System.out.println("sh");return "/first.jsp";
}
// 优先级低于?。一层路径,任意内容
@RequestMapping("/*")
public String testAnt3(){System.out.println("11111");return "/first.jsp";
}
// 优先级低于*。任意层路径
@RequestMapping("/**")
public String testAnt4(){System.out.println("22222");return "/first.jsp";
}
五、Spring MVC 中的转发和重定向
1. 转发和重定向复习
在前面Java EE阶段中学习过两个概念:转发和重定向。这两个概念都是出现在资源之间相互跳转的。
两者区别:
(1)转发为一次请求,tomcat内部跳转。重定向为多次请求,不是tomcat内部跳转。
(2)转发是一次请求,无论服务器内部转发多少次,请求对象都不变。所以转发可以共享请求域的值。同时对于客户端浏览器URL是不变的。
重定向后需要客户端重新发起请求,和重定向之前不是一个请求。所以重定向后不能获取到之前设置在请求域的值。同时客户端浏览器URL是改变的。
(3)转发只能跳转到当前项目内部资源。重定向可以跳转到外部资源。例如:从自己的项目中跳转到百度应该使用重定向。
(4)转发时资源路径如果是绝对路径,第一个 / 表示当前项目根目录。
重定向时资源路径时绝对路径,第一个 / 表示 Tomcat 的 webapps目录,即:当前项目的上层目录。
转发的代码实现:
request.getRequestDispatcher("/first.jsp").forward(request,response);
重定向的代码实现:
response.sendRedirect("/sh/first.jsp");
2. Spring MVC中的转发和重定向
在Spring MVC框架中,默认情况下都使用转发进行寻找资源。
package com.sh.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("dept")
public class DeptController {@RequestMapping("query")public String query(){System.out.println("query");return "forward:del";//相当于return "del";//默认底层就是请求转发}@RequestMapping("del")public String del(){System.out.println("del");return "forward:/index.jsp";}//请求重定向只能手动设置@RequestMapping("aa")public String aa(){System.out.println("aa");return "redirect:/index.jsp";}}
3. Spring MVC转发和重定向时绝对路径
在Spring MVC中无论是转发还是重定向,使用绝对路径时/都表示项目根目录。
这种设计对于开发者来说更加友好,不用在区分到底是转发,还是重定向了。
六、WEB-INF目录资源
1. WEB-INF目录资源介绍
在平时学习过程中,我们多会把JSP文件放入到webapp目录中,或在webapp下新建一个目录把页面资源放入到目录中,这种情况JSP都是可以通过浏览器直接访问的。
但是在一些特定的项目中,从安全性等方面考虑不希望客户端通过浏览器直接访问对应的资源。
这时就可以把资源放入到WEB-INF目录中。因为在Java Web项目中规定:WEB-INF中资源是不允许被客户端直接访问,需要先访问控制器,通过控制器的转发来访问这些资源。
在浏览器地址栏访问suiyi.jsp是无法访问到的。
需要提供一个控制单元方法,转发到JSP页面中。
2. 具体示例
3. 结果分析
如果项目中所有的JSP、CSS、JavaScript、图片都放入到WEB-INF中,那所有的资源都必须先执行控制器。这样对于刚学习这种写法的人可能觉得实现起来更加复杂了。但是从项目角度上却是更加安全了,也可以在控制器方法中加入自己想要加入的逻辑。
七、视图解析器
1. 视图解析器和视图
Spring MVC的控制单元 支持 ModelAndView、String 等多种类型的返回值,但无论控单元的返回值是哪种类型,Spring MVC 内部最终都会将它们封装成一个 ModelAndView 对象,它由 model(模型数据)和 view(逻辑视图名)两部分组成,所以 Spring MVC 需要借助 ViewResolver(视图解析器)将 逻辑视图名解析为真正的 View 视图对象,然后才能响应给客户端展示。
Spring MVC 的核心理念是将 视图与 数据模型进行解耦,视图技术随场景选择:Thymeleaf、JSP、FreeMarker、Excel 等等。
Spring MVC 定义了ViewResolver
和View
接口:
-
ViewResolver
视图解析器视图解析器用来解析逻辑视图,将其解析成真正的视图对象。
SpringMVC 提供了一个视图解析器的接口 ViewResolver,所有具体的视图解析器必须实现该接口。
AbstractCachingViewResolver:抽象类,这种视图解析器会把它曾经解析过的视图保存起来,然后每次要解析视图的时候先从缓存里面找,如果找到了对应的视图就直接返回,如果没有就创建一个新的视图对象,然后把它放到一个用于缓存的map中,接着再把新建的视图返回。使用这种视图缓存的方式可以把解析视图的性能问题降到最低。
UrlBasedViewResolver:它是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要就是提供的一种拼接URL的方式来解析视图,它可以让我们通过prefix属性指定一个指定的前缀,通过suffix属性指定一个指定的后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是指定的视图URL了。如prefix=/WEB-INF/,suffix=.jsp,返回的视图名称viewName=test,则UrlBasedViewResolver解析出来的视图URL就是/WEB-INF/test.jsp。默认的prefix和suffix都是空串。
InternalResourceViewResolver:它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。在实际应用中InternalResourceViewResolver也是使用的最广泛的一个视图解析器。InternalResourceViewResolver解释为内部资源视图解析器。InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型数据都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword到目标URL
ThymeleafViewResolver:Thymeleaf视图解析器,映射成一个 Thymeleaf 模板文件。
FreeMarkerViewResolver:UrlBasedViewResolver的子类。FreeMarkerViewResolver会把Controller处理方法返回的逻辑视图解析为FreeMarkerView。
未完待续
相关文章:

阶段七-Day01-SpringMVC
一、Sping MVC的介绍 1. 使用Front(前端)设计模式改写代码 1.1 目前我们的写法 目前我们所写的项目,持久层、业务层的类都放入到Spring容器之中了。他们之间需要注入非常方便,只需要通过Autowired注解即可。 但是由于Servlet整个生命周期都是被Tomca…...

Python---集合中的交集 、并集 | 与差集 - 特性
用 & 来求两个集合的交集:-----键盘上的7上的符号,shift 7 同时按 用 | 来求两个集合的并集: -----键盘上的7上的符号,shift 同时按(就是enter键上面那个|\ ) 用 - 来求两个集合的差集ÿ…...
C++调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握
系列文章目录 lua调用C/C的函数,十分钟快速掌握 C调用lua脚本,包括全局函数绑定、类绑定,十分钟快速掌握 系列文章目录摘要环境使用步骤码代码自定义函数多返回值变长参数 自定义类test_sol2.lua内容 程序输出 摘要 在这个快节奏的技术博客…...
快乐数[简单]
优质博文:IT-BLOG-CN 一、题目 编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如…...
Spring源码阅读-ClassPathXmlApplicationContext
第一步:new一个ClassPathXmlApplicationContext对象 ClassPathXmlApplicationContext xmlContext new ClassPathXmlApplicationContext("mylearn.xml"); 第二步:调用构造方法 public ClassPathXmlApplicationContext(String configLocatio…...

考研分享第2期 | 中央财经大学管理科学跨考北大软微金融科技406分经验分享
一、个人信息 本科院校:中央财经大学 管理科学与工程学院 管理科学专业 上岸院校:北京大学 软件与微电子学院 金融科技专业硕士 考试科目: 初试:思想政治理论 英语一 数学二 经济学综合 面试考察范围广,包括英语自…...
Linux安装java jdk配置环境 方便查询
编辑/etc/profile文件: vim /etc/profile 在文件尾部添加如下配置: export JAVA_HOME/usr/local/jdk1.8.0_161/ export CLASSPATH.: J A V A H O M E / j r e / l i b / r t . j a r : JAVA_HOME/jre/lib/rt.jar: JAVAHOME/jre/lib/rt.jar:JAVA_HOME/l…...
惊群效应之Nginx处理
文章目录 惊群概述Nginx 解决方案之锁的设计锁结构体原子锁创建原子锁获取原子锁实现原子锁释放 Nginx 解决方案之惊群效应总结: 惊群概述 在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进…...
SpringBoot整合Ldap--超详细方法讲解
LADP概述 LDAP(轻量目录访问协议)是一种用于访问和维护分布式目录信息服务的协议。目录服务是一种存储和检索信息的服务,通常用于存储组织内的用户信息、组织结构、网络设备等数据。LDAP是一种轻量级的协议,设计用于在目录中进行查…...

【工程实践】Docker使用记录
前言 服务上线经常需要将服务搬到指定的服务器上,经常需要用到docker,记录工作中使用过dcoker指令。 1.写Dockerfile 1.1 全新镜像 FROM nvidia/cuda:11.7.1-devel-ubuntu22.04ENV WORKDIR/data/Qwen-14B-Chat WORKDIR $WORKDIR ADD . $WORKDIR/RUN ap…...
FreeSwitch安装视频
文章目录 序言Centos7安装FreeSwitch-1.6 序言 学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作…...

SpringBoot3+Vue3+Mysql+Element Plus完成数据库存储blob类型图片,前端渲染后端传来的base64类型图片
前言 如果你的前后端分离项目采用SpringBoot3Vue3Element Plus,且在没有OSS(对象存储)的情况下,使用mysql读写图片(可能不限于图片,待测试)。 耗时三天,在踩了无数雷后,…...

攻略 | 参与Moonbeam Ignite Ecosystem Tour
Moonbeam联合Moonwell和Beamswap一起举办社区链上活动,旨在让社区用户通过任务来探索Moonbeam、Moonwell、Beamswap平台。在了解如何使用的同时,参与任务挑战还有机会分得 1700 USDC 奖池 🎁 的奖励!我已经完成全部任务࿰…...

【python自动化】Playwright基础教程(七)Keyboard键盘
【python自动化】Playwright基础教程(七)Keyboard键盘 playwright模拟键盘操作 键盘事件提供了用于管理虚拟键盘的API,高级API是keyboard.type(),它使用的是原始字符再页面上生成对应的keydown 、 keypress / input 和 keyup 事件。 模拟真实键盘操作进行…...
Java读取文件内容写入新文件
要实现读写文件这个过程我们需要导入以下的包 import java.io.BufferedReader; import java.io.BufferedWriter;BufferedReader 用于逐行读取源文件的内容,BufferedWriter 用于逐行写入目标文件。 下面以示例了解如何操作: import java.io.BufferedRe…...

学习samba
文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB(Server Message Block)协议实现文件共享,也称为CIFS(Common Internet File System)。 2、是Windows和类Unix系统之间共享文件的…...
【Ansible】Ansible的Ad-hoc命令执行流程
Ansible的Ad-hoc命令执行流程 用了这么久的Ansible,今天想着研究下Ad-hoc命令的执行流程,从最简单的ping开始吧。 测试命令如下: ansible 172.18.2.31 -m ping先看看回显的结果 [rootbigdata-m-002 etc]# ansible 172.18.2.31 -m ping 17…...

Postgresql 常用整理
文章目录 1. 查询1.1数据库表1.1.1 获取指定数据库表1.1.2 获取指定数据库表所有列名 1.2 别名1.2.1 子表指定别名1.2.2 查询结果指定别名 1.3 临时表1.3.1 定义临时表1.3.2 使用临时表 1.4 子表1.5 分组1.5.1 group by1.5.2 partition by 1.6 分组后合并指定列字段:…...

如何在Jupyter Lab中安装不同的Kernel
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
Java钩子函数的使用
目录 1. Java中常见的钩子函数 2. 使用钩子函数实现程序的清理工作 3. 使用钩子函数处理线程中的未捕获异常 4. 使用钩子函数实现窗口关闭时的操作 在Java编程中,钩子函数(Hook Function)是一种能够在特定事件发生时执行的代码块。钩子函…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...