参考视频1天搞定SpringBoot+Vue全栈开发

SpringBoot

开发环境热部署

概述

  • 需求:开发环境,代码频繁修改,重启麻烦
  • SpringBoot提供spring-boot-devtools组件,无需手动重启
    • devtools会监听classpath下文件变动,出发Restart类加载器重新加载该类,实现热部署
    • 并不是所有更改都需要重启应用(如静态资源、视图模板),可以通过设置spring.devtools.restart.exclude属性来指定一些文件或目录修改不用重启应用

配置

  • pom.xml中添加dev-tools依赖
  • 使用optional=true表示依赖不会传递,即该项目依赖devtools;其他项目如果引入此项目生成的jar包,则不会包含devtools
1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

这里注意,一定要放到pom.xml的dependencies标签内,而不是dependencyManagement标签内
顺序不重要

  • 检测到变化右上角显示一个小图标,点击Load Maven Changes

    此时右边Maven可以看见Dependencies中就包含了devtools

  • application.properties中添加配置
1
2
3
4
5
6
# 热部署生效
spring.devtools.restart.enabled=true
# 设置重启目录
spring.devtools.restart.additional-paths=src/main/java
# 设置classpath下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude=static/**

到这里Eclipse开发环境就配置好了,但是IDEA还需要配置项目的自动编译

IDEA开发环境热部署额外配置

  • 打开setting,在左边菜单找到Build,Execution,Deployment->Complie,勾选Build project automatically
  • 按**Ctrl+Shift+Alt+/**快捷键调出Maintenance页面,单击Registry,勾选compiler.automake.allow.when.app.running复选框
  • 配置完成后,重启IDEA

SpringBoot Controller

Web入门

  • 创建springboot选项勾选Spring Web选项后,会自动将spring-boot-starter-web依赖加入到pom.xml
  • spring-boot-starter-web启动器主要包括webwebmvctomcatjson等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖
  • webmvcWeb开发的基础框架,jsonJSON数据解析组件,tomcat为自带容器依赖

控制器

  • SpringBoot提供了@Controller@RestController两个注解
  • @Contriller:请求的是页面和数据
  • @RestController:请求的是数据

@Controller

仅作了解,使用起来前后端并不分离,很少用

  • 简单案例
1
2
3
4
5
6
7
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello world";
}
}

@RestController

  • 默认返回json数据
1
2
3
4
5
6
7
8
9
10
@RestController
public class HelloController {
@RequestMapping("/user")
public User getUser() {
User user = new User();
user.setUsername("oyuovo");
user.setPassword("<PASSWORD>");
return user;
}
}

路由映射

  • @RequestMapping:请求映射->主要负责URL的路由映射。它可以添加在Controller类或者具体方法上
  • 如果添加在Controller类上,则该类中所有方法都映射到该URL,如果添加在方法上,则该方法映射到该URL
  • @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性如下:
    • value:请求地址,支持URL模板、正则表达式->常用
    • method:HTTP请求方法->常用
    • consumes:指定请求的Content-Type(媒体类型),如application/json
    • produces:响应的媒体类型
    • params,headers:请求参数和请求头的值

@RequestMapping之value属性

  • 基本使用:支持简单表达式@RequestMapping("/hello")
  • 支持使用通配符:
    • *:匹配任意字符,如@RequestMapping("/getJson/*.json")
    • ?:匹配任意单个字符,如@RequestMapping("hel?lo")
    • **:匹配任意路径,如@RequestMapping("hello/**")
  • 注意
    1. 有通配符的优先级低于没有通配符的,比如/user/add.jsonuser/*.json优先匹配
    2. **的优先级低于有*

@RequestMapping之Method匹配

  • HTTP请求Method:GET,POST,PUT,DELETE
  • 使用案例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      @RequestMapping(value="/getData",method = RequestMethod.GET)
    //可以改写成@GetMapping("/getDAta")
    //value是默认的,可以不写
    public String getData(){
    return "hello";
    }
    - `Method`匹配也可以用`@GetMapping`,`@PostMapping`等注解代替
    ### 参数传递
    - **@RequestParam**
    ```java
    @RequestMapping(value="/getData",method = RequestMethod.GET)
    public String getData(@RequestParam("nickname")String name){//做一个参数映射,这种写法说明参数是必须的
    //public String getData(@RequestParam(value="nickname",required = false)String name){这种写法说明参数不是必要的
    System.out.println("nickname:"+name);
    return 123;
    }

    接下来需要api接口调试,推荐使用apifox

  • @PathVaraible
  • @PathVariable 映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。
    • 一般与@RequestMapping(method = RequestMethod.GET)一起使用
    1
    2
    3
    4
    @RequestMapping("/getUserById/{name}")
    public User getUser(@PathVariable("name") String name){
    return userService.selectUser(name);
    }
  • @RequestBody

    当我们有一个实体entity->User的时候,可以如下使用

    1
    2
    3
    4
    5
    6
    @RequestMapping(value="/getData",method = RequestMethod.POST)
    public String getData(@RequestBody User user){
    //json格式传入
    System.out.println(user);
    return "POST请求";
    }

静态资源访问

  • idea创建的springboot项目中,classpath:/static/目录,静态资源一般放在这个目录下

    前后端分离的项目,一般这里不存放资源

  • 自定义静态资源:
    • application.properties中直接定义过滤规则(也叫虚拟路径)和静态资源位置
    1
    2
    3
    # 第一个斜线代表的时服务器所在的位置
    spring.mvc.static-path-pattern=/static/**
    spring.mvc.resources.static-location=classpath:/static/
    • 此时过滤规则为/static/**,静态资源位置为classpath:/static/

文件上传

  • 原理:
    • 表单enctype="application/x-www-form-urlencoded"(默认)时,form表单中的数据格式为:key=value&key=value
    • 当表单的enctypre="mulltipart/foorm-data"时,传输数据形式如下
  • SpringBoot实现文件上传功能
    • 内置嵌入的tomcat限制的请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb
    • 更改默认值,需要在配置文件中(如application.properties)中加入两个配置:
      1
      2
      spring.servlet.multipart.max-file-size=10MB
      spring.servlet.multipart.max-request-size=10MB
    1. 创建文件上传表单-前端
      1
      2
      3
      4
      <form action="/upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <button type="submit">Upload</button>
      </form>
    2. 处理文件请求
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      import org.springframework.web.bind.annotation.*;
      import org.springframework.web.multipart.MultipartFile;
      import java.io.File;
      import java.io.IOException;

      @RestController
      public class FileUploadController {

      @PostMapping("/upload")
      public String handleFileUpload(@RequestParam("file") MultipartFile file) {
      if (file.isEmpty()) {
      return "Please select a file to upload.";
      }
      try {
      byte[] bytes = file.getBytes();
      String uploadDir = "/path/to/upload/directory/";
      File uploadedFile = new File(uploadDir + file.getOriginalFilename());//一定是目录加文件名称
      file.transferTo(uploadedFile);//transferTo提交
      return "File uploaded successfully!";
      } catch (IOException e) {
      e.printStackTrace();
      return "File upload failed!";
      }
      }
      }
    3. 在配置文件中配置静态资源位置到上传最终位置,就可以在服务器上访问到了

拦截器

  • 常见使用场景:
    • 权限检查:登录检测、进入处理程序检测是否登录
    • 性能监控:记录开始和结束时间
    • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续使用。只要是多个处理程序都需要的,就可以用拦截器实现
  • 使用@HandlerInterceptor接口实现:preHandlepostHandleafterHandle

拦截器定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LoginInterceptor implements HandlerInterceptor{
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throw Exception{
if(条件){
System.ouut.println("通过");
return true;
}else{
System.out.println("不通过");
return false;
}
}
}

拦截器注册

  • addPathPatterns方法定义拦截的地址
  • excludePathPatterns定义排除某些地址不被拦截
  • 添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
  • 如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求
    1
    2
    3
    4
    5
    6
    7
    @Configuration
    public class WebConfigurer implements WebMvcConfiguer{
    @Override
    public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
    }
    }

RESTful服务构建

RESTful介绍

  • 是目前流行的互联网软件服务架构设计风格
  • REST并不是一个标准,更像一组客户端和服务器交互时的架构理念和设计原则,使得Web API更加简洁,更有层次

特点

  • 每一个URI都代表一种资源
  • 客户端使用GETPOSTPUTDEELETE四种表示操作方式的动词对服务端资源进行操作
    • GET:获取资源
    • POST:新建资源(也可以更新资源)
    • PUT:更新资源
    • DEELETE:删除资源
  • 通过此操作资源的表现形式来实现服务端请求操作
  • 资源的表现形式是JSON或者HTML
  • 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每一个请求都包含必需的信息

RESTful API

  • 符合RESTful规范的Web API需要具备如下两个关键特性:
    • 安全性:安全的方法被期望不会产生任何副作用,当使用GET操作获取资源时,不会引起资源本身的改变,也不会引起服务器状态的改变
    • 幂等性:幂等的方法保证了重复进行一个请求和一次请求的效果相同(并不是指响应总是相同的,而是服务器上的资源状态从第一次请求后就不会再改变了)

      数学上幂等性是指N次变换和一次变换相同

HTTP Method

  • 一些常见的HTTP方法在RESTful风格下的使用
  • 一些常见的状态码(在HTTP文章也有类似,这个应该更全)

Spring Boot实现RESTful API


  • 在RESTful架构中给,每个网址代表一种资源,所以URI中建议不要包含动词,只包含名词(往往与数据库的表格名对应)

Swagger

此处为swagger2讲解,与最新springboot3和4可能不兼容,还需自行比对,后续可能会修改

  • Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的web服务,是非常流行的API表达工具
  • Swagger自动生成完善的RESTful API文档,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API

使用Swagger

  1. 放入pom.xml文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
    </dependency>
    <dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
    </dependency>
  2. 配置Swagger

    在config文件夹中加入SwaggerConfig.java文件作为配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Configuration //告诉spring容器这是一个配置类
    @EnableSwagger2 //启用Swagger2
    public class SwaggerConfig {
    @Bean
    public Docket docket(Environment env) {
    Profiles profiles = Profiles.of("dev", "test");
    boolean enable = env.acceptsProfiles(profiles);
    return new Docket(DocumentationType.SWAGGER_2)
    .apiInfo(apiInfo())
    .enable(enable)
    .select()
    .apis(RequestHandlerSelectors.basePackage("com.example.controller"))//com包下面所有api都交给swagger2管理
    .build();
    }
    private ApiInfo apiInfo() {
    return new ApiInfo(
    .title("演示项目API")//title
    .description("学习Swagger2的演示项目")//描述
    .version("1.0")//版本
    .builld;
    }
    }
  3. 在properties中写入:

    1
    spring.mvc.pathmatch.matching-strategy=ant_path_matcher
  4. 打开localhost:8080/swagger-uui.html即可

Swagger常用注解