SpringBoot设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

SpringBoot(微框架)=SpringMVC(控制器)+Spring(项目管理)

特点:

(1)创建独立的Spring应用程序

(2)嵌入的Tomcat,无需部署WAR文件

(3)简化Maven配置

(4)自动配置Spring

(5)没有XML配置

一、搭建第一个SpringBoot环境

1、开发步骤(手动)

创建一个maven项目

1)引入依赖

spring-boot-starter-parent:继承springboot的父项目

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.4.4</version>
  5. <relativePath/> <!-- lookup parent from repository -->
  6. </parent>

spring-boot-starter-web:引入web支持

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>

2)引入springboot的配置文件:resources/application.properties或者resources/application.yaml

3)开发springboot入口类:com.icucoder.learn.LearnApplication.class(必须在父包中)

4)开发Controller测试:(同springmvc)

注意:如果要使用jsp文件,则需要在java和resources同级目录新建webapp目录。

2、开发步骤(自动)

使用intellijidea开发工具,新建一个Spring Initializr项目,然后开发Controller测试。

二、springboot中配置文件拆分

在实际开发过程中生成环境和测试环境有可能是不一样的,因此将生产环境中的配置和测试环境中的配置拆分是必要的。将公共配置放入主配置文件中,将不同配置放入不同环境配置文件中。在主配置文件中使用:spring.profiles.active=dev激活不同环境的配置文件。

主:application.properties

开发:application-dev.properties

生产:application-prod.properties

三、springboot中工厂特性创建对象

1、java config方式自定义java对象管理

1)创建单个自定义对象

@Component:通用组件对象的创建注解

  @Service:标识业务层组件创建

  @Controller:控制器对象创建

  @Repository:用来创建DAO组件注解

以上一般用于自定义的类的对象的创建。

2)一次性创建多个组件对象(包含复杂对象):@Configuration

@Configuration是配置注解(也是派生注解),修饰范围:用在类上,相当于曾经的spring.xml。springboot会把该类中每一个方法(方法上需要加上@Bean标签,用来创建这个对象在工厂中一个实例,默认是单例)当做一个对象的创建。

  1. @Configuration
  2. public class BeansConfig {
  3.  
  4. @Bean
  5. public Calendar getCalendar() {
  6. return Calendar.getInstance();
  7. }
  8. }

一般用于框架提供的类的对象的创建。

3)在使用时使用@Import导入指定对象

  1. @RestController
  2. @RequestMapping("/learn")
  3. @Import(Company.class)//有一个实体类Company
  4. public class LearnController {
  5.  
  6. @Autowired
  7. Company company;
  8.  
  9. @RequestMapping("test")
  10. public String test() {
  11. System.out.println("company:" + company);
  12. return "user test1";
  13. }
  14. }

2、xml方式配置:通过xml配置管理java对象

新建一个spring的xml,如spring.xml,使用<bean/>标签,然后再启动类上加上@ImportResource("spring.xml")

四、springboot中注入方式

1、属性注入

使用@Value注解进行属性注入

1)在配置文件中定义变量:

  1. #application.properties中定义变量
  2. users=mayun

2)然后再Controller中使用@Value进行注入:

  1. @RestController
  2. @RequestMapping("/learn")
  3. public class LearnController {
  4. @Value("${names}")
  5. private String name;
  6.  
  7. @RequestMapping("test")
  8. public String test() {
  9. return name;
  10. }
  11. }

  注入基本类型:String、日期类型、八种基本类型使用@Value形式注入

2、对象注入

使用@ConfigurationProperties注解进行对象注入

1)在配置文件中定义对象:

  1. #application.properties中定义对象
  2. user.id=7
  3. user.name=mayun
  4. user.age=19
  5. user.email=admin@qq.com

2)编写一个基本类User,使用@ConfigurationProperties进行注入:

  1. @Component
  2. @ConfigurationProperties(prefix = "user")
  3. public class User {
  4. private Integer id;
  5. private String name;
  6. private Integer age;
  7. private String email;
  8. //略去构造方法和setter/getter方法
  9. }

3)然后再Controller中使用:

  1. @RestController
  2. @RequestMapping("/learn")
  3. public class LearnController {
  4. @Autowired
  5. private User user;
  6.  
  7. @RequestMapping("test")
  8. public User test() {
  9. return user;
  10. }
  11. }

  在基本类上不使用@ConfigurationProperties,而在基本类中的每个成员变量上可以使用@Value进行注入,但是比较麻烦。

  可以使用构建源数据来在配置文件中智能提示属性:

  1. <!--自定义注入时构建元数据-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. </dependency>

3、自动注入

1)@Autowired

2)@Resource

五、springboot中集成jsp页面模板

默认推荐视图模板为Thymelaf,类似于freemarker。

1、与jsp集成步骤

1)引入依赖(springboot依赖略)

  1. <!--jstl 和 配置内嵌tomcat解析jsp-->
    <dependency>
  2. <groupId>javax.servlet</groupId>
  3. <artifactId>jstl</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.apache.tomcat.embed</groupId>
  7. <artifactId>tomcat-embed-jasper</artifactId>
  8. </dependency>

2)配置jsp运行插件

  1. <plugin>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-maven-plugin</artifactId>
  4. </plugin>

3)在application.properties中配置视图解析的前缀和后缀

  1. spring.mvc.view.prefix=/
  2. spring.mvc.view.suffix=.jsp

4)配置启动的working directory为ModuleFileDir(此为idea缺陷,新版本好像不需要设置了)

5)在与java和resources同级目录新建webapp目录,并新建一个file.jsp文件:

6)编写Controller进行测试:http://127.0.0.1:8090/learn/test

  1. @Controller
  2. @RequestMapping("/learn")
  3. public class LearnController {
  4.  
  5. @RequestMapping("test")
  6. public String test() {
  7. return "file";
  8. }
  9. }

2、jsp页面热部署

热部署:在不需要重启服务器情况下将jsp页面修改立即生效的过程

在springboot中默认jsp页面部署方式使用的是生产模式部署,修改之后必须重启服务器才能生效。

使用下述配置可以改为jsp热部署:

  1. #jsp页面热部署
  2. server.servlet.jsp.init-parameters.development=true

六、springboot中集成Thymeleaf页面模板

  Thymeleaf是一个用于web和独立环境的现代服务器端Java模板引擎。它是跟Velocity、FreeMarker类似的模板引擎,它可以完全替代JSP,相较与其他模板引擎,Thymeleaf在有网络和无网络的环境下皆可运行。即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。

1、与Thymeleaf集成步骤

1)引入依赖(springboot依赖略)

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>

2)在application.yaml进行属性配置

  1. #使用模板目录
  2. spring.thymeleaf.prefix=classpath:/templates/
  3. #使用模板后缀
  4. spring.thymeleaf.suffix=.html
  5. #使用模板编码
  6. spring.thymeleaf.encoding=UTF-8
  7. #开始thymeleaf模板
  8. spring.thymeleaf.enabled=true
  9. #使用模板响应类型
  10. spring.thymeleaf.servlet.content-type=text/html

3)在与java和resources子目录新建templates目录,并新建一个index.html文件:

注意:templates目录必须经过控制器才能访问,而static则不需要

(1)html中加入thymeleaf命令空间

  1. <html lang="en" xmlns:th="http://www.thymeleaf.org">

4)编写Controller进行测试:http://127.0.0.1:8090/learn/test

  1. @Controller
  2. @RequestMapping("/main")
  3. public class MainController {
  4. @RequestMapping("/")
  5. public String index(){
  6. return "index";
  7. }
  8. }

2、Thymeleaf语法入门

七、springboot集成logback日志展示

1、基本概念

logback是log4j创始人设计的又一个开源日志组件。轻量级、易用。

1)日志级别(级别越低输出日志信息越多):ALL<DEBUG<INFO<WARN<ERROR<OFF

2)项目中日志分类:

(1)项目根日志(rootLogger):全局日志,一个项目只有一个根日志。

(2)项目中子日志(logger):包级别日志,一个项目中可以有n多个子日志。

2、日志配置

注意:springboot框架中默认根日志为INFO

  1. logging:
  2. level:
  3. root: debug #指定根日志级别(一般不推荐修改根日志,输出信息太多,推荐使用子日志)
  4. com.icucoder.dao: debug #z指定某个包中日志
  5. file:
  6. name: aa.log #指定日志名称
  7. path: ./ #指定日志文件目录

1)自动引入日志相关包

  1. private static final Logger log=LoggerFactory.getLogger(UserService.class);

2)使用插件包

插件包配置如下,然后输入logd或者logi会自动引入日志相关包

八、springboot开启全局热部署

原理:开启两个类加载器ClassLoader,修改后进行类加载器的切换

1、官方提供的两种方式

1)springboot-devtools

(1)引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-devtools</artifactId>
  4. </dependency>

(2)开启idea自动编译功能

(3)开启idea中允许在程序运行过程中运行交换类加载器

ctrl+alt+shift+/

(4)重启服务器,有restartMain即有效

2)spring-loaded

3)JRebel(第三方)

九、springboot中切面编程

springboot是对原有项目中spring框架和springmvc的进一步封装,因此在springboot中同样支持spring框架中AOP切面编程,不过在springboot中为了快速开发仅仅提供了注解方式的切面编程。

1、引入依赖

  1. <dependency>
  2. <groupId>org.springframeworkk.boot</groupId>
  3. <artifactId>spring-boot-starter-aop</artifactId>
  4. </dependency>

2、相关注解

@Aspect 用在类上,代表这个类是一个切面

@Before用在方法上,代表这个方法是一个前置通知方法

@After用在方法上,代表这个方法是一个后置通知方法

@Around用在方法上,代表这个方法是一个环绕方法

1)前置和后置通知使用

前置通知和后置通知都没有返回值,方法参数都为joinpoint。

2)环绕通知使用

环绕通知存在返回值,参数为ProceedJoinPoint,如果不执行放行,不会执行目标方法,一旦放行必须将目标方法的返回值返回,否则调用者无法接受返回数据。

3)切入点表达式种类

(1)execution方法级别

(2)within类级别

(3)@annotation基于注解的切入点表达式

十、springboot中文件上传

 文件上传指的就是将用户本地计算机中文件通过网络的形式上传到服务器上的过程。

1、springboot中开发文件上传功能

1)开发一个可以进行文件上传的页面(这里如果采用前后端分离的项目则不需要

  其中form表单提交方式必须为post,form的enctype属性等于application/x-www-form-urlencoded表示文本,等于multipart/form-data表示二进制。

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>文件</title>
  6. </head>
  7. <body>
  8. <h3>文件上传</h3>
  9. <form action="${pageContext.request.contextPath}/file/upload" method="post" enctype="multipart/form-data">
  10. <input type="file" name="file"/>
  11. <input type="submit" value="开始上传">
  12. </form>
  13. </body>
  14. </html>

2)开发Controller,其方法的使用MultipartFile来接收文件,并放入指定的目录

  1. @Controller
  2. @RequestMapping("/file")
  3. public class FileController {
  4. @RequestMapping("/")
  5. public String index() {
  6. return "file";
  7. }
  8.  
  9. @RequestMapping("/upload")
  10. public String upload(MultipartFile file, HttpServletRequest request) throws IOException {
  11. String realPath = request.getSession().getServletContext().getRealPath("/file");
  12. System.out.println(realPath);
  13. file.transferTo(new File(realPath, file.getOriginalFilename()));
  14. return "redirect:/file.jsp";
  15. }
  16. }

 注意:文件上传其他细节处理基本同SpringMVC

文件上传大小限制:

  1. #文件上传大小限制配置 bytes
  2. spring.servlet.multipart.max-file-size=10240

十一、springboot中文件下载

 用户将服务器中文件下载到自己本地计算机中过程称之为文件下载。

1、springboot中开发文件下载功能

1)定位哪些文件可以被文件下载

2)将需要下载文件放入指定下载目录中

3)开发一个页面提供文件下载链接(一个请求只能对应一个响应,处理文件下载时方法不能有返回(即跳转页面,因为跳转页面也是一次响应),因为下载是文件响应流)

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>文件</title>
  6. </head>
  7. <body>
  8. <h3>文件下载</h3>
  9. <a href="${pageContext.request.contextPath}/file/download?fileName=init">下载</a>
  10. </body>
  11. </html>
 4)开发下载的Controller
  1. @Controller
  2. @RequestMapping("/file")
  3. public class FileController {
  4. @RequestMapping("/")
  5. public String index() {
  6. return "file";
  7. }
  8.  
  9. @RequestMapping("/download")
  10. public String download(String fileName, HttpServletRequest request, HttpServletResponse response) throws IOException {
  11. //String realPath = request.getSession().getServletContext().getRealPath("/file");//servlet-api 2.5规范
  12. String realPath = request.getServletContext().getRealPath("/file");//3.0+规范
  13. System.out.println(realPath);
  14. //通过文件输入流读取文件
  15. FileInputStream is = new FileInputStream(new File(realPath, fileName));//文件内容字符编码处理
  16. response.setContentType("text/plain;charset=UTF-8");
  17. //获取响应输出流
  18. ServletOutputStream os = response.getOutputStream();
  19. //附件形式下载 attachment 附件,inline 在线打开
  20. response.setHeader("content-disposition", "attachment;fileName=" + fileName);
  21. //处理下载流复制-使用工具类
  22. IOUtils.copy(is, os);
  23. IOUtils.closeQuietly(is);
  24. IOUtils.closeQuietly(os);
  25. return "redirect:/file.jsp";
  26. }
  27. }

十二、拦截器

类似于javaweb中的Filter,用来对请求进行拦截,可以将多个Controller中执行的共同代码放入拦截器中执行,减少Controller类中代码的冗余。

特点:拦截器只能拦截控制器的相关请求,不能拦截静态资源和页面的相关请求;请求发送经过拦截器,请求响应也经过拦截器;拦截器可以中断用户的请求;拦截器可以针对性的拦截某些控制器的请求。

1、springboot1.x开发拦截器步骤

1)实现HandlerInterceptor接口,并实现接口中的方法

  请求经过拦截器会优先进入拦截器中的preHandle方法,执行preHandle方法中的内容;如果preHandle返回为true,代码放行请求(会执行当前请求对应的控制器中的方法,当控制器中的方法执行结束之后,会返回拦截器中,并执行拦截器中postHandle方法,postHandle执行完成之后,会响应请求,同时在响应请求完成后会执行afterCompletion方法),如果返回false,则中断请求。

  1. public class MyInterceptor implements HandlerInterceptor {
  2. @Override
  3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  4. return false;
  5. }
  6.  
  7. @Override
  8. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  9.  
  10. }
  11.  
  12. @Override
  13. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  14.  
  15. }
  16. }

2)新建配置类,继承WebMvcConfigurerAdapter(已过时),配置拦截器。

2、springboot2.x开发拦截器步骤

1)实现HandlerInterceptor接口,并实现接口中的方法

  请求经过拦截器会优先进入拦截器中的preHandle方法,执行preHandle方法中的内容;如果preHandle返回为true,代码放行请求(会执行当前请求对应的控制器中的方法,当控制器中的方法执行结束之后,会返回拦截器中,并执行拦截器中postHandle方法,postHandle执行完成之后,会响应请求,同时在响应请求完成后会执行afterCompletion方法),如果返回false,则中断请求。

2)新建配置类实现WebMvcConfigurer的方法addInterceptors并加@Configuration注解。

  1. @Configuration
  2. public class MyInterceptorConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addInterceptors(InterceptorRegistry registry) {
  5. //拦截所有:/**;排除指定拦截:/code/**
  6. registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/code/**");
  7. }
  8. }
  9.  

3)多个拦截器的执行顺序。

拦截器栈:

十三、自动配置原理

十四、部署方式(war|jar)

1、war

一旦使用war包部署,application.yml中配置的port,context-path就失效了,访问时使用打成war包的名字和外包tomcat端口号进行访问项目。
1)修改pom.xml的packaging为war
  1. <packaging>war</packaging>

2)在插件中指定入口类的位置

  1. <plugins>
  2. <plugin>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-maven-plugin</artifactId>
  5. <!--使用热部署出现中文乱码解决方案-->
  6. <configuration>
  7. <fork>true</fork>
  8. <!--增加jvm参数-->
  9. <jvmArguments>Dfile.encoding=UTF-8</jvmArguments>
  10. <!--指定入口类-->
  11. <mainClass>com.icucoder.thymeleaf.ThymeleafApplication</mainClass>
  12. </configuration>
  13. </plugin>
  14. <!--在这里修改版本-->
  15. <plugin>
  16. <groupId>org.apache.maven.plugins</groupId>
  17. <artifactId>maven-resources-plugin</artifactId>
  18. <version>2.4.3</version>
  19. </plugin>
  20. </plugins>

3)排除内嵌的tomcat

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-tomcat</artifactId>
  4. <scope>provided</scope><!--排除内嵌的tomcat-->
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.tomcat.embed</groupId>
  8. <artifactId>tomcat-embed-jasper</artifactId>
  9. <scope>provided</scope><!--去掉使用内嵌tomcat解析jsp,如果使用thymeaf则不需要-->
  10. </dependency>

4)配置入口类

  1. //继承SpringBootServletInitializer,然后覆盖configure方法
  2. @SpringBootApplication
  3. public class ThymeleafApplication extends SpringBootServletInitializer {
  4.  
  5. public static void main(String[] args) {
  6. SpringApplication.run(ThymeleafApplication.class, args);
  7. }
  8.  
  9. protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
  10. return builder.sources(ThymeleafApplication.class);
  11. }
  12. }

2、jar

 1)修改pom.xml的packaging为jar
 或者默认
 2)如果使用jar包部署,并且有文件上传/下载,则需要将目录映射到jar以外的目录。
配置文件application.properties中定义目录变量,然后在代码中使用@Value注解获得变量的值。
注意:
 
 
 
 
 
 
 

SpringBoot入门一:基础知识(环境搭建、注解说明、创建对象方法、注入方式、集成jsp/Thymeleaf、logback日志、全局热部署、文件上传/下载、拦截器、自动配置原理等)的更多相关文章

  1. 04springMVC结构,mvc模式,spring-mvc流程,spring-mvc的第一个例子,三种handlerMapping,几种控制器,springmvc基于注解的开发,文件上传,拦截器,s

     1. Spring-mvc介绍 1.1市面上流行的框架 Struts2(比较多) Springmvc(比较多而且属于上升的趋势) Struts1(即将被淘汰) 其他 1.2  spring-mv ...

  2. struts2 基础3 文件上传、拦截器

    文件上传: 1.将头设置为enctype=”multipart/form-data” <form action="${pageContext.request.contextPath } ...

  3. 一、手把手教你docker搭建fastDFS文件上传下载服务器

    在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...

  4. Nginx + Lua搭建文件上传下载服务

    收录待用,修改转载已取得腾讯云授权 最新腾讯云技术公开课直播,提问腾讯W3C代表,如何从小白成为技术专家?点击了解活动详情 作者 | 庄进发 编辑 | 迷鹿 庄进发,信息安全部后台开发工程师,主要负责 ...

  5. SpringMVC入门一:基础知识(依赖、注解、文件上传/下载、拦截器、异常处理等)

    为了使Spring可插入MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作 ...

  6. SpringBoot图文教程4—SpringBoot 实现文件上传下载

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  7. springboot文件上传下载简单使用

    springboot的文件上传比较简单 一.使用默认的Resolver:StandardServletMultipartResolver controller package com.mydemo.w ...

  8. SpringBoot文件上传下载

    项目中经常会有上传和下载的需求,这篇文章简述一下springboot项目中实现简单的上传和下载. 新建springboot项目,前台页面使用的thymeleaf模板,其余的没有特别的配置,pom代码如 ...

  9. spring mvc注解文件上传下载

    需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action=&q ...

随机推荐

  1. LeetCode.241

    241. 为运算表达式设计优先级 题目大意 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 + - * 思路: ...

  2. Mysql Json函数之搜索 (三)

    本节中的函数对JSON值执行搜索操作,以从其中提取数据,报告数据是否在其中的某个位置或报告其中的数据的路径. JSON_CONTAINS(target, candidate[, path]) 通过返回 ...

  3. Android利用zxing生成二维码

    感谢大佬:https://blog.csdn.net/mountain_hua/article/details/80646089 **gayhub上的zxing可用于生成二维码,识别二维码 gayhu ...

  4. 从StoryBoard加载控制器

    1.创建窗口self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];2.加载控制器从StoryBoard ...

  5. @property增强

    1.@property增强 自从Xcode 4.x后,@property可以同时生成setter和getter的声明和实现 @interface Person : NSObject { int _ag ...

  6. shell脚本三剑客之sed

    shell脚本之sed命令 1.概述 2.工作流程 3.命令格式 4.具体操作 1.概述: 1.sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流 2.sed编辑器 ...

  7. web虚拟主机、日志分割以及日志分析

    目录 一.构建虚拟web主机 1.1 概述 1.2 支持的虚拟主机类型 1.3 部署虚拟主机步骤 1.3.1 基于域名的虚拟主机 (1)为虚拟主机提供域名解析 (2)为虚拟主机准备网页文档 (3)添加 ...

  8. docker基础——3.存储卷

    把宿主机的目录或文件链接到容器的目录或文件,可以避免写时复制对高I/O操作的影响,也避免容器销毁时数据丢失. 1. 只指定容器的目录位置,-v docker run -it --name bbox1 ...

  9. python小白记录二 ——自动化测试selenium中配置浏览器

    1.根据不同的浏览器 下载不同的驱动,下面是谷歌的驱动 下载地址:ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)     ...

  10. Solution -「ZJOI 2020」「洛谷 P6631」序列

    \(\mathcal{Description}\)   Link.   给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...