SpringBoot相关
SpringBoot
开发环境热部署
概述
- 需求:开发环境,代码频繁修改,重启麻烦
- SpringBoot提供
spring-boot-devtools组件,无需手动重启- devtools会监听classpath下文件变动,出发Restart类加载器重新加载该类,实现热部署
- 并不是所有更改都需要重启应用(如静态资源、视图模板),可以通过设置
spring.devtools.restart.exclude属性来指定一些文件或目录修改不用重启应用
配置
- 在
pom.xml中添加dev-tools依赖 - 使用
optional=true表示依赖不会传递,即该项目依赖devtools;其他项目如果引入此项目生成的jar包,则不会包含devtools
1 | <dependency> |
这里注意,一定要放到pom.xml的dependencies标签内,而不是dependencyManagement标签内
顺序不重要
- 检测到变化右上角显示一个小图标,点击
Load Maven Changes此时右边Maven可以看见Dependencies中就包含了devtools
- 在
application.properties中添加配置
1 | # 热部署生效 |
到这里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启动器主要包括web、webmvc、tomcat、json等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带容器依赖
控制器
SpringBoot提供了@Controller和@RestController两个注解@Contriller:请求的是页面和数据@RestController:请求的是数据
@Controller
仅作了解,使用起来前后端并不分离,很少用
- 简单案例
1 |
|
@RestController
- 默认返回
json数据
1 |
|
路由映射
@RequestMapping:请求映射->主要负责URL的路由映射。它可以添加在Controller类或者具体方法上- 如果添加在
Controller类上,则该类中所有方法都映射到该URL,如果添加在方法上,则该方法映射到该URL @RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性如下:value:请求地址,支持URL模板、正则表达式->常用method:HTTP请求方法->常用consumes:指定请求的Content-Type(媒体类型),如application/jsonproduces:响应的媒体类型params,headers:请求参数和请求头的值
@RequestMapping之value属性
- 基本使用:支持简单表达式
@RequestMapping("/hello") - 支持使用通配符:
*:匹配任意字符,如@RequestMapping("/getJson/*.json")?:匹配任意单个字符,如@RequestMapping("hel?lo")**:匹配任意路径,如@RequestMapping("hello/**")
- 注意
- 有通配符的优先级低于没有通配符的,比如
/user/add.json比user/*.json优先匹配 - 有
**的优先级低于有*的
- 有通配符的优先级低于没有通配符的,比如
@RequestMapping之Method匹配
- HTTP请求
Method:GET,POST,PUT,DELETE等 - 使用案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//可以改写成@GetMapping("/getDAta")
//value是默认的,可以不写
public String getData(){
return "hello";
}
- `Method`匹配也可以用``,``等注解代替
### 参数传递
- ****
```java
public String getData(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
public User getUser( String name){
return userService.selectUser(name);
}- 一般与
- @RequestBody
当我们有一个实体entity->User的时候,可以如下使用
1
2
3
4
5
6
public String getData( 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
2spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
- 创建文件上传表单-前端
1
2
3
4<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload</button>
</form> - 处理文件请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
public class FileUploadController {
public String handleFileUpload( 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!";
}
}
} - 在配置文件中配置静态资源位置到上传最终位置,就可以在服务器上访问到了
拦截器
- 常见使用场景:
- 权限检查:登录检测、进入处理程序检测是否登录
- 性能监控:记录开始和结束时间
- 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续使用。只要是多个处理程序都需要的,就可以用拦截器实现
- 使用
@HandlerInterceptor接口实现:preHandle、postHandle、afterHandle
拦截器定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class LoginInterceptor implements HandlerInterceptor{
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
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
public class WebConfigurer implements WebMvcConfiguer{
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}
RESTful服务构建
RESTful介绍
- 是目前流行的互联网软件服务架构设计风格
- REST并不是一个标准,更像一组客户端和服务器交互时的架构理念和设计原则,使得
Web API更加简洁,更有层次
特点
- 每一个
URI都代表一种资源 - 客户端使用
GET、POST、PUT、DEELETE四种表示操作方式的动词对服务端资源进行操作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
放入
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>配置
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//告诉spring容器这是一个配置类
//启用Swagger2
public class SwaggerConfig {
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;
}
}在properties中写入:
1
spring.mvc.pathmatch.matching-strategy=ant_path_matcher
打开
localhost:8080/swagger-uui.html即可
Swagger常用注解

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Blog of Sof!
评论






