SpringMVC快速入门

MVC模式

MVC(Model-View-Controller)模式是一种设计模式,用于分离应用程序的不同方面,以提高代码的组织性和可维护性。在Spring MVC框架中,MVC模式的作用是将应用程序的不同职责分开,从而简化开发和维护过程。MVC模式的三个主要组件是:

  1. Model(模型)表示应用程序的数据和业务逻辑。模型通常包括与数据库交互的部分以及用于处理业务逻辑的类。在Spring MVC中,模型通常由POJO(Plain Old Java Object)类表示,这些类包含数据和业务逻辑。

  2. View(视图)负责呈现数据给用户。视图将模型的数据以用户友好的格式显示出来。在Spring MVC中,视图通常是JSP、Thymeleaf、FreeMarker等模板文件,这些文件负责渲染HTML页面。

  3. Controller(控制器)处理用户的输入并更新模型和视图。控制器接收用户请求,调用相应的业务逻辑,并决定使用哪个视图来显示结果。在Spring MVC中,控制器是一个标注了@Controller注解的类,负责处理请求并返回一个视图名称或数据。

在Spring MVC框架中,处理请求的流程通常如下:

  1. 用户发起请求:用户通过浏览器发送一个HTTP请求。

  2. 前端控制器:Spring MVC的DispatcherServlet作为前端控制器接收请求,并根据请求的URL将其分发到合适的控制器。

  3. 控制器处理请求:控制器处理请求,调用模型中的业务逻辑,并将数据准备好。

  4. 选择视图:控制器选择一个视图,并将模型数据传递给视图。

  5. 渲染视图:视图将模型数据呈现给用户。

  6. 返回响应:前端控制器将视图的渲染结果返回给用户。

通过这种分层结构,MVC模式使得代码更易于理解和维护,因为它将数据处理、业务逻辑和用户界面分开处理。

SpingMVC启动!!!

对于SpringMVC的使用其实很简单,可以看我下面这篇文章:

链接: 使用SpringBoot快速开发一个接口

下面是SpringMVC常用的注解

1. 控制器注解

  • @Controller

    • 标记一个类为 SpringMVC 的控制器组件,通常与视图解析结合使用。
    • 示例
      @Controller
      public class MyController {// ...
      }
      
  • @RestController

    • 组合注解 @Controller@ResponseBody,用于构建 RESTful Web 服务。控制器方法返回的数据会被自动序列化为 JSON 或 XML 格式。
    • 示例
      @RestController
      public class MyRestController {// ...
      }
      

2. 请求映射注解

  • @RequestMapping

    • 用于映射请求路径到控制器方法,可以用于类级别和方法级别的映射。
    • 示例
      @RequestMapping("/hello")
      public String sayHello() {return "helloView";
      }
      
  • @GetMapping

    • 用于映射 HTTP GET 请求到控制器方法。是 @RequestMapping(method = RequestMethod.GET) 的快捷方式。
    • 示例
      @GetMapping("/users")
      public List<User> getUsers() {// ...
      }
      
  • @PostMapping

    • 用于映射 HTTP POST 请求到控制器方法。是 @RequestMapping(method = RequestMethod.POST) 的快捷方式。
    • 示例
      @PostMapping("/users")
      public User createUser(@RequestBody User user) {// ...
      }
      
  • @PutMapping

    • 用于映射 HTTP PUT 请求到控制器方法。是 @RequestMapping(method = RequestMethod.PUT) 的快捷方式。
    • 示例
      @PutMapping("/users/{id}")
      public User updateUser(@PathVariable Long id, @RequestBody User user) {// ...
      }
      
  • @DeleteMapping

    • 用于映射 HTTP DELETE 请求到控制器方法。是 @RequestMapping(method = RequestMethod.DELETE) 的快捷方式。
    • 示例
      @DeleteMapping("/users/{id}")
      public void deleteUser(@PathVariable Long id) {// ...
      }
      

3. 请求参数注解

  • @PathVariable

    • 用于从 URL 路径中提取参数。
    • 示例
      @GetMapping("/users/{id}")
      public User getUserById(@PathVariable Long id) {// ...
      }
      
  • @RequestParam

    • 用于从请求参数中提取单个参数。
    • 示例
      @GetMapping("/search")
      public List<User> searchUsers(@RequestParam String query) {// ...
      }
      
  • @RequestBody

    • 用于将请求体中的数据绑定到方法参数,通常用于处理 JSON 或 XML 数据。
    • 示例
      @PostMapping("/users")
      public User createUser(@RequestBody User user) {// ...
      }
      
  • @RequestHeader

    • 用于提取请求头中的数据。
    • 示例
      @GetMapping("/headers")
      public String getHeaders(@RequestHeader("User-Agent") String userAgent) {// ...
      }
      
  • @RequestAttribute

    • 用于从请求属性中提取数据,通常在过滤器或拦截器中设置。
    • 示例
      @GetMapping("/attributes")
      public String getAttributes(@RequestAttribute("attributeName") String attributeValue) {// ...
      }
      

4. 其他重要注解

  • @ModelAttribute

    • 用于在请求处理方法执行前将请求参数绑定到方法参数或方法级别的模型属性。
    • 示例
      @ModelAttribute
      public void addAttributes(Model model) {model.addAttribute("attributeName", "attributeValue");
      }
      
  • @SessionAttributes

    • 用于将某些模型属性存储到 HTTP 会话中,使其在多个请求中保持可用。
    • 示例
      @Controller
      @SessionAttributes("user")
      public class SessionController {// ...
      }
      
  • @ControllerAdvice

    • 用于定义全局的异常处理、全局数据绑定和全局模型属性。
    • 示例
      @ControllerAdvice
      public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
      }
      
  • @ExceptionHandler

    • 用于处理控制器方法中抛出的异常。
    • 示例
      @ExceptionHandler(ResourceNotFoundException.class)
      @ResponseBody
      public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
      }
      

SpringMVC处理web请求流程

旧版返回jsp的流程
在这里插入图片描述

旧版流程总结

  • 浏览器发起请求到DispatcherServlet控制器
  • DispatcherServlet根据请求路径查询handle
  • HandleMapping根据先前存储的映射规则,返回一个处理器执行链
  • DispatcherServlet将执行handle的命令发送到HandleAdapter处理适配器
  • HandleAdapter将请求体中的参数映射到处理函数中,然后接收响应数据,并对相应数据做处理然后返回一个ModelAndView对象给前端控制器
  • 前端控制器将数据传给视图解析器,视图解析器放回view对象
  • 前端控制器返回一个渲染视图

前后端分离开发处理请求流程
在这里插入图片描述

前后端分离开发流程

  • 浏览器发送请求给前端控制器
  • 前端控制器查询handle
  • 处理映射器返回一个处理器执行链给前端控制器
  • 前端控制器请求HandlerAdaptor执行,HandlerAdaptor负责处理传入参数和返回值
  • 处理器执行后返回结果,HttpMessageConverter将返回结果转换为json后直接响应

SpringMVC异常处理

SpringMVC 的异常处理器用于集中处理应用程序中的异常,以便为用户提供一致的错误响应,同时使代码更加干净和可维护。

异常处理器概述

  • @ExceptionHandler:在控制器中使用,专门处理某个控制器方法抛出的特定异常。
  • @ControllerAdvice:用于定义全局异常处理逻辑,可以处理应用程序中的所有控制器的异常。
  • @ResponseStatus:用于定义异常类的 HTTP 状态码,简化异常响应的处理。

实现异常处理类

以下是一个简短的示例,展示了如何使用 @ControllerAdvice@ExceptionHandler 实现一个全局异常处理类:

1. 创建自定义异常类

首先,定义一个自定义异常类:

public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

2. 创建异常处理类

使用 @ControllerAdvice@ExceptionHandler 注解创建一个全局异常处理类:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)@ResponseBodypublic ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {// 处理资源未找到异常,返回 404 状态码和异常消息return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);}@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<String> handleGenericException(Exception ex) {// 处理其他异常,返回 500 状态码和异常消息return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

使用方法

  • 自定义异常:当控制器方法中抛出 ResourceNotFoundException 时,handleResourceNotFoundException 方法会处理此异常,并返回一个 404 状态码。
  • 通用异常:对于其他未处理的异常,handleGenericException 方法会处理,并返回一个 500 状态码。

SpringMVC拦截器

SpringMVC 的拦截器是用于在请求处理过程中对请求和响应进行预处理和后处理的组件。它们允许开发者在请求到达控制器之前、控制器处理请求之后,以及视图渲染之前执行一些额外的操作,如日志记录、安全检查、性能监控等。

拦截器的核心功能

  1. 请求预处理:在请求到达控制器之前执行,用于检查权限、设置请求属性等。
  2. 请求后处理:在控制器处理请求之后,视图渲染之前执行,用于修改模型数据、记录日志等。
  3. 响应后处理:在视图渲染之后,响应发送给客户端之前执行,用于修改响应数据等。

拦截器接口

SpringMVC 提供了一个 HandlerInterceptor 接口,用于定义拦截器。这个接口包含以下方法:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

    • 在请求处理之前调用。返回 true 继续处理请求,返回 false 终止请求处理。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

    • 在请求处理之后,视图渲染之前调用。可以修改模型和视图数据。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

    • 在视图渲染完成后调用。用于清理资源等操作。

示例:实现一个简单的拦截器

1. 创建拦截器类

实现 HandlerInterceptor 接口,并重写其方法:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理之前执行System.out.println("Before handling the request");return true; // 返回 true 继续处理请求,返回 false 中止请求处理}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理后,视图渲染之前执行System.out.println("After handling the request but before rendering the view");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在视图渲染完成后执行System.out.println("After completing the request");if (ex != null) {ex.printStackTrace();}}
}

2. 注册拦截器

在 SpringMVC 的配置类中注册拦截器:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 设置拦截路径}
}

SpringMVC过滤器

SpringMVC 的过滤器(Filter)是一种用于在请求和响应处理过程中对请求数据和响应数据进行预处理和后处理的机制。它们可以用于实现各种功能,如日志记录、安全检查、请求修改等。过滤器是在 Servlet 容器中运行的,而不是 Spring 容器中。

过滤器的核心功能

  1. 请求预处理:在请求到达控制器之前执行,可以对请求进行修改、添加属性等。
  2. 响应后处理:在响应从控制器返回之前执行,可以对响应进行修改或记录日志等。

过滤器接口

javax.servlet.Filter 接口用于定义过滤器。它包含以下方法:

  • void init(FilterConfig filterConfig)

    • 初始化过滤器,通常用于读取配置参数。
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

    • 处理请求和响应。可以对请求和响应进行修改,并调用 FilterChaindoFilter 方法继续处理链中的下一个过滤器或目标资源。
  • void destroy()

    • 关闭过滤器,释放资源。

示例:实现一个简单的过滤器

1. 创建过滤器类

实现 Filter 接口,并重写其方法:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 通过注解配置过滤器的拦截路径
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化过滤器System.out.println("Filter initialized");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 处理请求之前System.out.println("Before request processing");// 继续处理请求,调用链中的下一个过滤器或目标资源chain.doFilter(request, response);// 处理响应之后System.out.println("After request processing");}@Overridepublic void destroy() {// 关闭过滤器System.out.println("Filter destroyed");}
}

2. 注册过滤器

在 Spring Boot 中,你也可以通过 Java 配置类注册过滤器:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<MyFilter> loggingFilter() {FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/*"); // 设置过滤器的拦截路径return registrationBean;}
}

SpringMVC解决跨域问题

在 SpringMVC 中,跨域问题(Cross-Origin Resource Sharing, CORS)通常是指不同源的客户端请求访问服务器资源时遇到的限制。为了解决这个问题,可以配置允许跨域访问的策略。SpringMVC 提供了多种方式来处理跨域请求。

解决跨域问题的方法

  1. 全局 CORS 配置

    在 Spring Boot 应用中,可以通过配置全局 CORS 规则来允许特定的来源进行跨域访问。这种方式可以在全局范围内对所有控制器应用 CORS 配置。

    示例

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://example.com") // 允许的源.allowedMethods("GET", "POST", "PUT", "DELETE") // 允许的 HTTP 方法.allowedHeaders("*") // 允许的请求头.allowCredentials(true); // 是否允许凭证(如 cookies)}
    }
    
  2. 在 Controller 层使用 @CrossOrigin 注解

    可以在单个控制器或具体的控制器方法上使用 @CrossOrigin 注解来指定允许的跨域配置。这种方式适用于需要对某些特定控制器或方法进行跨域配置的情况。

    示例

    import org.springframework.web.bind.annotation.CrossOrigin;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;@RestController
    @RequestMapping("/api")
    public class MyController {@CrossOrigin(origins = "http://example.com")@GetMapping("/data")public String getData() {return "Some data";}
    }
    
  3. 在 Spring Security 中配置 CORS

    如果应用程序使用了 Spring Security,必须在 Security 配置中显式启用 CORS 配置。Spring Security 默认情况下不会允许 CORS 请求,因此需要进行额外的配置。

    示例

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors() // 启用 CORS.and().csrf().disable() // 根据需要配置 CSRF.authorizeRequests().anyRequest().authenticated();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("http://example.com"));configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));configuration.setAllowedHeaders(Arrays.asList("*"));configuration.setAllowCredentials(true);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;}
    }
    

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

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

相关文章

Datawhale X 魔搭 AI夏令营第四期 AIGC方向 task02笔记

AI工具使用 1. baseline 代码2. 使用通义千问理解代码2.1 工作流程2.2 逐行释意 3. 使用通义千问生成 Prompt3.1 生成的 Prompt3.1 根据 Prompt 生成的图片 1. baseline 代码 !pip install simple-aesthetics-predictor!pip install -v -e data-juicer!pip uninstall pytorch-…

EasyBoss ERP上线TikTok热销数据功能,助力TikTok本土店卖家快速选品上货!

想要你的TikTok本土小店销量不断增长&#xff0c;选品至关重要。只有选品问题解决了&#xff0c;后续的投放、小店定调等动作才有意义。 因此&#xff0c;今天就来分享几种TikTok本土小店的选品策略。 一、TikTok Shop选品的底层逻辑 图源&#xff1a;TikTok Shop 在选品之前…

SpringBoot 自定义 starter

1. 官方文档 SpringBoot 版本 2.6.13&#xff0c;相关链接 Developing with Spring Boot 1.1 什么是 Starter Starters are a set of convenient dependency descriptors that you can include in your application. You get a one-stop shop for all the Spring and relate…

C++哪些变量在没有显式初始化的情况下会被初始化为0

首先&#xff0c;我们需要明白C程序编译链接后会包含以下几个主要段(Section)。 代码段(.text)&#xff1a;存放程序的可执行代码&#xff0c;通常是只读的数据段(.data)&#xff1a;存放已初始化的全局变量和静态变量BSS段(.bss)&#xff1a;存放未初始化的全局变量和静态变量…

Git文件管理技巧:轻松删除与查看文件,忽略不必要的文件与文件夹!

避免文件混乱&#xff1a;Git 文件操作技巧 一、Git工作原理概述二、删除文件三、查看指定文件的修改四、指定不需要 Git 管理的文件五、总结 一、Git工作原理概述 Git是一种分布式版本控制系统&#xff0c;其核心在于其高效的快照机制、强大的分支与合并功能、本地开发的灵活…

详细分析JWT的基本知识(附Demo)

目录 前言1. 基本知识2. JWT验证过程3. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 紧凑的、U…

《Kotlin核心编程》2021版复习记录

目录 0 前言1 基础语法1.1 数据类型1.2 数组1.3 集合1.4 遍历数据和集合1.5 函数声明返回值类型1.6 var 和 val 2 高阶函数和lambda表达式2.1 高阶函数2.2 方法和成员引用2.3 链式调用2.4 扩展函数2.5 面向表达式编程2.5.1 when表达式2.5.2 for循环2.5.3 in 2.6 字符串相等 3 面…

手撕初阶数据结构之---排序

1.排序概念及运用 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的⼤⼩&#xff0c;递增或递减的排列起来的操作。 常见的排序算法 直接插入排序的时间复杂度是O(N^2) 这个是最差的情况下&#xff0c;就是大的在前面&#xff…

被老韭菜阴阳了?未来一个人最核心的能力:守脑如玉——早读(逆天打工人爬取热门微信文章解读)

tomato 版本TO&#xff1f; 引言Python 代码第一篇 洞见 未来一个人最核心的能力&#xff1a;守脑如玉第二篇 股友见闻结尾 &#xff08;你看出本质了吗&#xff1f;&#xff09; 引言 昨晚听别人的分析 好神奇 我会惊叹 为什么大家看到的都是同样的东西 而别人进行思考 思考…

Python 在PDF中添加条形码、二维码

在PDF中添加条码是一个常见需求&#xff0c;特别是在需要自动化处理、跟踪或检索PDF文件时。作为一种机器可读的标识符&#xff0c;PDF中的条码可以包含各种类型的信息&#xff0c;如文档的唯一标识、版本号、日期等。以下是一篇关于如何使用Python在PDF中添加条形码或二维码的…

Python开源项目周排行 2024年第13周

#2024年第13周2024年8月5日1roop一款基于深度学习框架TensorFlow和Keras开发的单图换脸工具包&#xff0c;提供了丰富的功能和简洁易用的界面&#xff0c;使得用户可以轻松实现单图换脸操作。支持多张人脸替换成同一个人脸&#xff0c;勾选多人脸模式即可 人脸替换 高清修复自…

SPDK源码剖析一hello_world程序

SPDK初识之hello_world程序分析 首先是hello_world程序整体框架分析 int main(int argc, char **argv) {rc parse_args(argc, argv, &opts);if (spdk_env_init(&opts) < 0) { // spdk环境初始化&#xff0c;最终调用dpdk环境初始化}// 扫描设备&#xff0c;将驱…

bluecmsphp代码审计

bluecms代码审计 (一) 运行环境需求&#xff1a; 可用的 httpd 服务器&#xff08;如 Apache、Zeus、IIS 等&#xff09; PHP 4.3.0 及以上 MySQL 4.1 及以上配置文件审计 看到uploads/install/include/common.inc.php 当然我们可能自己根本不知道那个是重要的文件&#x…

C++《类和对象》(上)

在之前的C入门基础知识中我们了解了C的发展过程已经重要性&#xff0c;还初步了解了C中一些相比C语言特有的知识点&#xff0c;例如命名空间、缺少参数、函数重载、引用等&#xff0c;接下来在本篇中我们将开始C整个体系中非常重要的一个知识章节——类和对象&#xff0c;类和对…

Unity新输入系统 之 InputActions(输入配置文件)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 首先你应该了解新输入系统的基本单位Unity新输入系统 之 InputAction&#xff08;输入配置文件最基本的单位&#xff0…

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…

【区块链+乡村振兴】“蜜链盟”乡村振兴基层治理数字化平台 | FISCO BCOS应用案例

在国家战略政策推动和新一代信息化发展应用的合力之下&#xff0c;数字乡村是互联网化、信息化和数字化在农业农村经 济社会发展中的表现。为进一步加强乡村基层治理&#xff0c;根据《中共海南省委农村工作领导小组办公室海南省农业农 村厅关于在我省乡村治理中推广运用积分制…

用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

exceljs在Jquery&#xff08;HTML&#xff09;和vue项目中实现导出功能 前言Jquery&#xff08;HTML&#xff09;中实现导出第一步&#xff0c;先在项目本地中导入exceljs和file-saver包第二步&#xff0c;封装导出Excel方法&#xff08;可直接复制粘贴使用&#xff09;第三步&…

Java 实现 B树(通俗易懂)

目录 一.概念 二.节点定义 三.插入操作 1.查找位置 2.插入 3.分裂 四.B树和B*树 1.B树 2.B*树 一.概念 B树是一颗多叉平衡树&#xff0c;空树也是多叉平衡树。 一颗M阶的B树要满足以下条件&#xff1a; 1.根节点至少有两个孩子&#xff1b; 2.每个非根节点至少有(上…

机械学习—零基础学习日志(如何理解线性代数2)

零基础为了学人工智能&#xff0c;正在快乐学习&#xff0c;每天都长脑子 引言 在平面中&#xff0c;直线的定义可以理解为&#xff0c;任意缩放同一个平面向量得到所有点的集合。 所以要得到一个三维空间中的直线&#xff0c;只需要将这个向量改成三维向量即可。 什么是线…