【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录

  • 一、SpringMVC 介绍
    • 1.1 主要作用
    • 1.2 核心组件和调用流程理解
  • 二、快速体验
  • 三、SpringMVC接收数据
  • 3.1 访问路径设置
    • 3.1.1 精准路径匹配
    • 3.1.2 模糊路径匹配
    • 3.1.3 类和方法级别区别
    • 3.1.4 附带请求方式限制
    • 3.1.5 进阶注解 与 常见配置问题
  • 3.2 接收参数(重点)
    • 3.2.1 param 和 json参数比较
    • 3.2.2 param参数接收
    • 3.2.3 路径 参数接收
    • 3.2.4 json参数接收
  • 3.3 接收Cookie数据
  • 3.4 接收请求头数据
  • 3.5 原生Api对象操作
  • 3.6 共享域对象操作
    • 3.6.1 属性(共享)域作用回顾
    • 3.6.2 Request级别属性(共享)域
    • 3.6.3 Session级别属性(共享)域
    • 3.6.4 Application级别属性(共享)域
  • 总结
    • @EnableWebMvc 原理


一、SpringMVC 介绍

SpringMVC 官网 文档

面向表述成controller的框架

原生servlet API 开发:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                                        throws ServletException, IOException {  
    String userName = request.getParameter("userName");
    
    System.out.println("userName="+userName);
}

基于SpringMVC开发代码:

@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName,Sting password){
    
    log.debug("userName="+userName);
    //调用业务即可
    
    return "result";
}

1.1 主要作用

1
SSM框架构建起单体项目的技术栈需求!其中的SpringMVC负责表述层(控制层)实现简化!

SpringMVC的作用主要覆盖的是表述层,例如:

  • 请求映射
  • 数据输入
  • 视图界面
  • 请求分发
  • 表单回显
  • 会话控制
  • 过滤拦截
  • 异步交互
  • 文件上传
  • 文件下载
  • 数据校验
  • 类型转换
  • 等等等

最终总结:

  1. 简化前端参数接收( 形参列表 )
  2. 简化后端数据响应(返回值)
  3. 以及其他…

1.2 核心组件和调用流程理解

DispatcherServlet 做整体请求处理调度。以及其他组件辅助对请求和响应的处理呈现。

SpringMVC处理请求流程:
1

SpringMVC涉及组件理解:

  1. DispatcherServlet : SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发!
  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数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的!

二、快速体验

  1. 需求
    1
  2. 配置分析
  • DispatcherServlet : 设置处理所有请求!
  • HandlerMapping,HandlerAdapter,Handler 需要加入到IoC容器,供DispatcherServlet调用!
  • Handler自己声明(Controller)需要配置HandlerMapping中供DispatcherServlet查找!
  1. 准备项目
  • 创建项目
    springmvc-base-quick
  • 导入依赖

web -> servlet
ioc -> spring-context
mvc -> spring-webmvc

<properties>
    <spring.version>6.0.6</spring.version>
    <servlet.api>9.1.0</servlet.api>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <!-- springioc相关依赖  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!-- web相关依赖  -->
    <!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 -->
    <!--
        在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API,因此在配置 DispatcherServlet 时需要使用
         Jakarta EE 提供的相应类库和命名空间。错误信息 “‘org.springframework.web.servlet.DispatcherServlet’
         is not assignable to ‘javax.servlet.Servlet,jakarta.servlet.Servlet’” 表明你使用了旧版本的
         Servlet API,没有更新到 Jakarta EE 规范。
    -->
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-web-api</artifactId>
        <version>${servlet.api}</version>
        <scope>provided</scope>
    </dependency>

    <!-- springwebmvc相关依赖  -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

</dependencies>
  • 模块转为maven/web
    1
    1

  • controller 声明

/**
 * @Description: handler -> springmvc/hello return "hello springmvc";
 */
@Controller
public class HelloController {

    // 对外访问的地址 到handlerMapping注册的注解
    @RequestMapping("springmvc/hello")
    // 直接返回字符串给前端,不用找视图解析器
    @ResponseBody
    public String hello(){
        System.out.println("HelloController.hello");
        // 返回给前端
        return "hello springmvc";
    }
}
  • SpringMVC 核心组件配置类
/**
 * @Description: 
 *      1. controller 配置IOC容器
 *      2. handlerMapping handlerAdapter 加入到IOC容器
 */
@Configuration
@ComponentScan("com.wake.controller")
public class MvcConfig {
    
    @Bean
    public RequestMappingHandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    
    @Bean
    public RequestMappingHandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }
}
  • SpringMVC 环境搭建
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

/**
 * @Description: 可以被web项目加载,会初始化IOC容器,会设置dispatcherServlet的地址
 */
public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    /**
     * 设置SpringMVC对应的配置
     * @return
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{MvcConfig.class};
    }

    /**
     * 配置SpringMVC内部自带servlet的访问地址
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
  • 测试
    • 配置tomcat 启动项目
      1

三、SpringMVC接收数据

3.1 访问路径设置

  • 原生servlet注解:
    • @WebServlet(“必须使用 / 打头”)
  • springmvc 注解:
    • @RequestMapping(“不必须使用 / 打头”)
    • user/login 或 /user/login

3.1.1 精准路径匹配

精准地址: /user/login

@Controller
public class UserController {

    @RequestMapping
    public void general(){

    }

    @RequestMapping("user/login")
    @ResponseBody
    public String login(){
        return "login";
    }

    @RequestMapping("user/register")
    @ResponseBody
    public String register(){
        return "register";
    }
}

3.1.2 模糊路径匹配

  • * 代表任意一层字符串
    • /user/*
      • /user/a
      • user/b
      • 不能是 /user/a/b
      • 如果想准确匹配两层,那么就写“/*/*”以此类推
  • ** 代表任意层任意字符串
    • /user/**
      • user
      • user/a
      • /user/a/b
      • user/a/b/c/d
    @RequestMapping("/user/*")
    public String general(){
        return "show";
    }

3.1.3 类和方法级别区别

  • 关于 类上和方法上添加 @RequestMapper
    • 类上提取通用的访问地址
    • 方法上是具体的handler地址
    • 访问 : 类地址 + 方法地址
@Controller
@RequestMapping("/user")
public class UserController {

    // 不写默认是直接使用 /user 地址
    @RequestMapping
    public String general(){
        return "show";
    }

    @RequestMapping("/login")
    @ResponseBody
    public String login(){
        return "login";
    }

    @RequestMapping("/register")
    @ResponseBody
    public String register(){
        return "register";
    }
}

3.1.4 附带请求方式限制

客户端 -> http(get | post | put | delete ) -> ds -> handler

HTTP 协议定义了八种请求方式,在 SpringMVC 中封装到了下面这个枚举类:

public enum RequestMethod {
  GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

默认情况下:@RequestMapping("/login") 地址正确,任何请求方式都可以访问。

如果需要特定指定:

  • method = RequestMethod.POST
  • method = {RequestMethod.POST,RequestMethod.GET}
@Controller
@RequestMapping("/user")
public class UserController {

    //多个用 {}
    @RequestMapping(method = {RequestMethod.POST,RequestMethod.GET})
    public String general(){
        return "show";
    }

    // 单个
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public String login(){
        return "login";
    }

    // 直接用注解
    @GetMapping("/register")
    @ResponseBody
    public String register(){
        return "register";
    }
}

不符合的请求方式:会出现 405 异常!

3.1.5 进阶注解 与 常见配置问题

@RequestMapping 的 HTTP 方法特定快捷方式变体:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

注意:
进阶注解只能用在handler方法上!不能添加到类上!

@RequestMapping("/login",method=RequestMethod.GET)
||
@GetMapping("/login")

报错:

There is already ‘demo03MappingMethodHandler’ bean method com.wake.mvc.handler.Demo03MappingMethodHandler#empGet() mapped.

原因:
多个 handler 方法映射了同一个地址,导致 SpringMVC 在接收到这个地址的请求时不知道该找哪个 handler 方法处理。

3.2 接收参数(重点)

3.2.1 param 和 json参数比较

  • param

    • 格式 字符串: “key = value & key = value”
    • 参数会被编码为 ASCII 码
      • name=john doe,则会被编码为 name=john%20doe
    • 参数没有顺序限制
    • 参数仅支持字符串类型、数值类型和布尔类型等简单数据类型
    • 参数不支持嵌套
  • json

    • {key:value,key:value}
    • 参数会被编码为 UTF-8
    • 键值对是有序排列,参数是有序的
    • JSON 类型的参数则支持更复杂的数据类型,如数组、对象等
    • 支持嵌套,可以传递更为复杂的数据结构

param 类型的参数适用于单一的数据传递,而 JSON 类型的参数则更适用于更复杂的数据结构传递。
.
在实际开发中,常见的做法是:
在 GET 请求中采用 param 类型的参数,
在 POST 请求中采用 JSON 类型的参数传递。

3.2.2 param参数接收

  • 1. 直接接值
@Controller
@RequestMapping("param")
public class ParamController {

    @GetMapping("data")
    @ResponseBody
    public String data(String name,int age){
        System.out.println("name : " + name+"age : " +age);
        return "name : " + name+"age : " +age;
    }
 }

http://localhost:8080/param/data?age=0&name=haha

  1. 参数 地址 名称相同
  2. 可以不传递 包装类不报错是直接为Null

包装类参数可以为空,简单数据类型不能为空会报错(500)

Request processing failed: java.lang.IllegalStateException: Optional int parameter ‘age’ is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
请求处理失败:java.lang.IllegalStateException:可选的 int 参数“age”存在,但由于被声明为基元类型,因此无法转换为 null 值。请考虑将其声明为相应基元类型的对象包装器。

1


  • 2.@RequestParam注解
    @GetMapping("data1")
    @ResponseBody
    public String data1(@RequestParam(value = "account") String username,
                        @RequestParam(required = false,defaultValue = "1") int pwd){
        System.out.println(username + " , "+ pwd);
        return username + " , "+ pwd;
    }
  • value = "account" 设置传值地址名字为account,输入别的报错(400)
  • required = false 设置当前参数 非必需 (默认是必须{TRUE}
  • defaultValue = "1" 默认值为1
    1
    400 必须传递数值的参数 没有传递数值
    1

  • 3.特殊场景接值
  1. 集合 多值 ?hbs=A&hbs=B
    参数前需要加注解 不然会报错
    @GetMapping("data2")
    @ResponseBody
    public String data2(@RequestParam List<String> hbs){
        System.out.println("hbs : "+hbs);
        return "ok!";
    }

1
2
2. 实体类参数

    @GetMapping("data3")
    @ResponseBody
    public String data3(User user){
        System.out.println("user : "+user);
        return user.toString();
    }

1
实体类 需要对应属性的setget方法 ->
实体类属性名、形参与地址实参 名字要相同
1

3.2.3 路径 参数接收

1

@Controller
@RequestMapping("path")
@ResponseBody
public class PathController {

    /*
    * path/账号/密码
    *   必须使用@PathVariable
    * */

    @RequestMapping("{account}/{password}")
    public String login(@PathVariable(value = "account") String username,
                        @PathVariable String password){
        System.out.println(username + " , " +password);
        return username + " , " +password;
    }
}

1
必须写完整格式:否则404
1

3.2.4 json参数接收

报错: 415 不支持数据类型
1
1

原因:

JAVA原生API , 只支持路径参数和param参数 request.getParameter(“key”); param 不支持json
json 是前端格式

解决:

  1. 导入JSON处理的依赖
  2. handlerAdapter配置json转换器 (MvcConfig配置类中添加注解
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.15.0</version>
        </dependency>
@EnableWebMvc   // HandlerAdapter配置JSON转换器

1
success!!
在这里插入图片描述

3.3 接收Cookie数据

@Controller
@ResponseBody
@RequestMapping("cookie")
public class CookieController {

	// 获取cookie
    @RequestMapping("data")
    public String data(@CookieValue("cookieName") String value){
        System.out.println("cookie : " + value);
        return value;
    }

	// 创建一个cookie
    @GetMapping("cooking")
    public String cookie(HttpServletResponse response){
        Cookie cookie = new Cookie("cookieName", "wake");
        response.addCookie(cookie);
        return "OK!";
    }
}

先创建一个cookie
1
再获取cookie
在这里插入图片描述

3.4 接收请求头数据

@Controller
@ResponseBody
@RequestMapping("header")
public class HeaderController {

    @RequestMapping("data")
    public String header(@RequestHeader("Host") String host){
        System.out.println("host" + host);
        return "host" + host;
    }
}

1

3.5 原生Api对象操作

SpringMVC 官方文档 原生API 操作指南

Controller method argument 控制器方法参数Description
jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse请求/响应对象
jakarta.servlet.http.HttpSession强制存在会话。因此,这样的参数永远不会为 null
java.io.InputStream, java.io.Reader用于访问由 Servlet API 公开的原始请求正文。
java.io.OutputStream, java.io.Writer用于访问由 Servlet API 公开的原始响应正文。
@PathVariable接收路径参数注解
@RequestParam用于访问 Servlet 请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。
@RequestHeader用于访问请求标头。标头值将转换为声明的方法参数类型。
@CookieValue用于访问Cookie。Cookie 值将转换为声明的方法参数类型。
@RequestBody用于访问 HTTP 请求正文。正文内容通过使用 HttpMessageConverter 实现转换为声明的方法参数类型。
java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap共享域对象,并在视图呈现过程中向模板公开。
Errors, BindingResult验证和数据绑定中的错误信息获取对象!
/**
 * 如果想要获取请求或者响应对象,或者会话等,可以直接在形参列表传入,并且不分先后顺序!
 * 注意: 接收原生对象,并不影响参数接收!
 */
@Controller
public class ApiController {

    //方案二 :  servletContext 会自动装入到IOC容器 直接全局注入
    @Autowired // ioc容器获取对应类型实体对象(组件) 并且 自动装配
    private ServletContext servletContext;

    public void data1(HttpServletRequest request,
                      HttpServletResponse response,
                      HttpSession session){

        //使用原生对象就可以使用相应方法
        //servletContext [ 1. 最大的配置文件 2.全局最大共享域 3.核心API getRealPath ]
        //方案一 : request 获取 session 获取
        ServletContext servletContext = request.getServletContext();
        ServletContext servletContext1 = session.getServletContext(); 
    }
}

3.6 共享域对象操作

1
一个 requset 请求的数据 可以存放在公共空间 其他request可以拿数据进行相应操作

3.6.1 属性(共享)域作用回顾

在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。
常见的共享域有四种:ServletContextHttpSessionHttpServletRequestPageContext

  1. ServletContext 共享域:
    • ServletContext 对象可以在整个 Web 应用程序中共享数据,是最大的共享域。
    • 一般可以用于保存整个 Web 应用程序的全局配置信息,以及所有用户都共享的数据。
    • ServletContext 中保存的数据是线程安全的。
  2. HttpSession 共享域:
    • HttpSession 对象可以在同一用户发出的多个请求之间共享数据,但只能在同一个会话中使用。
    • 比如,可以将用户登录状态保存在 HttpSession 中,让用户在多个页面间保持登录状态。
  3. HttpServletRequest 共享域:
    • HttpServletRequest 对象可以在同一个请求的多个处理器方法之间共享数据。
    • 比如,可以将请求的参数和属性存储在 HttpServletRequest 中,让处理器方法之间可以访问这些数据。
  4. PageContext 共享域:
    • PageContext 对象是在 JSP 页面Servlet 创建时自动创建的。
    • 它可以在 JSP 的各个作用域中共享数据,包括pageScoperequestScopesessionScopeapplicationScope 等作用域。

同一 Web 应用程序的多个组件之间传递数据,并且可以将数据保存在不同的共享域中,根据需要进行选择和使用。

3.6.2 Request级别属性(共享)域

用原生API就好了!

  1. 使用原生 request 对象
@RequestMapping("/attr/request/original")
@ResponseBody
public String testAttrOriginalRequest(
    
        // 拿到原生对象,就可以调用原生方法执行各种操作
        HttpServletRequest request) {
    
    request.setAttribute("requestScopeMessageOriginal", "i am very happy[original]");
    
    return "target";
}
  1. 使用 Model 类型的形参
@RequestMapping("/attr/request/model")
@ResponseBody
public String testAttrRequestModel(
    
        // 在形参位置声明Model类型变量,用于存储模型数据
        Model model) {
    
    // 我们将数据存入模型,SpringMVC 会帮我们把模型数据存入请求域
    // 存入请求域这个动作也被称为暴露到请求域
    model.addAttribute("requestScopeMessageModel","i am very happy[model]");
    
    return "target";
}
  1. 使用 ModelMap 类型的形参
@RequestMapping("/attr/request/model/map")
@ResponseBody
public String testAttrRequestModelMap(
    
        // 在形参位置声明ModelMap类型变量,用于存储模型数据
        ModelMap modelMap) {
    
    // 我们将数据存入模型,SpringMVC 会帮我们把模型数据存入请求域
    // 存入请求域这个动作也被称为暴露到请求域
    modelMap.addAttribute("requestScopeMessageModelMap","i am very happy[model map]");
    
    return "target";
}
  1. 使用 Map 类型的形参
@RequestMapping("/attr/request/map")
@ResponseBody
public String testAttrRequestMap(
    
        // 在形参位置声明Map类型变量,用于存储模型数据
        Map<String, Object> map) {
    
    // 我们将数据存入模型,SpringMVC 会帮我们把模型数据存入请求域
    // 存入请求域这个动作也被称为暴露到请求域
    map.put("requestScopeMessageMap", "i am very happy[map]");
    
    return "target";
}
  1. 使用 ModelAndView 对象
@RequestMapping("/attr/request/mav")
public ModelAndView testAttrByModelAndView() {
    
    // 1.创建ModelAndView对象
    ModelAndView modelAndView = new ModelAndView();
    // 2.存入模型数据
    modelAndView.addObject("requestScopeMessageMAV", "i am very happy[mav]");
    // 3.设置视图名称
    modelAndView.setViewName("target");
    
    return modelAndView;
}

3.6.3 Session级别属性(共享)域

@RequestMapping("/attr/session")
@ResponseBody
public String testAttrSession(HttpSession session) {
    //直接对session对象操作,即对会话范围操作!
    return "target";
}

3.6.4 Application级别属性(共享)域

springmvc会在初始化容器的时候,将servletContext对象存储到ioc容器中!

@Autowired
private ServletContext servletContext;

@RequestMapping("/attr/application")
@ResponseBody
public String attrApplication() {
    
    servletContext.setAttribute("appScopeMsg", "i am hungry...");
    
    return "target";
}

总结

1

@EnableWebMvc 原理

@EnableWebMvc注解效果等同于在 XML 配置中,可以使用 <mvc:annotation-driven> 元素
在这里插入图片描述
@EnableWebMvc
帮助我们添加 :
HandlerMappingHandlerAdapter 以及给这两个都加入到IOC容器和添加上了json转换器
1
源码:
1
1

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

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

相关文章

Vulnhub内网渗透Jangow01靶场通关

详细请见个人博客 靶场下载地址。 下载下来后是 .vmdk 格式&#xff0c;vm直接导入。 M1请使用UTM进行搭建&#xff0c;教程见此。该靶场可能出现网络问题&#xff0c;解决方案见此 信息搜集 arp-scan -l # 主机发现ip为 192.168.168.15 nmap -sV -A -p- 192.168.168.15 # 端…

python的虚拟环境

python的虚拟环境可以为项目创建一个独立的环境&#xff0c;能够解决使用不同版本依赖给项目带来冲突的麻烦。创建虚拟环境的方式有很多种&#xff0c;pipenv会自动帮你管理虚拟环境和依赖文件&#xff0c;并且提供了一系列命令和选项来帮忙你实现各种依赖和环境管理相关的操作…

【动态规划.3】[IOI1994]数字三角形 Number Triangles

题目 https://www.luogu.com.cn/problem/P1216 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 7→3→8→7→5 的路径产生了最大权值。 分析 这是一个动态规划…

VMware虚拟机

1、虚拟机介绍 虚拟机&#xff08;Virtual Machine&#xff09;是一种软件&#xff0c;可以用来模拟具有完整硬件功能的完整的计算机系统的软件&#xff0c;并且可以和主机环境隔离开&#xff0c;互不影响。也就是&#xff0c;在实体计算机中能够完成的工作都可以通过虚拟机实…

哨兵系列数据下载(哨兵2号Sentinel-2下载)

目录 一、介绍 二、哨兵二号介绍 三、数据下载 1、注册账号 2、数据下载 3、相关问题 四、数据预处理 1、大气校正 2、重采样 五、其他问题 一、介绍 哨兵&#xff0d;1卫星是全天时、全天候雷达成像任务&#xff0c;用于陆地和海洋观测&#xff0c;首颗哨兵&#xf…

Python PyQt5 多Tab demo

参考&#xff1a; https://cloud.tencent.com/developer/news/388937 importsysfromPyQt5.QtWidgetsimportQVBoxLayout,QWidget,QFormLayout,QHBoxLayout,QLineEdit,QRadioButton,QCheckBox,QLabel,QGroupBox,QApplication,QTabWidgetclassTabDemo(QTabWidget):def__init__(se…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

OpenCASCADE+Qt创建建模平台

1、建模平台效果 2、三维控件OCCWidget 将V3d_View视图与控件句柄绑定即可实现3d视图嵌入Qt中&#xff0c;为了方便也可以基于QOpenGLWidget控件进行封装&#xff0c;方便嵌入各种窗体使用并自由缩放。 #ifndef OCCTWIDGET_H #define OCCTWIDGET_H#include <QWidget> #i…

云轴科技ZStack荣获证券基金行业信息技术应用创新联盟年度优秀成员奖

近日&#xff0c;由中国证监会科技监管司、上海市经济和信息化委员会及上交所理事会科技发展委员会指导&#xff0c;证券基金行业信息技术应用创新联盟&#xff08;简称信创联盟&#xff09;主办的2023年年度工作会议在上海成功举办。会议汇聚了来自监管机构、政府机构、行业侧…

继深圳后,重庆与鸿蒙展开原生应用开发合作

截至2023年底&#xff0c;开源鸿蒙开源社区已有250多家生态伙伴加入&#xff0c;开源鸿蒙项目捐赠人达35家&#xff0c;通过开源鸿蒙兼容性测评的伙伴达173个&#xff0c;累计落地230余款商用设备&#xff0c;涵盖金融、教育、智能家居、交通、数字政府、工业、医疗等各领域。 …

this.$set,更新vue视图

this.$set(this.searchForm, age, 30) // 对象 this.$set(this.searchForm1, 0, { name: 汪汪, age: 11, content: 擅长口算 })// 数组

Android使用WebView打开外部网页链接

发布Android应用&#xff0c;除了用原生开发外&#xff0c;更多是采用内嵌H5网页的方式来做&#xff0c;便于更新以及多平台使用。 一、第一种方式是直接通过WebView打开外部H5链接。 新建Android工程 直接创建一个工程&#xff0c;点击运行就可以了&#xff0c;打开是个空页…

STM32(14)USART

USART:一种片上外设&#xff0c;用来实现串口通信&#xff0c;就是stm32内部的串口 USART简介 串并转换电路 串行通信和并行通信 串行&#xff1a;一根数据线&#xff0c;逐个比特位发送 为什么要串并转换 移位寄存器 USART的基本模型 通过查询SR&#xff08;状态寄存器&…

加速大模型落地:火山引擎向量数据库的实践应用

近两年随着大模型技术的快速发展&#xff0c;图片、视频、自然语言等多模态、非结构化数据的查找需求变大&#xff0c;非结构化数据的量级也远大于结构化数据&#xff0c;传统数据库已经无法满足如此多样化数据的处理需求。向量数据库以其海量的数据存储规模、高效的计算查询能…

并发安全问题(超卖问题)

一&#xff0c;问题解析 超买问题就是&#xff0c;原本库存中有200件库存&#xff0c;结果由于并发问题售出了300件这就是炒卖问题对于买东西无非就是 查询商品&#xff0c;判断库存是否充足&#xff0c;如果充足则下单成功。 这里采用的是先查询&#xff0c;再判断&#xff0c…

复杂业务场景下,如何优雅的使用设计模式来优化代码?

1、引言 本文以一个实际案例来介绍在解决业务需求的路上&#xff0c;如何通过常用的设计模式来逐级优化我们的代码&#xff0c;以把我们所了解的到设计模式真实的应用于实战。 2、背景 假定我们现在有一个订单流程管理系统&#xff0c;这个系统对于用户发起的一笔订单&#…

MyBatis-Plus如何娴熟运用乐观锁

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MyBatis-Plus如何娴熟运用乐观锁 前言乐观锁的基本概念基本概念和原理&#xff1a;为何乐观锁是解决并发问题的有效手段&#xff1a; MyBatis-Plus中乐观锁的支持1. Version 注解&#xff1a;2. 配置乐…

穿越牛熊,股市的春天还有多远?

2023年&#xff0c;资本市场的严冬令无数投资者和机构投资者都感受到了前所未有的压力。VC/PE、公募基金、股权投资类公司等机构&#xff0c;在这一年里业绩普遍不佳&#xff0c;寒意弥漫。VC/PE机构的营业收入普遍呈现负增长&#xff0c;公募基金更是历史上首次连续两年亏损&a…

包含字母数字及特殊字符 三种组合的正则两种写法

//长度8~16位&#xff1b;包含字母、数字及特殊字符 #$%^&*_-//正则1 写法&#xff1a;let reg_1 /^(?![A-Za-z0-9]$)^(?![A-Za-z#$\%^&*_\-]$)^(?![0-9#$\%^&_*\-]$)([A-Za-z0-9#$\%^&*_\-]{8,16})$///正则2 写法&#xff1a;let reg_2 /^(?![A-Za-z#$%…

在Vue中处理接口返回的二进制图片数据

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…