SpringBoot框架学习笔记(五):静态资源访问、Rest风格请求处理、配置视图解析器、接收参数的相关注解详解

news2024/11/15 7:49:23

1 WEB开发-静态资源访问

1.1 基本介绍

(1)只要静态资源放在类路径的以下目录:/static、/public、/resources、/META-INF/resources 可以被直接访问。maven项目的类路径即为main/resources目录--对应SpringBoot源码为WebProperties.java类

(2)常见静态资源:JS、CSS、图片、字体文件(Fonts)等

(3)访问方式默认为:项目根路径/ + 静态资源名。比如 http://localhost:8080/hi.jpg --对应SpringBoot源码为WebMvcProperties.java类

1.2 快速入门

(1)在resources目录下创建相关静态资源目录,并放入测试图片

(2)创建并启动主程序 

package com.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

(3)浏览器输入网址进行测试: 

  • localhost:8080/1.png

  • localhost:8080/2.png

  • localhost:8080/3.png

  • localhost:8080/4.png

1.3 注意事项 

(1)静态资源访问原理:静态映射是/**,也就是对所有请求进行拦截,请求进来,会先看Controller 能不能处理,不能处理的请求就会交给静态资源处理器,如果静态资源也找不到则响应404页面

(2) 改变静态资源访问前缀,比如如果希望 localhost:8080/wwj/1.png 去请求静态资源。应用场景:静态资源访问前缀和控制器请求路径冲突

设置方式如下

  • 在类路径,即main/resources目录下,新建文件 application.yml
spring:
  mvc:
    static-path-pattern: /wwj/**
  • 重启应用,完成测试,浏览器输入: localhost:8080/wwj/1.png

(3)改变默认的静态资源路径,比如希望在类路径下增加wwjimg目录作为静态资源路径

  •  修改 application.yml 即可
spring:
  mvc:
    # 修改静态资源访问前缀
    static-path-pattern: /wwj/**
  web:
    resources:
      # 添加静态资源路径
      static-locations: 
        - "classpath:/META-INF/resources/"
        - "classpath:/resources/"
        - "classpath:/static/"
        - "classpath:/public/"
        - "classpath:/wwjimg/"

2 Rest风格请求处理

2.1 基本介绍

(1)Rest风格支持:使用HTTP请求方式动词来表示对资源的操作

(2)举例说明:

  • 请求方式:/monster
  • GET-获取怪物
  • DELETE-删除怪物
  • PUT-修改怪物
  • POST-添加怪物

2.2 SpringBoot Rest风格应用实例

需求:演示 SpringBoot 中如何实现Rest风格的增删改查

(1)创建MonsterController.java,模拟四种请求方式

package com.springboot.controller;

import org.springframework.web.bind.annotation.*;

@RestController
public class MonsterController {

    //以下写法等价于 @RequestMapping(value = "/monster", method = RequestMethod.GET)
    @GetMapping("/monster")
    public String getMonster(){
        return "GET-查询妖怪";
    }

    @PostMapping("/monster")
    public String addMonster(){
        return "POST-添加妖怪";
    }

    @PutMapping("/monster")
    public String putMonster(){
        return "PUT-修改妖怪";
    }

    @DeleteMapping("/monster")
    public String deleteMonster(){
        return "DELETE-删除妖怪";
    }
}

(2)使用postman 工具进行测试,分别用这四种方式请求/monster

 

2.3 注意事项

(1)客服端是PostMan 可以直接发送Put、Delete等方式请求,可不设置Filter

(2)如果要 SpringBoot 支持表单的 Rest 功能,需要注意如下细节

  • Rest风格请求核心Filter是 HiddenHttpMethodFilter,表单请求会被 HiddenHttpMethodFilter 拦截,获取到表单_method的值,再判断是PUT/DELETE/PATCH(PATCH方法是新引入的,是对PUT方法的补充,用来对已知资源进行局部更新)
  • 如果要 SpringBoot 支持表单的 Rest 功能,需要在application.yml启动filter功能
spring:
  mvc:
    # 修改静态资源访问前缀
    static-path-pattern: /wwj/**
    hiddenmethod:
      filter:
        # 开启页面表单的 Rest 功能
        enabled: true

3 配置视图解析器

3.1 @ResponseBody

思考:为什么上面案例中 return "GET-查询妖怪",返回的是字符串,而不是转发到对应的资源文件?

这是因为我们在类上加了一个 @RestController 注解,这个注解是一个复合注解,含有 @ResponseBody,所以springboot底层(springmvc),在处理 return "xxx" 时,会以 @ResponseBody 注解进行解析处理,即返回字符串"xxx",而不会使用视图解析器来处理。如果把 @RestController 改成 @Controller,当你访问getMonster()时,如果存在 xxx.html 就会转发到 xxx.html,如果不存在就会报404

3.2 在 application.yml 配置视图解析器

(1)在 application.yml 配置视图解析器

spring:
  mvc:
    # 修改静态资源访问前缀
    static-path-pattern: /wwj/**
    hiddenmethod:
      filter:
        # 开启页面表单的 Rest 功能
        enabled: true
    # 配置视图解析器
    view:
      # 后缀
      suffix: .html
      # 前缀
      prefix: /wwj/ # 这里需要注意 prefix 需要和当前的 static-path-pattern一致

 (2)修改 MonsterController.java

把 @RestController 注解替换为 @Controller 注解

//@RestController
@Controller
public class MonsterController {

在 MonsterController.java 中新增一个方法来测试视图解析器。该方法进行转发的时候,如果没有配置视图解析器,就会看controller 有没有 /hello;如果配置了视图解析器,就按照视图解析器来定位,这时候如果想要在控制器方法之间进行请求转发,可以这样写return "forward:/hello"

@RequestMapping("/go")
public String go() {
    return "hello";
}

(3)在resources/public 创建静态页面 hello.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
</head>
<body>
  <h1>hello,springboot</h1>
</body>
</html>

(4)启动主程序,在浏览器输入 http://localhost:8080/go 进行测试,测试效果如下

4 接收参数的相关注解 

4.1 基本介绍

(1)SpringBoot 接收客户端提交数据/参数会使用到的相关注解

(2)详解 @PathVariable、@RequestHeader、@RequestParam、@CookieValue、@RequestBody。这些注解在springmvc中均有提及。SpringBoot的新注解有@RequestAttribute、@SessionRequest

4.2 应用实例 

需求:演示各种方式提交数据/参数给服务器,服务器如何使用注解接收

在 resources/public 目录下创建静态页面 index.html 用来提交数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<h1>接收参数的相关注解演示</h1>
<hr/>
<a href="/monster/100/king">@PathVariable-路径变量 monster/100/king</a><br><br>
</body>
</html>

在controller 下创建 ParameterController.java 来接收数据

package com.springboot.controller;

import org.springframework.web.bind.annotation.RestController;

@RestController
public class ParameterController {
}

4.2.1 @PathVariable

(1)在index.html 中加入超链接

<a href="/monster/100/king">@PathVariable-路径变量 monster/100/king</a><br><br>

路径说明:href="/monster/100/king"  中的 / 在浏览器中进行解析,和被解析成 ip+端口,整体就是http://lcoalhost:8080/monster/100/king。如果不加 /,写成 monster/100/king 就会在前面加上当前页面的路径,即 http://lcoalhost:8080/wwj/monster/100/king。(wwj 是我们前面在application.yml 文件中配置的静态资源访问前缀

(2)在 ParameterController.java 中增加方法

// 超链接默认请求方式为get
@GetMapping("/monster/{id}/{name}")
public String pathVariable(@PathVariable("id") Integer monsterId,
                           @PathVariable("name") String monsterName,
                           @PathVariable Map<String,String> map) {
    System.out.println("monsterId=" + monsterId);
    System.out.println("monsterName=" + monsterName);
    System.out.println("map=" + map);
    return "success";
}

解读: 

  • /monster/{id}/{name} 构成完整请求路径,{id}、{name}就是占位变量
  • @PathVariable("name"): 这里的 name 需要和 {name} 命名保持一致
  • String monsterName 这个形参名可以自己定义
  • @PathVariable Map<String,String> map 会把所有传递的值都传入map,key为占位变量名,即id、name

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

点击后效果如下

控制台输出:

4.2.2 @RequestHeader

@RequestHeader 可以用来获取请求头的信息,可获取的信息如下

(1)在index.html 中加入超链接

<a href="/requestHeader">@RequestHeader-获取Http请求头</a><br><br>

(2)在 ParameterController.java 中增加方法

@GetMapping("/requestHeader")
public String requestHeader(@RequestHeader("Host") String host,
                            @RequestHeader Map<String, String> map){
    System.out.println("Host =" + host);
    System.out.println("以下是http请求头的 所有信息");
    for (Map.Entry<String, String> o : map.entrySet()) {
        System.out.println(o.getKey() + ": " + o.getValue());
    }

    return "success";
}

解读

  • @RequestHeader("Host") 获取http请求头的 host 信息,即主机ip+端口
  • @RequestHeader Map<String, String> map 获取http请求头的 所有信息

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

点击后控制台输出 

4.2.3 @RequestParam

(1)在index.html 中加入超链接

<a href="/hi?name=孙悟空&fruit=apple&fruit=pear">@RequestParam-获取请求参数</a><br><br>

(2)在 ParameterController.java 中增加方法

@GetMapping("/hi")
public String hi(@RequestParam(value = "name", required = false) String userName,
                 @RequestParam("fruit") List<String> fruits,
                 @RequestParam Map<String,String> map){
    System.out.println("userName = " + userName);
    System.out.println("fruits = " + fruits);
    System.out.println("map = " + map);
    return "success";
}

代码解读:

  • @RequestParam(value = "name", required = false) 拿到参数名为 name 的请求参数, 
  • required = false 表示这个参数不是必须要有的,如果没有传这个参数过来也不会报错,默认为true
  • @RequestParam("fruit") 拿到参数名为 fruit 的请求参数,因为该参数名的参数有多个,所以要用集合来接收
  • @RequestParam Map<String,String> map 可以获取到所有的请求参数,但需要注意的是,如果有多个同名参数,只会得到第一个

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

点击后控制台输出

4.2.4 @CookieValue

(1)在index.html 中加入超链接

<a href="/cookie">@CookieValue-获取cookie值</a><br><br>

(2)在 ParameterController.java 中增加方法

@GetMapping("/cookie")
public String cookie(@CookieValue(value = "cookie_key", required = false) String cookie_value,
                     @CookieValue(value = "username", required = false) Cookie cookie,
                     HttpServletRequest request){
    System.out.println("cookie_value = " + cookie_value);
    System.out.println("cookie对象 - cookie名字:" + cookie.getName() + " -  cookie值:" + cookie.getValue());

    // 这里也可以使用原生的方式的方式获取到cookie
    System.out.println("----------------");
    Cookie[] cookies = request.getCookies();
    for (Cookie c : cookies) {
        System.out.println(c.getName() + "=" + c.getValue());
    }

    return "success";
}

代码解读

  • @CookieValue(value = "cookie_key", required = false),表示接收名字为cookie_key的cookie
  • 如果浏览器携带来了对应的cookie,要是后面的形参类型为 String,则接收到的是对应的 value 值
  • 要是后面的形参类型为 Cookie,则接收到的是封装好的对应的 Cookie 对象
  • 也可以使用原生的方式获取到cookie,使用HttpServletRequest 对象的 getCookies()方法

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

由于浏览器目前没有cookie,如果要测试,可以手动在浏览器设置对应的cookie,步骤如下

在当前页面点击 F12 进入开发者模式

设置好后刷新当前页面,点击最后一条链接进行测试,点击后控制台输出如下 

4.2.5 @RequestBody

在 SpringMVC 中  @RequestBody 可以将提交的json字符串数据填充给指定Javabean。在SpringBoot 该注解新增了一个功能,可以整体取出Post请求内容,这里先介绍这个功能。而填充指定Javabean的功能在后面自定义对象参数里面进行了回顾

(1)在index.html 中加入超链接

<h1>测试@RequestBody获取数据: 获取POST请求体</h1>
<form action="/save" method="post">
    姓名: <input name="name"/><br/>
    年龄: <input name="age"/><br/>
    <input type="submit" value="提交">
</form>

(2)在 ParameterController.java 中增加方法

/**
 * @RequestBody 是整体取出Post请求内容
 */
@PostMapping("/save")
public String postMethod(@RequestBody String content){
    System.out.println("content: " + content);
    return "success";
}

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

点击提交后控制台输出如下

4.2.6 @RequestAttribute 和 @SessionAttribute

 @RequestAttribute用来获取 request 域属性,@SessionAttribute用来获取session域属性(使用原生的 Servlet api 同样可以获取)

(1)在index.html 中加入超链接

<br><br><a href="/login">@RequestAttribute 和 @SessionAttribute-分别获取request域和session域属性</a>

(2)创建RequestController.java,向 request 域中添加数据

package com.springboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttribute;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

@Controller
public class RequestController {

    @GetMapping("/login")
    public String login(HttpServletRequest request){
        // 向request域中添加了数据
        request.setAttribute("user","小王");
        // 向 session 域中添加数据
        request.getSession().setAttribute("website", "http://www.baidu.com");
        //告诉 Spring MVC 你希望进行请求转发,而不是视图解析
        return "forward:/ok"; //请求转发到 /ok
    }

    @GetMapping("/ok")
    @ResponseBody
    public String ok(
            @RequestAttribute(value = "user", required = false) String username,
            HttpServletRequest request,
            @SessionAttribute(value = "website", required = false) String website,
            HttpSession session){
        // 获取到request域中的数据
        System.out.println("username=" + username);
        System.out.println("通过servlet api 获取 username = " + request.getAttribute("user"));
        // 获取到session域中的数据
        System.out.println("website=" + website);
        System.out.println("通过servlet api 获取 website =" + session.getAttribute("website"));
        return "success";
    }
}

(3)启动主程序,在浏览器输入 localhost:8080/wwj/index.html 进行测试,效果如下

点击后控制台输出如下

4.3 复杂参数

4.3.1 基本介绍

(1)SpringBoot在响应客户端请求时,也支持复杂参数,例如:Map、Model、Error/BindingResult、RedirectAttributes、ServletResponse、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder、HttpSession。重要的有Map、ModelServletResponse

(2)Map、Model 数据会被放到request域

(3)RedirectAttributes 表示重定向携带数据

4.3.2 复杂参数应用实例 

需求说明:

  • 测试Map、Model 数据会被放到request域 
  • 演示创建cookie,并通过 response 添加到浏览器/客户端

(1)在 RequestController.java 增加方法

// 响应一个注册请求
@GetMapping("/register")
public String register(Map<String, Object> map,
                       Model model,
                       HttpServletResponse response){
    // 这些形参表示如果发过来一个注册请求,会将注册数据封装到map或model
    // map 和 model 中的数据,会被放入request域中
    map.put("user","wwj");
    map.put("job","开发工程师");
    model.addAttribute("sal", 80000);

    //演示创建cookie,并通过 response 添加到浏览器/客户端
    Cookie cookie = new Cookie("email", "wwj@qq.com");
    response.addCookie(cookie);
    // 请求转发
    return "forward:/registerOk";
}

@ResponseBody
@GetMapping("/registerOk")
public String registerOk(HttpServletRequest request){
    System.out.println("user=" + request.getAttribute("user"));
    System.out.println("job=" + request.getAttribute("job"));
    System.out.println("sal=" + request.getAttribute("sal"));
    return "success";
}

(2)启动主程序,在浏览器直接输入 localhost:8080/register 进行测试,控制台输出如下。成功从request中获取到了 map 和 model 的值

在浏览器按下F12 打开开发者模式,可以看到成功获取到了cookie 

 

4.4 自定义对象参数 javabean -自动封装

4.4.1 基本介绍

(1)SpringBoot在响应客户端/浏览器请求时,有支持自定义对象参数

(2)自动完成类型转换与格式化,并支持级联封装

4.4.2 应用实例

需求说明:演示自定义对象参数使用,完成自动封装,类型转换

代码实现:

(1)创建实体类 Car.java 和 Monster.java

package com.springboot.entity;

import lombok.Data;
import org.springframework.stereotype.Component;


@Data
@Component
public class Car {
    private String name;
    private Double price;
}
package com.springboot.entity;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.util.Date;

@Data
@Component
public class Monster {
    private Integer id;
    private String name;
    private Integer age;
    private Boolean isMarried;
    private Date birth;
    private Car car;
}

(2)在resources/public 目录下新建静态html文件,save.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加妖怪</title>
</head>
<body>
<h1>添加妖怪(测试封装POJO)</h1>
<form action="/saveMonster" method="post">
    编号: <input name="id" value="100"><br/>
    姓名: <input name="name" value="牛魔王"><br/>
    年龄: <input name="age" value="500"><br/>
    婚否: <input name="isMarried" value="true"><br/>
    生日: <input name="birth" value="2000/11/11"><br/>
    坐骑名称: <input name="car.name" value="法拉利"><br/>
    坐骑价格: <input name="car.price" value="1000000"><br/>
    <input type="submit" value="保存">
</form>
</body>
</html>

(3)修改 ParameterController.java 增加方法

// 添加monster
@PostMapping("/saveMonster")
public String saveMonster(Monster monster) {
    System.out.println("monster-" + monster);
    return "success";
}

(4)启动主程序,在浏览器输入 localhost:8080/wwj/save.html 进行测试,效果如下

 

点击保存后控制台输出如下 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx如何开启优先访问压缩文件

nginx输出gzip有很多条件&#xff1a; 开启了gzip&#xff1a;gzip on;gzip_types定义了content-type&#xff0c;需要注意的是text/html是强制性的&#xff0c;不需要也不能再添加这个响应输出的content-type在gzip_types里输出的content-length大于等于nginx配置的gzip_min_…

【TypeScript 一点点教程】

文章目录 一、开发环境搭建二、基本类型2.1 类型声明2.2 基本类型 三、编译3.1 tsc命令3.2 tsconfig.json3.2.1 基本配置项includeexcludeextendsfiles 3.2.2 compilerOptions编译器的配置项 四、面向对象4.1 类4.2 继承4.3 抽象类4.4 接口 一、开发环境搭建 下载Node.js《Nod…

操作系统——进程与线程(死锁)

1&#xff09;为什么会产生死锁&#xff1f;产生死锁有什么条件&#xff1f; 2&#xff09;有什么办法解决死锁&#xff1f; 一、死锁 死锁:多个程序因竞争资源而造成的一种僵局&#xff08;互相等待对方手里的资源&#xff09;&#xff0c;使得各个进程都被阻塞&#xff0c;…

02.C++入门基础(下)

1.函数重载 C支持在同一作用域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者类型不同。这样C函数调用就表现出了多态行为&#xff0c;使用更灵活。C语言是不支持同一作用域中出现同名函数的。 1、参数类型不同 2、参数个数不同…

volatile,最轻量的同步机制

目录 一、volatile 二、如何使用&#xff1f; 三、volatile关键字能代替synchronized关键字吗&#xff1f; 四、总结&#xff1a; 还是老样子&#xff0c;先来看一段代码&#xff1a; 我们先由我们自己的常规思路分析一下代码&#xff1a;子线程中&#xff0c;一直循环&…

DocRED数据集

DocRED数据集文件夹包含多个JSON文件&#xff0c;每个文件都有不同的用途。以下是这些文件的用途解释以及哪个文件是训练集&#xff1a; 文件解释 dev.json&#xff1a;包含开发集&#xff08;验证集&#xff09;的数据&#xff0c;通常用于模型调优和选择超参数。 label_map…

java面向对象进阶进阶篇--《包和final》

一、前言 今天还是面向对象相关知识点的分享&#xff0c;包是写小型项目时不可或缺的存在&#xff0c;final关键字用的地方不算太多。idea会提示我们导包&#xff0c;有时会自动导包&#xff0c;确实十分方便。但是我们也不能不会自己去导包。 面向对象篇不出意外的话本周就要…

【线性代数】矩阵变换

一些特殊的矩阵 一&#xff0c;对角矩阵 1&#xff0c;什么是对角矩阵 表示将矩阵进行伸缩&#xff08;反射&#xff09;变换&#xff0c;仅沿坐标轴方向伸缩&#xff08;反射&#xff09;变换。 2&#xff0c;对角矩阵可分解为多个F1矩阵&#xff0c;如下&#xff1a; 二&a…

python打包exe文件-实现记录

1、使用pyinstaller库 安装库&#xff1a; pip install pyinstaller打包命令标注主入库程序&#xff1a; pyinstaller -F.\程序入口文件.py 出现了一个问题就是我在打包运行之后会出现有一些插件没有被打包。 解决问题&#xff1a; 通过添加--hidden-importcomtypes.strea…

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全…

【Vue3】工程创建及目录说明

【Vue3】工程创建及目录说明 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日…

全网最全最详细的C++23 标准详解:核心语言改进与新特性

1. 简介 C23 是由 C 标准委员会最新发布的标准&#xff0c;旨在进一步提升 C 语言的功能和开发效率。作为一项重要的编程语言标准更新&#xff0c;C23 引入了多个关键的新特性和改进&#xff0c;使开发者能够编写更高效、简洁和安全的代码。 与 C20 相比&#xff0c;C23 的变…

3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 迪杰斯特拉&#xff08;Dijkstra&#xff09;算法 解题思路 解题过…

C++学习指南(三)——模板

欢迎来到繁星的CSDN。本期内容主要包括模板template。 目录 一、什么是模板&#xff1f; 二、函数模板 模板的定义方式 模板的实例化&#xff08;确定参数的类型&#xff09; 隐式实例化 显式实例化 实例化顺序 三、类模板和模板类 类模板的实例化 一、什么是模板&#xff1…

智慧职校就业管理:开启校园招聘会新模式

在智慧职校的就业管理系统中&#xff0c;校园招聘会的出现&#xff0c;为学生们提供了一个展示自我、探寻职业道路的舞台&#xff0c;同时也为企业搭建了一座直面未来之星的桥梁。这一功能&#xff0c;凭借其独特的优势与前沿的技术&#xff0c;正在重新定义校园与职场之间的过…

2024中国大学生算法设计超级联赛(1)

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;彩笔ACMer一枚。 &#x1f3c0;所属专栏&#xff1a;杭电多校集训 本文用于记录回顾总结解题思路便于加深理解。 &#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 A - 循环位移解…

python-爬虫实例(5):将进酒,杯莫停!

目录 前言 将进酒&#xff0c;杯莫停&#xff01; 一、浇给 二、前摇 1.导入selenium库 2.下载浏览器驱动 三、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 博主身为一个农批&#xff0c;当然要尝试爬取王者荣耀的东西啦。 将进…

萝卜快跑突然就火了,背后发生了什么?

近日&#xff0c;百度旗下的自动驾驶出行平台“萝卜快跑”突然在网络上火了起来&#xff0c;成为热门话题。那么&#xff0c;这背后到底发生了什么&#xff1f; 1. 数字误传引发热议 首先&#xff0c;一些误传的数字在传播中起到了推波助澜的作用。例如&#xff0c;百度在2023…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

PCL 批量处理点云文件

系列文章目录 文章目录 系列文章目录前言一、PCL是什么&#xff1f;二、配置PCL环境三、使用步骤1.引入库2.主函数 总结 前言 点云处理时往往会需要对多个点云进行处理&#xff0c;比如在预处理&#xff0c;保存点云时。下面提供一个简单的点云批量转换例子&#xff0c;PCD文件…