实现SpringMVC底层机制(一)

文章目录

    • 1.环境配置
        • 1.创建maven项目
        • 2.创建文件目录
        • 3.导入jar包
    • 2.开发核心控制器
        • 文件目录
        • 1.流程图
        • 2.编写核心控制器SunDispatcherServlet.java
        • 3.类路径下编写spring配置文件sunspringmvc.xml
        • 4.配置中央控制器web.xml
        • 5.配置tomcat,完成测试
          • 1.配置发布方式
          • 2.配置热加载
          • 3.修改SunDispatcherServlet.java
          • 4.完成测试
    • 3.完成客户端/浏览器可以请求控制层
        • 文件目录
        • 1.思路分析
        • 2.编写MonsterController.java
        • 3.自定义注解
          • 1.Controller.java
          • 2.RequestMapping.java
        • 4.自定义容器(1),在tomcat启动时读取配置文件,获取要扫描的包的工作路径
          • 1.SunWebApplicationContext.java
          • 2.修改SunDispatcherServlet.java
          • 3.单元测试,启动tomcat
        • 5.自定义容器(2),在tomcat启动的时候完成对指定包的扫描
          • 1.修改SunWebApplicationContext.java
          • 2.debug测试
        • 6.将自定义容器(3),符合要求的类反射创建对象,放到单例池
          • 1.修改SunWebApplicationContext.java增加方法,添加属性
          • 2.debug查看单例池
        • 7.完成url和控制器方法映射
          • 1.创建映射bean,SunHandler.java
          • 2.修改中央控制器SunWebApplicationContext.java添加方法和属性
          • 3.debug查看映射对象列表
        • 8.完成请求分发到目标方法
          • 1.修改SunDispatcherServlet.java,添加两个方法并在dopost中请求分发
          • 2.单元测试
    • 4.当前阶段完成的功能
        • 1.初始化阶段
        • 2.完成请求分发

1.环境配置

1.创建maven项目

image-20240227084815460

2.创建文件目录

image-20240227085226577

3.导入jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>sun-springmvc</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>sun-springmvc Maven Webapp</name><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!--servlet原生api--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--在项目打包时不会带上这个jar--><scope>provided</scope></dependency><!--解析xml--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency><!--常用工具类--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.5</version></dependency></dependencies><build><finalName>sun-springmvc</finalName></build>
</project>

2.开发核心控制器

文件目录

image-20240227095105084

1.流程图

image-20240227093109208

2.编写核心控制器SunDispatcherServlet.java
package com.Sun.sunspringmvc.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 充当中央控制器** @author 孙显圣* @version 1.0*/
public class SunDispatcherServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doGet(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}
3.类路径下编写spring配置文件sunspringmvc.xml
4.配置中央控制器web.xml
<!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><!--配置中央控制器--><servlet><servlet-name>SunDispatcherServlet</servlet-name><servlet-class>com.Sun.sunspringmvc.servlet.SunDispatcherServlet</servlet-class><!--init—param设置spring配置文件的位置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:sunspringmvc.xml</param-value></init-param><!--服务器启动时实例化servlet,将其放到容器中,并且调用init方法--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>SunDispatcherServlet</servlet-name><!--拦截所有请求--><url-pattern>/</url-pattern></servlet-mapping></web-app>
5.配置tomcat,完成测试
1.配置发布方式

image-20240227092658306

2.配置热加载

image-20240227092725037

3.修改SunDispatcherServlet.java

image-20240227092846449

4.完成测试

image-20240227092956993

image-20240227093009005

3.完成客户端/浏览器可以请求控制层

文件目录

image-20240227165505347

1.思路分析

image-20240227143426184

2.编写MonsterController.java
package com.Sun.controller;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** @author 孙显圣* @version 1.0*/
public class MonsterController {public void listMonster(HttpServletRequest request, HttpServletResponse response) {//设置mine类型response.setContentType("text/html;charset=utf-8");try {PrintWriter writer = response.getWriter();writer.write("<h1>妖怪列表信息</h1>");} catch (IOException e) {throw new RuntimeException(e);}}
}
3.自定义注解
1.Controller.java
package com.Sun.sunspringmvc.annotation;import java.lang.annotation.*;/*** 用于标识一个Controller** @author 孙显圣* @version 1.0*/
@Target(ElementType.TYPE) //作用于类型
@Retention(RetentionPolicy.RUNTIME) //作用范围
@Documented
public @interface Controller {
}
2.RequestMapping.java
package com.Sun.sunspringmvc.annotation;import java.lang.annotation.*;/*** 用于指定映射路径** @author 孙显圣* @version 1.0*/
@Target(ElementType.METHOD) //作用于方法
@Retention(RetentionPolicy.RUNTIME) //作用范围
@Documented
public @interface RequestMapping {
}
4.自定义容器(1),在tomcat启动时读取配置文件,获取要扫描的包的工作路径
1.SunWebApplicationContext.java
package com.Sun.sunspringmvc.context;import com.Sun.sunspringmvc.xml.XmlParser;import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class SunWebApplicationContext {//存放所有要扫描的包下的class文件的全路径private List<String> classFullPathList = new ArrayList<String>();//初始化容器public void init() {//读取spring配置文件,获取要扫描的包的信息String basePage = XmlParser.getBasePage("sunspringmvc.xml");//完成对指定包的扫描scanPage(basePage);}//创建方法,完成对指定包的扫描,获取所有class文件的全路径public void scanPage(String packFullName) {//将包的全类名中的点替换为斜杠String packPath = packFullName.replaceAll("\\.", "/");//通过类加载器来获取这个包的工作路径,就是获取工作路径下的类路径下的文件路径URL resource = SunWebApplicationContext.class.getClassLoader().getResource(packPath);System.out.println(resource);}
}
2.修改SunDispatcherServlet.java
package com.Sun.sunspringmvc.servlet;import com.Sun.sunspringmvc.context.SunWebApplicationContext;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** 充当中央控制器** @author 孙显圣* @version 1.0*/
public class SunDispatcherServlet extends HttpServlet {@Overridepublic void init(ServletConfig config) throws ServletException {//初始化容器SunWebApplicationContext sunWebApplicationContext = new SunWebApplicationContext();sunWebApplicationContext.init();}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doGet");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");}
}
3.单元测试,启动tomcat

image-20240227133426603

5.自定义容器(2),在tomcat启动的时候完成对指定包的扫描
1.修改SunWebApplicationContext.java
package com.Sun.sunspringmvc.context;import com.Sun.sunspringmvc.xml.XmlParser;import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;/*** @author 孙显圣* @version 1.0*/
public class SunWebApplicationContext {//存放所有要扫描的包下的class文件的全路径private List<String> classFullPathList = new ArrayList<String>();//初始化容器public void init() {//读取spring配置文件,获取要扫描的包的信息String basePage = XmlParser.getBasePage("sunspringmvc.xml");//初始化容器//根据逗号进行分割,得到多个要扫描的包的全路径,遍历将里面的class文件全路径放到列表中String[] split = basePage.split(",");for (String packPath : split) {scanPage(packPath);}}//创建方法,完成对指定包的扫描,获取所有class文件的全路径public void scanPage(String packFullName) {//将包的全类名中的点替换为斜杠String packPath = packFullName.replaceAll("\\.", "/");//通过类加载器来获取这个包的工作路径,就是获取工作路径下的类路径下的文件路径URL url = SunWebApplicationContext.class.getClassLoader().getResource(packPath);//得到路径String file = url.getFile();//根据这个文件夹来创建一个file对象,从而遍历里面所有的class文件得到所有class文件的全路径File packDirectory = new File(file);if (packDirectory.isDirectory()) {//如果是文件夹则列出里面的所有文件对象File[] files = packDirectory.listFiles();//遍历这些文件对象,实际上就那个包下的所有class文件对象for (File classFile : files) {//如果这里的文件对象还是文件夹,则进行递归扫描if (classFile.isDirectory()) {scanPage(packFullName + "." + classFile.getName());} else {//如果这里的文件对象指的都是文件,则将其放到classFullPathList中//得到当前文件的全类名 = 包的全路径 + class文件的名字去掉.classString classFullPath = packFullName + "." + classFile.getName().replaceAll(".class", "");//放到列表中classFullPathList.add(classFullPath);}}}}}
2.debug测试

image-20240227143135578

6.将自定义容器(3),符合要求的类反射创建对象,放到单例池
1.修改SunWebApplicationContext.java增加方法,添加属性

image-20240227145800640

    //编写方法,将符合要求的类反射创建对象,并封装到单例池中public void executeInstance(){//遍历所有全类名for (String classPath : classFullPathList) {try {//反射Class<?> aClass = Class.forName(classPath);//判断是否有Controller注解if (aClass.isAnnotationPresent(Controller.class)) {//有注解,当他是单例的,反射创建bean对象,放到单例池中,默认首字母小写//获取类名首字母小写String name = aClass.getSimpleName().substring(0, 1).toLowerCase() + aClass.getSimpleName().substring(1);//放到单例池中singleObjects.put(name, aClass.newInstance());}} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}
2.debug查看单例池

image-20240227145600884

7.完成url和控制器方法映射
1.创建映射bean,SunHandler.java
package com.Sun.sunspringmvc.handler;import java.lang.reflect.Method;/*** 用于存放有注解的类的映射信息** @author 孙显圣* @version 1.0*/
public class SunHandler {private String url; //映射的urlprivate Object controller; //controller对象private Method method; //方法对象,用于反射调用方法public SunHandler(String url, Object controller, Method method) {this.url = url;this.controller = controller;this.method = method;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public Object getController() {return controller;}public void setController(Object controller) {this.controller = controller;}public Method getMethod() {return method;}public void setMethod(Method method) {this.method = method;}@Overridepublic String toString() {return "SunHandler{" +"url='" + url + '\'' +", controller=" + controller +", method=" + method +'}';}
}
2.修改中央控制器SunWebApplicationContext.java添加方法和属性

image-20240227155457879

    //初始化映射对象列表,获取映射对象并且将其放到映射列表中private void initHandlerMapping() {//判断单例池是否为空if (sunWebApplicationContext.singleObjects.isEmpty()) {return;}//取出单例池里的所有对象for (Map.Entry<String, Object> entry : sunWebApplicationContext.singleObjects.entrySet()) {//反射Class<?> aClass = entry.getValue().getClass();//判断是否有colltroller注解if (aClass.isAnnotationPresent(Controller.class)) {//反射获取所有方法对象Method[] declaredMethods = aClass.getDeclaredMethods();//判断方法里是否有requestmapping注解for (Method declaredMethod : declaredMethods) {if (declaredMethod.isAnnotationPresent(RequestMapping.class)) {//获取这个方法的注解信息String url = declaredMethod.getAnnotation(RequestMapping.class).value();//将信息封装到映射bean对象中SunHandler sunHandler = new SunHandler(url, entry.getValue(), declaredMethod);//添加到列表中handlers.add(sunHandler);}}}}}
3.debug查看映射对象列表

8.完成请求分发到目标方法
1.修改SunDispatcherServlet.java,添加两个方法并在dopost中请求分发
package com.Sun.sunspringmvc.servlet;import com.Sun.sunspringmvc.annotation.Controller;
import com.Sun.sunspringmvc.annotation.RequestMapping;
import com.Sun.sunspringmvc.context.SunWebApplicationContext;
import com.Sun.sunspringmvc.handler.SunHandler;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 充当中央控制器** @author 孙显圣* @version 1.0*/
public class SunDispatcherServlet extends HttpServlet {//存放所有的映射关系private List<SunHandler> handlers = new ArrayList<SunHandler>();private SunWebApplicationContext sunWebApplicationContext = null;@Overridepublic void init(ServletConfig config) throws ServletException {//初始化容器sunWebApplicationContext = new SunWebApplicationContext();sunWebApplicationContext.init();//初始化映射列表initHandlerMapping();System.out.println("ss");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//请求分发executeDispatch(req, resp);}//初始化映射对象列表,获取映射对象并且将其放到映射列表中private void initHandlerMapping() {//判断单例池是否为空if (sunWebApplicationContext.singleObjects.isEmpty()) {return;}//取出单例池里的所有对象for (Map.Entry<String, Object> entry : sunWebApplicationContext.singleObjects.entrySet()) {//反射Class<?> aClass = entry.getValue().getClass();//判断是否有colltroller注解if (aClass.isAnnotationPresent(Controller.class)) {//反射获取所有方法对象Method[] declaredMethods = aClass.getDeclaredMethods();//判断方法里是否有requestmapping注解for (Method declaredMethod : declaredMethods) {if (declaredMethod.isAnnotationPresent(RequestMapping.class)) {//获取这个方法的注解信息String url = declaredMethod.getAnnotation(RequestMapping.class).value();//将信息封装到映射bean对象中SunHandler sunHandler = new SunHandler(url, entry.getValue(), declaredMethod);//添加到列表中handlers.add(sunHandler);}}}}}//根据请求对象得到映射对象private SunHandler getSunHandler(HttpServletRequest request) {//获取uri: /sun-springmvc/list/monsterString requestURI = request.getRequestURI();String contextPath = request.getServletContext().getContextPath();//遍历映射对象列表,查看列表中是否有这个urifor (SunHandler handler : handlers) {//这里拼接一个上下文路径if ((contextPath + "/" + handler.getUrl()).equals(requestURI)) {//返回这个映射对象return handler;}}return null;}//请求分发private void executeDispatch(HttpServletRequest request, HttpServletResponse response) {//获取映射对象SunHandler sunHandler = getSunHandler(request);//映射对象不等于空则反射调用controller的方法if (sunHandler != null) {try {sunHandler.getMethod().invoke(sunHandler.getController(), request, response);} catch (IllegalAccessException e) {throw new RuntimeException(e);} catch (InvocationTargetException e) {throw new RuntimeException(e);}} else {//当映射对象是空的时候,返回404try {response.getWriter().write("<h1>404 not found!</h1>");} catch (IOException e) {throw new RuntimeException(e);}}}
}
2.单元测试

image-20240227164234686

image-20240227164244515

image-20240227164254432

4.当前阶段完成的功能

1.初始化阶段
  • tomcat服务器启动,自动装载中央控制器(servlet),调用init方法
  • 初始化spring容器
    • 创建spring容器实例,调用init方法
    • 读取spring配置文件,得到要扫描的包的工作路径
    • 扫描指定的包,获取所有class文件的全路径
    • 扫描所有class文件,将包含Controller注解的类反射创建对象放到单例池中(这里假设都是单例的)
  • 初始化映射对象列表
    • 扫描所有单例池中的对象
    • 反射获取这个对象对应类的所有方法,如果方法包含RequestMapping注解,则将这个对象,url,Method对象封装到映射对象中,并且添加到映射对象列表
2.完成请求分发
  • 根据请求对象得到映射对象
    • 获取请求的uri
    • 遍历对象映射列表查看是否有匹配的映射对象,如果有则返回映射对象
  • 请求分发
    • 首先根据请求对象得到映射对象
    • 如果得到了就反射调用方法
    • 没有得到则返回404

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

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

相关文章

URL路由基础与Django处理请求的过程分析

1. URL路由基础 对于高质量的Web应用来讲&#xff0c;使用简洁、优雅的URL设计模式非常有必要。Django框架允许设计人员自由地设计URL模式&#xff0c;而不用受到框架本身的约束。对于URL路由来讲&#xff0c;其主要实现了Web服务的入口。用户通过浏览器发送过来的任何请求&am…

HarmonyOS 鸿蒙下载三方依赖 ohpm环境搭建

前言 ohpm&#xff08;One Hundred Percent Mermaid &#xff09;是一个集成了Mermaid的命令工具&#xff0c;可以用于生成关系图、序列图、等各种图表。我们可以使用ohpm来生成漂亮且可读性强的图表。 本期教大家如何搭建ophm环境&#xff1a; 一、在DevEco Studio中&#…

Faust勒索病毒:了解变种faust,以及如何保护您的数据

导言&#xff1a; 近年来&#xff0c;网络安全问题日益严峻&#xff0c;其中勒索病毒成为了一种日益猖獗的威胁。在众多勒索病毒中&#xff0c;.faust勒索病毒以其高度的隐秘性和破坏性引起了广泛关注。本文91数据恢复将深入剖析.faust勒索病毒的威胁特点&#xff0c;并提出相…

Spark-机器学习(5)分类学习之朴素贝叶斯算法

在之前的文章中&#xff0c;我们学习了回归中的逻辑回归&#xff0c;并带来简单案例&#xff0c;学习用法&#xff0c;并带来了简单案例。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵…

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot&#xff0c;一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎&#xff08;Unreal Engine&#xff09;等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化&#xff0c;越来越多的独立开发者和小型开发团队倾向于选择…

牛客NC368 质数的计数【中等 基础数学,数论 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/190167d1990442da9adb133980259a27 思路 判断x是否是质数&#xff1a;这是判断质数最好的代码了public boolean isPrime(int x){if(x 2 || x3) return true;if(x%6!1 && x%6!5) return false; //不在6倍…

前端到全栈进阶之“前端框架”

从前端入门到全栈-系列介绍 你会学到什么&#xff1f; 可能学不到什么东西&#xff0c;该系列是作者本人工作和学习积累&#xff0c;用于复习 系列介绍 现在的 Web 前端已经离不开 Node.js&#xff0c;我们广泛使用的 Babel、Webpack、工程化都是基于 Node 的&#xff0c;各…

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

大模型咨询培训老师叶梓:利用知识图谱和Llama-Index增强大模型应用

大模型&#xff08;LLMs&#xff09;在自然语言处理领域取得了显著成就&#xff0c;但它们有时会产生不准确或不一致的信息&#xff0c;这种现象被称为“幻觉”。为了提高LLMs的准确性和可靠性&#xff0c;可以借助外部知识源&#xff0c;如知识图谱。那么我们如何通过Llama-In…

面试:finalize

一、概述 将资源释放和清理放在finalize方法中非常不好&#xff0c;非常影响性能&#xff0c;严重时甚至会引起OOM&#xff08;Out Of Memory&#xff09;&#xff0c;从Java9开始就被标注为Deprecated&#xff0c;不建议被使用了。 二、两个重要的队列 1、unfinalized 队列 当…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

不同技术实现鼠标滚动图片的放大缩小

摘要&#xff1a; 最近弄PC端的需求时&#xff0c;要求在layui技术下实现鼠标滚动图片的放大缩小的功能&#xff01;下面来总结一下不同框架剩下这功能&#xff01; layui: 看了一下layui文档&#xff0c;其实这有自带的组件的&#xff01;但是又版本要求的!并且layui的官方文档…

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

Linux网络编程---多进/线程并发服务器

一、多进程并发服务器 实现一个服务器可以连接多个客户端&#xff0c;每当accept函数等待到客户端进行连接时 就创建一个子进程 思路分析&#xff1a; 核心思路&#xff1a;让accept循环阻塞等待客户端&#xff0c;每当有客户端连接时就fork子进程&#xff0c;让子进程去和客户…

怎么用PHP语言实现远程控制电器

怎么用PHP语言实现远程控制电器呢&#xff1f; 本文描述了使用PHP语言调用HTTP接口&#xff0c;实现控制电器&#xff0c;通过控制电器的电源线路来实现电器控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格 序号设备名称厂商1智能WiFi通断器AC3统…

ubuntu22 部署fastDFS单节点和集群,整合Spring Boot(刚部署成功)

ubuntu22 部署fastDFS单节点和集群 一、先准备1、所需依赖安装2、下载安装包 二、安装FastDFS单节点1、libfastcommon安装1.1、创建软连接 2、安装fastDFS2.1、fastDFS目录简单介绍2.2、创建软连接 3、配置和启动Tracker服务3.1、修改Tracker配置文件3.2、启动Tracker 4、配置和…

IBM SPSS Statistics for Mac v27.0.1中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac v27.0.1中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

pyqt设置标签显示图片并设置大小

pyqt设置标签显示图片并设置大小 标签显示图片效果代码 标签显示图片 使用 QPixmap 加载图片进行图片大小设置把图片对象设置到标签上 效果 代码 from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget from PyQt5.QtGui import QPixmap import sys from…

【蓝桥杯2025备赛】素数判断:从O(n^2)到O(n)学习之路

素数判断:从O( n 2 n^2 n2)到O(n)学习之路 背景:每一个初学计算机的人肯定避免不了碰到素数&#xff0c;素数是什么&#xff0c;怎么判断&#xff1f; 素数的概念不难理解:素数即质数&#xff0c;指的是在大于1的自然数中&#xff0c;除了1和它本身不再有其他因数的自然数。 …