Spring Boot 框架基础

2023-11-03

Spring Boot 框架基础

基础案例

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.4</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

web环境依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

controller

@RestController
@RequestMapping("/demo")
public class DemoController {
    @RequestMapping("/handle01")
    public String handle01() {
        return "你好 springboot";
    }
}

测试

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
@Autowired
private DemoController demoController;

@Test
void contextLoads() {
    System.out.println(demoController.handle01());
}

热部署

pom.xml

<!-- 热部署 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

使用IDEA工具热部署支持:

  1. File => Settings => Build, Execution, Deployment => Compiler => 勾选 Build project automatically
  2. “Ctrl+Shift+Alt+/” 组合键打开 Registry 面板 => 勾选 compiler.automake.allow.when.app.running

热部署原理:

​ 在编译器上启动项目,改动代码,编译器会自动触发编译,替换掉原来的 class 文件,项目检测到有文件变更后会重启项目。

​ 当引入插件后,插件会监控 classpath 下文件的变化,当 classpath 有变化后,会触发重启。

​ 快速重启的原因:对类采用了两种加载机制,对于第三方的 jar 包采用 base-classloader 来加载,对于开发人员自己开发的代码使用 restart-classLoader 来加载,这里比停掉服务重启快得多,因为使用插件只重启开发人员编写的代码部分。

@Component
public class Devtools implements InitializingBean {

    @Override
    public void afterPropertiesSet() {
        // 在添加了 devtools 插件
        // 第三方 jar 包 使用 base-classloader 来加载
        // 自己开发的代码 使用 restart-classLoader 来加载

        // org.springframework.boot.devtools.restart.classloader.RestartClassLoader@472075a1
        System.out.println(Devtools.class.getClassLoader());

        // jdk.internal.loader.ClassLoaders$AppClassLoader@e73f9ac
        System.out.println(DispatcherServlet.class.getClassLoader());
    }
}

配置文件中属性注入

@Value

@Component
@Data
public class JdbcConfiguration {
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
}

配置文件

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/bank
jdbc.username=root
jdbc.password=123

测试

@Autowired
private JdbcConfiguration jdbcConfiguration;

@Test
void JdbcValueConfigTest() {
    System.out.println(jdbcConfiguration);
}

结果

JdbcConfiguration(url=jdbc:mysql://127.0.0.1:3306/bank, driverClassName=com.mysql.jdbc.Driver, username=root, password=123)

@ConfigurationProperties

pom.xml

<!-- 添加配置文件提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

定义需要被注入属性的实体类

@Component
@ConfigurationProperties(prefix = "person")
@Data
public class Person {
    private int id;
    private String name;
    private List<String> hobbies1;
    private List<String> hobbies2;
    private String[] family;
    private Map<String, Object> map1;
    private Map<String, Object> map2;
    private Pet pet;
}

@Component
@Data
public class Pet {
    private String name;
    private String type;
}

配置文件

application.properties

# 自定义属性注入到对应的实体中
person.id=1
person.name=应巅
person.hobbies1=吃饭,睡觉,打豆豆
person.hobbies2=睡觉,睡觉,睡觉
person.family=爸爸,妈妈,爷爷,奶奶
person.map1.extra1=1额外的信息1
person.map1.extra2=1额外的信息2
person.map2.extra1=2额外的信息1
person.map2.extra2=2额外的信息2
person.pet.type=猫
person.pet.name=旺财

application.yml

person:
  id: 2
  family: [爸爸,妈妈,爷爷,奶奶]
  name: 应巅
  hobbies1:
    睡觉,
    睡觉,
    睡觉
  hobbies2:
    - 吃饭
    - 睡觉
    - 打豆豆
  map1:
    extra1: 1额外的信息1
    extra2: 1额外的信息2
  map2: {extra1: 2额外的信息2, extra2: 2额外的信息2}
  pet:
    type:name: 旺财

测试

@Autowired
private Person person;

@Test
void personConfigTest() {
    System.out.println(person);
}

结果

Person(id=1, name=应巅, hobbies1=[吃饭, 睡觉, 打豆豆], hobbies2=[睡觉, 睡觉, 睡觉], family=[爸爸, 妈妈, 爷爷, 奶奶], map1={extra1=1额外的信息1, extra2=1额外的信息2}, map2={extra1=2额外的信息1, extra2=2额外的信息2}, pet=Pet(name=旺财, type=猫))

日志框架

日志抽象层 日志实现层
JCL、SLF4J、jboos-logging jul、log4j、log4j2、logback

springboot 默认使用 SLF4J 为日志抽象层,logback 为日志实现层。

日志使用

private Logger logger = LoggerFactory.getLogger(SpringBootDemoApplicationTests.class);

@Test
void logTest() {
    // 日志级别:trace < debug < info < warn < error
    // 日志默认使用:SLF4j + LogBack
    // spring boot 默认日志级别 为Info
    logger.trace("Trace 日志...");
    logger.debug("Debug 日志...");
    logger.info("Info 日志...");
    logger.warn("Warn 日志...");
    logger.error("Error 日志...");
}

配置文件

# 调整某个包下面的日志级别
logging.level.com.demo=trace
# 日志的输出格式
# 控制台
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 文件
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 文件路径 默认的日志文件名 spring.log
#logging.file.path=springLog
# 写入具体的文件
logging.file.name=log/log.log

缓存

pom.xml

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

application.properties

spring.datasource.url=jdbc:mysql:///bank?
spring.datasource.username=root
spring.datasource.password=123456
spring.jpa.show-sql=true
@Data
@Entity
@Table(name = "employee")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;
    @Column(name = "last_name")
    private String lastName;
    @Column(name = "email")
    private String email;
    @Column(name = "gender")
    private Integer gender; //性别 1男 0女
    @Column(name = "d_id")
    private Integer dId;
}

// JPA实现简单CRUD
public interface EmployeeDao extends JpaRepository<Employee, Integer> {}
@SpringBootApplication
@EnableCaching //开启基于注解的缓存
public class SpringBootDemoApplication {

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

添加缓存

@GetMapping("/emp/{id}")
// 添加缓存 cacheNames:缓存的名字 = value;
// key:默认参数的值 次数为id的值1;可以使用 SpEL 表达式
@Cacheable(cacheNames = {"emp"})
public Employee getEmp(@PathVariable("id") Integer id) {
    return employeeDao.findById(id).get();
}

更新缓存

 @GetMapping("/emp/update")
// 更新缓存
@CachePut(value = "emp", key = "#employee.id")
public Employee updateEmp(Employee employee) {
    employeeDao.save(employee);
    return employee;
}

删除缓存

@DeleteMapping("/emp/{id}")
// 删除缓存
// beforeInvocation:默认为 false,译为在方法调用之后删除缓存;设置为 true,译为在方法调用之前删除缓存
// 若方法出现异常,在方法调用之后清除缓存将不起作用。
@CacheEvict(value = "emp", key = "#id", beforeInvocation = true)
public void delEmp(@PathVariable("id") Integer id) {
    employeeDao.deleteById(id);
}

SpEL 表达式

@GetMapping("/SpELDemo/{id}")
@Cacheable(cacheNames = {"emp"}, key = "#root.method")
public Employee SpELDemo(@PathVariable("id") Integer id) {
    return employeeDao.findById(id).get();
}
SpEL 表达式 描述
#root.methodName 方法的名称 SpELDemo
#root.method 方法 public com.demo.pojo.Employee com.demo.controller.DemoController.SpELDemo(java.lang.Integer)
#root.args[0] 当前被调用的方法的参数列表 {id}的值
#iban、#a0、#p0 方法参数的名字,可以直接 #参数名,也可以使用 #p0 或 #a0 的形式,0 代表参数的索引 {id}的值
#result 方法执行后的返回值

基于redis 实现缓存

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring.redis.database=1
spring.redis.host=127.0.0.1

需要实现 Serializable 接口

public class Employee implements Serializable {}

SpringBoot默认采用的是JDK的对象序列化方式。

自定义RedisCacheManager

使用 JSON 格式进行对象的序列化操作。

@Configuration
public class RedisConfig {

    // 自定义一个RedisTemplate
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        //设置redisTemplate模板API的序列化方式为json
        template.setDefaultSerializer(getJackson2JsonRedisSerializer());
        return template;
    }

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        // 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换
        RedisSerializer<String> strSerializer = new StringRedisSerializer();
        // 定制缓存数据序列化方式及时效
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1))
                .serializeKeysWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(strSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair
                        .fromSerializer(getJackson2JsonRedisSerializer()))
                .disableCachingNullValues();
        return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
    }

    private Jackson2JsonRedisSerializer<Object> getJackson2JsonRedisSerializer() {
        // 创建JSON格式序列化对象,对缓存数据的key和value进行转换
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        // 解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        return jackson2JsonRedisSerializer;
    }
}

打包部署

pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

运行:

java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar

多环境部署

两种方式:

1、@Profile 注解:可以使用在 @Component 或 @Configuration 注解的类上,指定一个字符串值用于约定生效的环境。

@Configuration
// 字符串需要和 激活的参数一致
@Profile("dev")
public class DataSourceConfig {
    private String name="devName";
    private String config="devConfig";
}

2、创建 application-dev.properties 配置文件。-dev 需要和 激活的参数一致

@Component
@Data
public class Sound {
    @Value("${sound.name}")
    String name;

    @Value("${sound.location}")
    String location;
}
# application-dev.properties
sound.name=devName
sound.location=devLocation

application.properties 中配置文件激活:spring.profiles.active=dev

如果不添加在打包的时候使用命令:

java -jar spring-boot-demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

测试:此时使用的配置文件是 application-dev.properties。注入的类是 @Profile(“dev”) 修饰过的。

@Autowired
private Sound sound;

@Test
void devConfig() {
    System.out.println(sound);
}

@Autowired
private DataSourceConfig dataSourceConfig;

@Test
void devDataSourceConfig() {
    System.out.println(dataSourceConfig);
}

项目监控

actuator

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml

management:
  endpoints:
    web:
      exposure:
      	# 暴露所有的端点
        include: '*'
      # 默认端点的url /actuator;修改为 /monitor
      base-path: '/monitor'
  endpoint:
    health:
      # 是否展示细节
      show-details: always
    shutdown:
      # 能否通过接口关闭 spring boot 服务
      enabled: true
  server:
    # 监控的端口 通常不同于服务端口
    port: 8082
  health:
    redis:
      # actuator 会自动进行一些健康检查 此处可用于排除 redis 的健康检查
      enabled: false

基本监控接口

  1. GET:http://127.0.0.1:8082/monitor/info

自定义的信息

@Component
public class InfoConfig implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        HashMap<String, String> map = new HashMap<>();
        map.put("app", "001");
        builder.withDetail("key", "value").withDetail("key2", map);
    }
}
{
    key: "value",
    key2: {
        app: "001"
    }
}
  1. GET:http://127.0.0.1:8082/monitor/health

当前服务健康状态

{
    status: "UP",
    components: {
        db: {
            status: "UP",
            details: {
                database: "MySQL",
                validationQuery: "isValid()"
            }
        },
        diskSpace: {
            status: "UP",
            details: {
                total: 431645257728,
                free: 366851395584,
                threshold: 10485760,
                exists: true
            }
        },
        ping: {
            status: "UP"
        }
    }
}
  1. POST:http://127.0.0.1:8082/monitor/shutdown

关闭当前服务

spring boot admin

需要注意 admin 的版本 和 parent 的版本

服务端

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-server</artifactId>
    <version>2.6.1</version>
</dependency>

启动类上标注

@EnableAdminServer

客户端

pom.xml

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.6.1</version>
</dependency>

application.yml

spring:
  boot:
    admin:
      client:
      	# admin 服务端的地址
        url: http://localhost:8080
  application:
    name: spring-boot-demo

定时任务

@Scheduled

启动类上标注

@EnableScheduling

编写定时任务逻辑

@Component
@EnableAsync
public class ScheduledConfig {
    @Scheduled(fixedRate = 10000)
    public void fixedRate() {
        System.out.println("fixedRate>>>" + new Date());
    }

    @Scheduled(cron = "*/10 * * * * MON-FRI")
    public void doSomething() {
        System.out.println("something that should run on weekdays only");
    }
}

SchedulingConfigurer 接口

实现 SchedulingConfigurer 接口 可以动态执行定时任务

@Component
public class DynamicScheduleTask implements SchedulingConfigurer {

    @Autowired
    private CornDao cornDao;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(() -> {
            // 定时任务逻辑
            System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime());
        }, triggerContext -> {
            // 从数据库中获取 定时任务的执行时间
            // String name = "*/10 * * * * MON-FRI";
            CornMsg cornMsg = cornDao.findById(1).get();
            String name = cornMsg.getName();     
            return new CronTrigger(name).nextExecutionTime(triggerContext);
        });

    }
}

参考git:https://gitee.com/zhangyizhou/learning-spring-boot-demo.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 框架基础 的相关文章

  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • Google 地图查询返回的 JSON 包含像 \x26 这样的编码字符(如何解码?)

    在 Java 应用程序中 我获取 JSON 来自 Google 地图 其中包含以下字符 x26我想将其转换为其原始字符 据我所知 这是一个 UTF 8 表示法 但我不完全确定 在源 JSON 中 可能会出现各种编码字符 例如 x3c div
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • JTree 节点不会被直观地选择

    不知何故 我无法为我的 JTree 节点启用 选择突出显示 我正在我的项目中使用自定义单元格渲染器 这很可能导致此问题 这是完整的渲染器类代码 protected class ProfessionTreeCellRenderer exten
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 具有多种值类型的 Java 枚举

    基本上我所做的是为国家编写一个枚举 我希望不仅能够像国家一样访问它们 而且还能够访问它们的缩写以及它们是否是原始殖民地 public enum States MASSACHUSETTS Massachusetts MA true MICHI
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮

随机推荐

  • Linux高级实战部署专题篇:ansible自动化运维工具(lnmp自动化实战部署)

    一 ansible环境部署 环境 系统 centos7 主机 4台 1台控制节点 3台被控制节点 1 解析 四台本地解析都要互相做 root ansible 1 vim etc hosts 192 168 222 131 ansible 1
  • Loadrunner11破解详解 .

    使用说明 要以管理员的身份运行 1 正常安装完LR11后 然后双击deletelicense exe 2 然后解压替换其中的2个DLL文件拷贝到 C Program Files HP LoadRunner bin 下替换原有文件 3 进入L
  • anaconda激活环境和退出环境

  • Java面试汇总(四)

    url http www topDesignerStyling com color red size xx large u 最全的Java面试题目下载 u size color url 1 Which of the following li
  • 运行 Python 脚本时传入参数

    转载至 https blog csdn net helloasimo article details 124210144 为了在命令行运行 Python 脚本时传入参数的 采用的方法如下 import argparse if name ma
  • JVM-监控及诊断工具

    本文目录 命令行 jps 查看正在运行的Java进程 jstat 查看JVM统计信息 jinfo 实时查看和修改JVM配置参数 jmap 导出内存映像文件 内存使用情况 jhat JDK自带堆分析工具 jstack 打印JVM中线程快照 j
  • 题目爬取 js

    function collect 内容元素 const content document querySelector content 题目正则 const regexp d 题 n s S 参考答案 A Z 选项正则 const optio
  • Vue3实现Pagination分页组件(一)基础实现

    转载于 Vue3实现Pagination分页组件 一 基础实现 掘金 写在前面 在 B 端的 web 开发中 分页组件或者叫分页器 是较为常用的控件之一 通常配合表格或列表 实现数据量大的情况下 分页拆解数据的功能 由于完整实现的篇幅较大
  • 用c语言编写gps程序,GPS模拟C语言

    A 7654321 B 1714171 C 1711717 D 7177171 48 以下程序的输出是 C include main char a language p p a while p u printf c p u U p A LA
  • 【华为OD机试真题2023B卷 JAVA&JS】采样过滤

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 采样过滤 知识点滑窗 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 在做物理实验时 为了计算物体移动的速率 通过相机等工具周期性的采样物体移动距离 由于工具故障 采样
  • 【C语言】求任意两整数的和入门详解

    今天我们来看这个使用c语言编写的一个简易的求和程序 代码如下 define CRT SECURE NO WARNINGS 1 该行代码用来解决scanf函数报错的 不推荐使用scanf s来修正 因为该解决方案并非适用于所有编译器 incl
  • 极坐标转化

    在数学中 极坐标系是一个二维坐标系统 该坐标系统中任意位置可由一个夹角和一段相对原点 极点的距离来表示 极坐标系的应用领域十分广泛 包括数学 物理 工程 航海 航空以及机器人领域 两点间的关系用夹角和距离很容易表示时 极坐标系便显得尤为有用
  • Spring课件

    容器与 bean 1 容器接口 BeanFactory 接口 典型功能有 getBean ApplicationContext 接口 是 BeanFactory 的子接口 它扩展了 BeanFactory 接口的功能 如 国际化 通配符方式
  • Python自动化

    usr bin env python os system gnome terminal e bash c ls exec bash coding utf 8 import linecache import pyautogui import
  • Nginx(代理)+Tomcat(Java)+Apache(PHP)共用80端口

    解决的核心问题是 使用一个80端口 根据域名或者子域名 同时访问java php运行环境 1 下载nginx 官网下载链接 http nginx org en download html 接下来我以nginx Windows 1 16 0
  • 『学Vue2+Vue3』智慧商城项目

    智慧商城 接口文档 https apifox com apidoc shared 12ab6b18 adc2 444c ad11 0e60f5693f66 doc 2221080 演示地址 http cba itlike com publi
  • 在ubuntu下安装vscode

    ubuntu22 04下通过命令安装vscode 1 为什么不用应用市场直接下载 最近下载ubuntu22 04版本 不知道为啥里面的应用软件下载不了vscode 尝试在网上解决 gt 卸载自带的应用市场 安装另外的一种 结果失败了 导致原
  • 【路由指令】

    一 linux route add net 192 0 0 0 netmask 255 0 0 0 gw 192 180 30 1 sudo route add net 192 180 0 0 netmask 255 255 0 0 gw
  • python爬取今日头条后台数据_爬虫爬取今日头条数据代码实现

    课程链接 讲师的公众号文章 今日头条数据抓取及持久化 完整代码版 含IP和用户代理 mp weixin qq com 课程代码 抓取并持久化user agent工具utils py 对于爬虫工具 需要设置发起请求的user agent im
  • Spring Boot 框架基础

    Spring Boot 框架基础 基础案例 pom xml