Springboot
学习目标:
- Springboot + MybatisPlus
- 云环境配置&部署
前置知识& 背景
MVC
Spring
项目初始化,可以直接使用Spring Initializr生成。
在配置的时候,有 gradle 和 maven 两种方式。
一般来说 gradle 在灵活性和性能方面都比 maven 稍微优秀一点~ 但是 maven 配置,使用会比较简单。 pom.xml: maven项目的配置 build.gradle: gradle项目的相关配置,用于定义项目的结构、依赖项、任务、以及其他构建相关的设置。
spring 和 Spring Boot的区别
配置复杂度:
Spring框架需要开发人员手动进行大量的配置。对于一个简单的应用程序,你可能需要配置数据源、Web服务器、日志记录等等。 Spring Boot通过约定优于配置的原则,旨在简化Spring应用的初始搭建和开发过程。Spring Boot提供了各种自动配置选项,因此你只需专注于业务逻辑而不必处理繁琐的配置。纯java配置,不需要xml配置。简化maven配置。
内嵌服务器:
在Spring中,你需要手动配置并部署外部的Web服务器(如Tomcat、Jetty等)。 Spring Boot内置了常见的Web服务器(如Tomcat、Jetty),这意味着你可以将应用程序打包成一个可执行的JAR文件,并直接运行它,无需另外安装或配置Web服务器。Spring的话,你还得打包一个war包。
依赖管理:
在Spring中,你需要手动管理项目依赖。 Spring Boot借助“起步依赖”(Starter)的概念,使得引入相关依赖变得更加简单,同时也能够避免版本冲突等问题。
部署
一般会用宝塔面板来部署
软件商店-安装的项目有:
- nginx 2.2+
- mysql 5.7+
数据库
文件 可以安装一些 jdk 等
tar zxvf [file].gz
#z means (un)z̲ip.
#x means ex̲tract files from the archive.
#v means print the filenames v̲erbosely.
#f means the following argument is a f̱ilename.
配置
热更新
- pom文件中添加配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
IEDA设置 早一点的IDEA是在maintenance面板里开启compiler.XXX.automake.running(记不太清了),maintenance的面板可以直接在设置里搜快捷键
配置文件
spring.application.name=demo
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
spring.devtools.restart.additional-paths=src/main/java
swagger
@ApiOperation("获取用户列表") config => Swagger2Config @Configuration @EnableSwagger2
<dependencies>
<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>
</dependencies>
基础知识
decoration
controller
@Controller || @RestController
- 这两种注解来标识此类负责接收和处理HTTP请求。
- 如果请求的是页面和数据,使用@Controller;如果只是请求数据,使用@RestController。 在目前前后端分离的情况下,一般都是用RestController了。默认情况下,@RestController注解会将返回的数据转换为JSON格式。
RequestMapping
该注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。 如果加在Controller类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。 如果添加在方法上,则只对当前方法有效。
@RestController
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "你好吗";
}
}
//等价于
@RestController
public class HelloController {
@getMapping("/hello")
public String hello() {
return "你好吗";
}
}
RequestParam & PathVariable & RequestBody
RequestParam
- 将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QuerySting
- 当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略。
PathVariable
- 处理动态的URL
RequestBody
- 参数来自于RequestBody中,即请求体。一般用于处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。eg: application/json, application/xml等类型的数据。
package com.example.demo.controller;
import entity.User;
import org.springframework.web.bind.annotation.*;
@RestController
// http://localhost:8080/hello?nickname=amy&gender=female
public class HelloController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello(String nickname, String gender) {
System.out.println(gender);
return "你好吗?" + nickname+", 我的性别是"+gender;
}
@RequestMapping(value = "/demo1", method = RequestMethod.GET)
// RequestParam中的require默认为true
public String getDemo1(@RequestParam(value = "nickname", required = false) String name) {
return "RequestParam做变量映射:" + name;
}
@RequestMapping(value = "/post-demo1", method = RequestMethod.POST)
// RequestParam中的require默认为true
public String postDemo1() {
return "最简单的post请求";
}
@RequestMapping(value = "/post-demo2", method = RequestMethod.POST)
// RequestParam中的require默认为true
public String postDemo2(String name, String gender) {
return "post请求带参数"+name+"," + gender;
}
@RequestMapping(value = "/post-demo3", method = RequestMethod.POST)
public String postDemo3(User user) {
return "post请求带参数-User对象-form-data的格式:"+user.toString();
}
@RequestMapping(value = "/post-demo4", method = RequestMethod.POST)
public String postDemo4(@RequestBody User user) {
System.out.println(user);
return "post请求带参数-User对象-JSON格式:"+user.toString();
}
@GetMapping("/reg-demo/?")
// ** 匹配通路径 * 一个单词 ?一个字母
public String regDemo() {
return "get 请求 匹配路径";
}
}
package entity;
public class User {
private String username;
private String gender;
public String getUsername() {
return this.username;
}
public String getGender() {
return this.gender;
}
public void setUsername(String username){
this.username = username;
}
public void setGender(String gender){
this.gender = gender;
}
@Override
public String toString() {
return "User [username=" + username + ", gender=" + gender + "]";
}
}
静态资源获取
- 自定义访问路径
spring.mvc.static-path-pattern=/images/**
- 如果是自己创建文件夹,需要再加一个配置
spring.web.resources.static-locations=classpath:/static
文件上传
Spring boot 工程嵌入的tomcat限制了请求的文件大小 每个文件的配置最大为1Mb 单词请求的文件的的总数不能大于10Mb 如果需要配置的话:
spring.servlet.multipart.max-file-size=30MB
spring.servlet.multipart.max-request-size=50MB
上传的格式类型需要改成"form-data"
拦截器
- 添加interceptor
package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class LoginInterceptor implements HandlerInterceptor {
// 登录拦截器的具体实现
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在这里编写登录拦截的逻辑
// 比如检查用户是否已经登录,如果没有登录,则跳转到登录页面
System.out.println("LoginInterceptor");
return true;
}
}
- 添加config
package com.example.demo.config;
import com.example.demo.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
// registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}