JavaWeb阶段学习知识点(一)

news2024/11/28 6:35:11

【参考视频】https://www.bilibili.com/video/BV1m84y1w7Tb?p=167&vd_source=38a16daddd38b4b4d4536e9c389e197f

SpringBoot项目的创建和接口配置

做一个springboot项目,从创建项目到实现浏览器访问localhost:8080/hello返回字符串hello world的全流程

1. 创建项目

  • idea
  • 新建项目
  • Spring initializr->配置选择语言:java类型:maven组:com.jwz包名:com.jwz打包:jar
  • 选择web->spring web
  • finish

创建完成项目后可以把.idea、.mvn、.gitignore、HELP.md、mvnw、mvnw.cmd等无关项目的文件和文件夹删除

2.配置接口

在项目的com.jwz下新建controller包再创建HelloController.java文件,放入以下内容

package com.jwz.sprdemo02.controller;

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

// 请求处理类
@RestController
public class HelloController {
   
    // 定义接口名
    @RequestMapping("/hello")
    public String hello(){
   
        System.out.println("Hello World");
        return "Hello World";
    }
}

然后找到项目默认生成的Application.java的文件,右键运行即可

浏览器访问:http://localhost:8080/hello 即可显示Hello World

获取参数

原始方式

package com.jwz.sprdemo02.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// 请求处理类
@RestController
public class HelloController {
   
    // 定义接口名
    @RequestMapping("/hello")
    public String hello(HttpServletRequest request){
   
        // 浏览器访问:http://localhost:8080/hello?name=萧寂&age=18
        
        // 获取get请求参数
        String name = request.getParameter("name");
        String age = request.getParameter("age");

        int ageInt = Integer.parseInt(age);
        System.out.println(name+ageInt);
        return name+ageInt;
    }
}

SpringBoot方式

package com.jwz.sprdemo02.controller;

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

// 请求处理类
@RestController
public class HelloController {
   
    // 定义接口名
    @RequestMapping("/hello")
    public String hello(@RequestParam("name") String name ,@RequestParam("age") Integer age){
   
        System.out.println(name+":"+age);
        return name+age;
    }
}

// get请求:http://localhost:8080/hello?name=萧寂&age=18
// post请求:http://localhost:8080/hello  在body的x-www-form-urlencoded里面添加对应参数即可
// 上面获取参数方法可以获取get和post参数的,只是请求方法和参数的传递方式有点区别

参数对应不上的情况

// 下面这个方法,比如我请求地址和传参为:http://localhost:8080/hello?name=萧寂&age=18
// 可以发现,参数没有username 只有name,那么RequestParam这个注解就可以指定参数,当匹配到RequestParam指定的属性的值时也默认这个值为username的值,如果匹配不到RequestParam指定的参数,则会抛出400错误,如下所示,第二个参数改为false,代表此参数不是必填的,则不会报错,会将当前参数为null
public String hello(@RequestParam(value = "name",required = false) String username ,@RequestParam("age") Integer age){
   
    // 此时匹配到name="萧寂" 也就相当于username="萧寂"
        System.out.println(username+":"+age);
        return username+age;
    }

// @ReguestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果该参数是可选的,可以将required属性设置为false。

参数接收

实体参数

package com.jwz.sprdemo02.user;

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

public class simplePojo {
   
    private String name;
    private Integer age;

    public simplePojo() {
   
    }

    public simplePojo(String name, Integer age) {
   
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
   
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
   
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
   
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
   
        this.age = age;
    }

    public String toString() {
   
        return "simplePojo{name = " + name + ", age = " + age + "}";
    }
}

@RestController
class ControllerSimplePojo{
   
    // 实体参数
    @RequestMapping("/simplePojo")
    public String simplePojo(simplePojo simplePojo){
   
        // 访问如下地址: http://localhost:8080/simplePojo?name=萧寂&age=18
        System.out.println(simplePojo); // simplePojo{name = 萧寂, age = 18}

        // 访问如下地址: http://localhost:8080/simplePojo?age=18
        // 不传哪个哪个就为null
        System.out.println(simplePojo); // simplePojo{name = null, age = 18}
        return "OK";
    }
}

数组集合参数

    @RequestMapping("/arrayHobby")
    public String arrayHobby(@RequestParam("hobby") String[] hobby){
   
        // 请求方式get,地址为:http://localhost:8080/arrayHobby?hobby=篮球&hobby=跳绳&hobby=足球
        System.out.println(Arrays.toString(hobby)); // [篮球, 跳绳, 足球]
        return "OK";
    }

// 使用集合接收
    @RequestMapping("/listHobby")
    public String listHobby(@RequestParam("hobby") List<String> hobby){
   
        // 请求方式get,地址为:http://localhost:8080/listHobby?hobby=篮球&hobby=跳绳&hobby=足球
        System.out.println(hobby); // [篮球, 跳绳, 足球]
        return "OK";
    }

日期参数

    @RequestMapping("/dateParams")
    public String dateParams(@RequestParam("updateTime") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
   
        // 请求方式get,地址为:http://localhost:8080/dateParams?updateTime=2024-04-27 10:00:25
        System.out.println(updateTime); // 2024-04-27T10:00:25
        return "OK";
    }

JSON参数

package com.jwz.sprdemo02.json;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

class Address {
   
    private String province;
    private String city;

    public Address(String province, String city) {
   
        this.province = province;
        this.city = city;
    }

    public Address() {
   
    }

    public String getProvince() {
   
        return province;
    }

    public void setProvince(String province) {
   
        this.province = province;
    }

    public String getCity() {
   
        return city;
    }

    public void setCity(String city) {
   
        this.city = city;
    }

    @Override
    public String toString() {
   
        return "Address{" +
                "province='" + province + '\'' +
                ", city='" + city + '\'' +
                '}';
    }
}

class User {
   
    private String name;
    private Integer age;
    private Address address;


    public User() {
   
    }

    public User(String name, Integer age, Address address) {
   
        this.name = name;
        this.age = age;
        this.address = address;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
   
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
   
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
   
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
   
        this.age = age;
    }

    /**
     * 获取
     * @return address
     */
    public Address getAddress() {
   
        return address;
    }

    /**
     * 设置
     * @param address
     */
    public void setAddress(Address address) {
   
        this.address = address;
    }

    public String toString() {
   
        return "User{name = " + name + ", age = " + age + ", address = " + address + "}";
    }
}



@RestController
class ControllerUser{
   
    @RequestMapping("/jsonParams")
    public String jsonParams(@RequestBody User jsonParams){
    // 接收到的参数交给User去处理
        // 请求方式post,地址为:http://localhost:8080/jsonParams  参数在apifox的body的json里面填写json数据{"name":"萧寂","age":16,"address":{"province":"北京","city":"北京"}}
        // 这里有个小问题,json数据格式和raw的一样,如果在json填写数据后再点击raw然后去发请求,此时参数是raw里面的,我这里返回来了415错误,也就是说在json里面写完参数必须直接发请求,不要切换到其他栏,都会报错
        System.out.println(jsonParams); // User{name = 萧寂, age = 16, address = Address{province='北京', city='北京'}}
        return "OK";
    }
}

路径参数

就是http 😕/localhost:8080/add/1/123 这个1和123就是路径上面携带的参数

    @RequestMapping("/pathParams/{id}/{preId}")
    public String pathParams(@PathVariable("id") Integer id,@PathVariable("preId") Integer preId){
   
        // 请求方式get,地址为:http://localhost:8080/pathParams/1/1234
        System.out.println(id+":"+preId); // 1:1234
        return "OK";
    }

封装统一的返回格式

{
    code:0,
    msg:"成功",
    data:[...]
}

工具类

package com.jwz.sprdemo02.controller;

public class Result {
   
    private Integer code;
    private String msg;
    private Object data;

    public Result() {
   
    }

    public Result(Integer code, String msg, Object data) {
   
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 获取
     * @return code
     */
    public Integer getCode() {
   
        return code;
    }

    /**
     * 设置
     * @param code
     */
    public void setCode(Integer code) {
   
        this.code = code;
    }

    /**
     * 获取
     * @return msg
     */
    public String getMsg() {
   
        return msg;
    }

    /**
     * 设置
     * @param msg
     */
    public void setMsg(String msg) {
   
        this.msg = msg;
    }

    /**
     * 获取
     * @return data
     */
    public Object getData() {
   
        return data;
    }

    /**
     * 设置
     * @param data
     */
    public void setData(Object data) {
   
        this.data = data;
    }

    // 响应成功调用
    // 这里使用了方法重载,成功的情况分为三种(自定义成功后的消息内容和接口返回的数据,使用默认的success文字和接口返回的数据,还有一种情况只响应成功结果但不需要返回数据)
    public static Result success(Object data,String msg){
   
        return new Result(1,msg,data);
    }
    public static Result success(Object data){
   
        return new Result(1,"success",data);
    }
    public static Result success(){
   
        return new Result(1,"success",null);
    }
    // 响应失败调用
    // 失败只会有一种情况(自定义提示失败的消息,数据为null)
    public static Result error(String msg){
   
        return new Result(0,msg,null);
    }

    public String toString() {
   
        return "Result{code = " + code + ", msg = " + msg + ", data = " + data + "}";
    }
}

三层架构

项目结构

dao daoImpl service serviceImpl controller

dao和service均是接口

daoImpl和serviceImpl和controller是三层架构的核心

daoImpl负责数据访问操作 serviceImpl负责数据的逻辑层处理 controller负责接收数据响应数据

这里我需要实现一个逻辑,运用三层架构的思路实现

浏览器访问参数num为多少,则返回当前传入的num的值+1

1.项目三层架构的结构如下

在这里插入图片描述

2.对各层进行代码编写,从前往后写

dao代码如下

package com.jwz.sprdemo02.dao.service.dao.dao;

public interface dao {
   
    public Integer daoA(Integer num);
}

daoImpl代码如下

package com.jwz.sprdemo02.dao.service.dao.dao;

public class daoImpl implements dao{
   
    @Override
    public Integer daoA(Integer num) {
   
        // 这里用于对数据进行初始化和访问
        // 这里是做demo,我返回的值是传入进来的数据,后期要拿这个传入的参数做数据库查询数据,查询到了返回出去的
        return num;
    }
}

service代码如下

package com.jwz.sprdemo02.dao.service.dao.service;

public interface service {
   
    public String serviceA(Integer num);
}

serviceImpl代码如下

package com.jwz.sprdemo02.dao.service.dao.service;

import com.jwz.sprdemo02.dao.service.dao.dao.daoImpl;

public class serviceImpl implements service{
   
    // 由于这里service和dao未关联,所以拿不到dao的数据,因此要在这里创建daoImpl的对象,用于拿到数据
    private daoImpl dao = new daoImpl();
    @Override
    public String serviceA(Integer num) {
   
        // 这里用于对数据进行业务的处理
        // 例如,调用daoImpl里面的方法,拿到初始化访问到的数据
        
        // 其实这里已经拿到传入的参数值了,我其实可以直接返回这个数据的,但是要演示三层架构功能还是把参数传给dao,让dao返回数据给我们,后期学完数据库后,这些参数传给dao用于进行数据查询,然后会返回查询到的数据,这里就先模拟下,传入num就返回num了,写个注释避免被说多此一举
        Integer i = dao.daoA(num); 
        int sum = i+1;
        return "传入的num+1的值是"+sum;
    }
}

分层解耦

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合。

控制反转: Inyersion OfControl,简称I0C。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入:DependencyIniection,简称Dl。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
Bean对象:I0C容器中创建、管理的对象,称之为bean。

依赖注入和控制反转

上面的三层架构的案例,如果我们的serviceImpl改了个名字比如叫serviceImpl1则controller层的代码也要改变,当项目架构比较大,项目比较多的话,也就相当于所有依赖serviceImpl的类都要去手动修改,使项目变得难以维护,依赖注入控制反转的思想就是将所有的实现类Impl(daoImpl和serviceImpl)的类上面都加个@Component注解,这样的话相当于把所有的实现类都加入到容器内部了,在我们需要创建这个实现类的时候,只需要在这个代码上面加一个@Autowired即可,这样就实现了自动注入,即即使代码改了名,项目都是去容器内部去自动注入的,而改代码的实现类又被加入到容器内部了,相当于可以自动更新了,这样的话项目维护成本就低了

将上面的三层架构的daoImpl和serviceImpl和controller代码进行小小改造,改造如下

daoimpl

package com.jwz.sprdemo02.dao.service.dao.dao;

import org.springframework.stereotype.Component;

@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
public class daoImpl implements dao{
   
    @Override
    public Integer daoA(Integer num) {
   
        // 这里用于对数据进行初始化和访问
        // 这里是做demo,我返回的值是传入进来的数据
        return num;
    }
}

serviceImpl

package com.jwz.sprdemo02.dao.service.dao.service;
import com.jwz.sprdemo02.dao.service.dao.dao.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

//将当前类交给IOC容器管理,成为IOC容器中的bean
@Component
public class serviceImpl implements service{
   
    // 由于这里service和dao未关联,所以拿不到dao的数据,因此要在这里创建daoImpl的对象,用于拿到数据
    @Autowired //运行时,IOC容器会提供该类型的bean对象,并值给该变依赖注入
    private dao dao; // 类型是接口的类型(多态写法)
    @Override
    public String serviceA(Integer num) {
   
        // 这里用于对数据进行业务的处理
        // 例如,调用daoImpl里面的方法,拿到初始化访问到的数据
        Integer i = dao.daoA(num); // 1234
        int sum = i+1;
        return "传入的num+1的值是"+sum; // 1235
    }
}

controller

package com.jwz.sprdemo02.dao.service.dao.controller;

import com.jwz.sprdemo02.dao.service.dao.service.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class controller {
   
    // 创建serviceImpl对象
    @Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量  -- 依赖注入
    private service s; // 类型是接口类型

    // 定义接口,请求和响应数据
    @RequestMapping("/helloNum")
    public String hello(@RequestParam("num") Integer num) {
   
        String i = s.serviceA(num);
        return i;
    }
}

@Component的注解有三个不同的衍生注解,@Repository,标注daoImpl数据访问层,@Service标注业务实现层,@Controller标注在数据响应层,建议不属于这三类的层再使用@Component注解,上面的衍生注解功能和@Component一致,主要为了区分业务

Bean注入存在的问题

  • @Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
  • 在这里插入图片描述

可以通过以下方案来解决

  • @Primary (想让哪个Bean生效就在哪个Bean上面价格@Primary,如下

    • package com.jwz.sprdemo02.dao.service.dao.service;
      import com.jwz.sprdemo02.dao.service.dao.dao.dao;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Component;
      @Primary 
      //将当前类交给IOC容器管理,成为IOC容器中的bean
      @Component
      public class serviceImpl implements service{
             
          // 由于这里service和dao未关联,所以拿不到dao的数据,因此要在这里创建daoImpl的对象,用于拿到数据
          @Autowired //运行时,IOC容器会提供该类型的bean对象,并值给该变依赖注入
          private dao dao; // 类型是接口的类型(多态写法)
          @Override
          public String serviceA(Integer num) {
             
              // 这里用于对数据进行业务的处理
              // 例如,调用daoImpl里面的方法,拿到初始化访问到的数据
              Integer i = dao.daoA(num); // 1234
              int sum = i+1;
              return "传入的num+1的值是"+sum; // 1235
          }
      }
      
  • @Qualifier(在使用bean时上面价格@Qualifier注解,表明使用哪个bean,如下)

    • package com.jwz.sprdemo02.dao.service.dao.controller;
      
      import com.jwz.sprdemo02.dao.service.dao.service.service;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      public class controller {
             
          // 创建serviceImpl对象
          @Qualifier("serviceImpl") //  bean名字,不指定的话默认类名首字母小写
          @Autowired //运行时,IOC容器会提供该类型的bean对象,并赋值给该变量  -- 依赖注入
          private service s; // 类型是接口类型
      
          // 定义接口,请求和响应数据
          @RequestMapping("/helloNum")
          public String hello(@RequestParam("num") Integer num) {
             
              String i = s.serviceA(num);
              return i;
          }
      }
      
  • @Resource(功跟autowire一样,只是autowire是自动注入,而Resource是根据Bean名称进行注入的)

    • package com.jwz.sprdemo02.dao.service.dao.controller;
      
      import com.jwz.sprdemo02.dao.service.dao.service.service;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.RequestParam;
      import org.springframework.web.bind.annotation.RestController;
      
      @RestController
      public class controller {
             
          // 创建serviceImpl对象
          @Resource(name = "serviceImpl") //  bean名字,不指定的话默认类名首字母小写
          private service s; // 类型是接口类型
      
          // 定义接口,请求和响应数据
          @RequestMapping("/helloNum")
          public String hello(@RequestParam("num") Integer num) {
             
              String i = s.serviceA(num);
              return i;
          }
      }
      

Mysql相关

mysql所有相关命令

-- 终端连接远程mysql命令
-- mysql -h远程地址 -P端口号 -u用户名 -p密码
mysql -h139.196.214.124 -P3306 -uceshaiaa -pxtZA8p7xEKBWLd6Wnd

-- 一:DDL部分相关命令(下述语法中的database,也可以替换成schema。如:create schema db01;select schema();)
-- 1:数据库操作
-- 1.1 查询
-- 1.1-1 查询所有的数据库
show databases;
-- 1.1-2 查询当前数据库
select database();
-- 1.2 使用
-- 1.2-1 使用数据库
use 数据库名;
-- 1.3 创建
-- 1.3-1 创建数据库(if not exists这是可选的,如果加上则代表:数据库存在不会报错也不会做任何操作,如果数据库不存在则会去创建)
create database [ if not exists ] 数据库名;
-- 1.4 删除
-- 1.4-1 删除数据库(if exists是可选参数,数据库不存在则不会做任何操作,也不会报错,如果存在就会去执行删除数据库操作)
drop database [ if exists ] 数据库名;
-- 2:表操作(带[]的都是可选参数)
-- 2.1 创建表
create table 表名(字段1 字段类型 [约束] [comment 字段1注释],.....,字段n 字段类型 [约束] [comment 字段n注释])[comment 表注释];
-- 2.1-1 示例(id主键自增,用户名非空且唯一,姓名非空,性别默认为男,都是加了约束的)
create table user(
	id int primary key auto_increment comment 'ID字段,唯一标识',
	username varchar(20) not null unique comment '用户名',
	name varchar(10) not null comment '姓名',
	age int comment '年龄',
	gender char(1) default '男' comment '性别'
) comment '用户表';
-- 2.2 查询表
-- 2.2-1 查询当前数据库的所有表
show tables;
-- 2.2-2 查询表结构
desc 表名;
-- 2.2-3 查询建表语句
show create table 表名;

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

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

相关文章

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪

基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通&#xff0c;可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)

memory动态内存管理学习之shared_ptr

此头文件是动态内存管理库的一部分。std::shared_ptr 是一种通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可持有同一对象。下列情况之一出现时销毁对象并解分配其内存&#xff1a; 最后剩下的持有对象的 shared_ptr 被销毁&#xff1b;最后剩下的持有对象的 s…

用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配

数据可视化大屏 基于 Vue3、Typescript、DataV、ECharts5 框架的大数据可视化&#xff08;大屏展示&#xff09;开发。此项目vue3实现界面&#xff0c;采用新版动态屏幕适配方案&#xff0c;全局渲染组件封装&#xff0c;支持数据动态刷新渲染、内部DataV、ECharts图表都支持自…

cad批量打印pdf怎么弄?介绍三种打印方法

cad批量打印pdf怎么弄&#xff1f;在CAD设计领域&#xff0c;批量打印PDF文件是一项常见且至关重要的任务。面对大量的CAD图纸&#xff0c;如何高效地进行转换和打印&#xff0c;成为了设计师们亟待解决的问题。今天&#xff0c;我们就来推荐三款能够批量打印PDF的CAD软件&…

又发现一款独立清理神器,界面清爽,功能强大,没有广告!

360清理Pro独立提取版是360公司推出的一款清理软件&#xff0c;主要用于清理系统垃圾和优化系统性能&#xff0c;涵盖了四大类型的清理场景&#xff0c;分别为&#xff1a;微信、QQ的垃圾扫描及清理&#xff0c;系统盘中的大文件、重复文件扫描及清理以及系统软件使用痕迹的清理…

【例子】webpack配合babel实现 es6 语法转 es5 案例 [通俗易懂]

首先来说一下实现 es6 转 es5 的一个简单步骤 1、新建一个项目&#xff0c;并且在命令行中初始化项目 npm init -y2、安装对应版本的 webpack webpack-cli(命令行工具) "webpack""webpack-cli"3、安装 Babel 核心库和相关的 loader "babel-core&qu…

容器之分栏窗体构件演示

代码; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>int main(int argc, char *argv[]) {gtk_init(&argc, &argv);GtkWidget *window;window gtk_window_new(GTK_WINDO…

音乐管理系统

摘 要 现如今&#xff0c;在信息快速发展的时代&#xff0c;互联网已经成了人们在日常生活中进行信息交流的重要平台。看起来&#xff0c;听歌只是一种消遣和消遣&#xff0c;其实&#xff0c;只要你选对了曲子&#xff0c;就会产生许多不同的作用。音乐能舒缓身心&#xff0c…

北大推出全新机器人多模态大模型!面向通用和机器人场景的高效推理和操作

为了赋予机器人端到端的推理和操纵能力&#xff0c;本文创新性地将视觉编码器与高效的状态空间语言模型集成&#xff0c;构建了全新的 RoboMamba 多模态大模型&#xff0c;使其具备视觉常识任务和机器人相关任务的推理能力&#xff0c;并都取得了先进的性能表现。同时&#xff…

刷代码随想录有感(111):动态规划——零钱兑换II

干&#xff0c;被上了一课。注意题干&#xff0c;到底是求能装最大价值的方案还是装满这个容量共有多少种方法。他们的公式都不同&#xff0c;最大价值的方案是&#xff1a; dp[j] max(dp[j], dp[j - weight[i]] value[i]); 而装满有多少种方法是&#xff1a; dp[j] dp[j…

你不会是这样摆放 WiFi 路由器的吧?

当你购买WiFi路由器时&#xff0c;可能会对如何放置路由器以获得最好的信号覆盖感到迷茫。 那&#xff0c;到底要怎样摆放路由器&#xff0c;信号才会更好呢&#xff1f; 首先&#xff0c;咱们先简单了解一下天线信号是如何传输的。通常&#xff0c;天线信号是从天线垂直方向&a…

入门Ansible常用模块

自动化运维Devops-Ansible Ansible是新出现的自动化运维工具&#xff0c;基于Python 开发&#xff0c;集合了众多运维工具&#xff08;puppet 、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置 、批量程序部署、批量运行命令 等功能。Ansible…

PCL 拟合二维椭圆(迭代法)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 一般情况,我们会用椭圆拟合二维点,用椭球拟合三维点。在n维中,这些对象被称为超椭球体,由二次方程隐式定义 超椭球的中心是n1向量C,nn矩阵S是正定的,n1向量X是超椭球上的任意点。矩阵S可以用特征分解,S = R…

洛谷 P1141 01迷宫 (dfs解决)

题目描述 有一个仅由数字 0 与 1 组成的 nn 格迷宫。若你位于一格 0 上&#xff0c;那么你可以移动到相邻 4 格中的某一格 1 上&#xff0c;同样若你位于一格 1 上&#xff0c;那么你可以移动到相邻 4 格中的某一格 0 上。 你的任务是&#xff1a;对于给定的迷宫&#xff0c;…

【2024德国工作】外国人在德国找工作是什么体验?

挺难的&#xff0c;德语应该是所有中国人的难点。大部分中国人进德国公司要么是做中国业务相关&#xff0c;要么是做技术领域的工程师。先讲讲人在中国怎么找德国的工作&#xff0c;顺便延申下&#xff0c;德国工作的真实体验&#xff0c;最后聊聊在今年的德国工作签证申请条件…

量子计算:1 从薛定谔的猫开始

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

力扣爆刷第153天之TOP100五连刷(接雨水、环形链表、最长上升子序列)

力扣爆刷第153天之TOP100五连刷&#xff08;接雨水、环形链表、最长上升子序列&#xff09; 文章目录 力扣爆刷第153天之TOP100五连刷&#xff08;接雨水、环形链表、最长上升子序列&#xff09;一、300. 最长递增子序列二、415. 字符串相加三、143. 重排链表四、42. 接雨水五、…

后端实现预览pdf,mp4,图片

PDF预览 /*** pdf预览* param response*/RequestMapping(value "/preview")public void showPdf(HttpServletResponse response) {try {//String filePath this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();Stri…

Python抓取高考网图片

Python抓取高考网图片 一、项目介绍二、完整代码一、项目介绍 本次采集的目标是高考网(http://www.gaokao.com/gkpic/)的图片,实现图片自动下载。高考网主页如下图: 爬取的流程包括寻找数据接口,发送请求,解析图片链接,向图片链接发送请求获取数据,最后保存数据。 二…

AGI 之 【Hugging Face】 的[ 简单介绍 ] [ 基础环境搭建 ] 的简单整理

AGI 之 【Hugging Face】 的[ 简单介绍 ] [ 基础环境搭建 ] 的简单整理 目录 AGI 之 【Hugging Face】 的[ 简单介绍 ] [ 基础环境搭建 ] 的简单整理 一、简单介绍 二、Hugging Face 三、环境搭建 python 环境的搭建 Pycharm 环境搭建 1、下载 Pycharm 安装包 2、安装 …