Skip to main content

Springboot

学习目标:

  1. Springboot + MybatisPlus
  2. 云环境配置&部署

前置知识& 背景

MVC

技术-841713359053_

Spring

spring.io

项目初始化,可以直接使用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)的概念,使得引入相关依赖变得更加简单,同时也能够避免版本冲突等问题。

部署

一般会用宝塔面板来部署

软件商店-安装的项目有:

  1. nginx 2.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.

配置

热更新

  1. pom文件中添加配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
  1. IEDA设置 image.png 早一点的IDEA是在maintenance面板里开启compiler.XXX.automake.running(记不太清了),maintenance的面板可以直接在设置里搜快捷键 image.png

  2. 配置文件

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等类型的数据。
controller/HelloController.java
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 请求 匹配路径";
}
}

entity/User.java
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"

拦截器

  1. 添加interceptor
interceptor/LoginInterceptor.java
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;
}
}

  1. 添加config
config/WebConfig.java
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/**");
}
}