Loading

spring-boot学习记录

学习参考网站

1天搞定SpringBoot+Vue全栈开发-bilibili


准备

项目热部署

视频中的idea版本较老,热部署实现参考IDEA2021 热部署-知乎

修改默认端口

src/main/resources/application.properties 文件中添加 server.port=80


相关知识

MVC模式(model-controller-view)

mvc模式

控制器

一个控制器文件例子

@RestController //标志控制器
public class HelloController {
//  GET: http://localhost/hello?nickname=xxx
    @RequestMapping(value = "/hello",method = RequestMethod.GET) //指明访问方法
    public String hello(@RequestParam(name = "nickname", required = false) String name){
        return "你好" + name;
    }
/*  POST: http://localhost/hellopost3  
          body:{
                  "username": "林霞",
                  "password": "esse"
                } */
    @PostMapping("/hellopost3")
    public String helloPost(@RequestBody User user){
        System.out.println(user);
        return "hello";
    }
}

两种注解

@Controller
请求页面+数据,要求返回界面
@RestController
只请求数据,前后分离适用
返回的对象会转化成json格式

路由映射

  • vaule
  • method
    规定请求方法
    e.g. method = RequestMethod.GET
    也可使用@GetMapping替代

参数传递

  • 直接在函数中添加与前端参数名称相同的名称的参数即可
    e.g.
public String hello(String nickname)

即可获取地址栏/body中的nickname数据(/hello?nickname=xxx)

  • 若参数名称不同,也可使用 @RequestParam注解
    e.g.
public String hello(@RequestParam("nickname") String name)

此时nickname参数变为必须项,可添加参数required = false变为可选

实体类

如果需要传递的参数很多呢?全部写在参数处太麻烦,此时需要创建一个实体类来封装这些参数
e.g. src/main/java/com/example/helloworld/entity/User.java
此时只需要在函数中将User作为参数即可

// 注意传过来的参数要与User中定义的参数相同
@PostMapping("/hellopost3")
    public String helloPost(User user){
        System.out.println(user);
        return "hello";
    }

参数名需一致

  • 若前端传递的为json类型数据,需添加注解 @RequestBody

静态资源访问

前后端的分离无需用

默认 将文件放在 src/main/resources/static目录下,即可通过地址栏进行访问
可在 src/main/resources/application.properties文件中添加以下内容

# 配置访问地址,静态资源需 domain/static/xxx 来访问
spring.mvc.static-path-pattern=/static\/**

# 指定静态资源位置
spring.web.resources.static-locations=classpath:/static/

文件上传原理

💡 表单的 enctype 属性规定在传输到服务器之前应如何对数据进行编码

  • enctype=
    • x-www-form-urlencoded
    • form-data
    • json
    • ...

修改文件大小限制
可在 src/main/resources/application.properties文件中添加以下内容

# 设置请求单个文件大小
spring.servlet.multipart.max-file-size=10MB
# 设置单个请求的总文件大小
spring.servlet.multipart.max-request-size=10MB

文件上传代码示例
!enctype=form-data

点击查看代码
@RestController
public class FileUploadController {
    

    // 前端将文件传递给 MultipartFile 类型的参数
    // HttpServletRequest 用于动态获取请求的上下文对象,web服务器
    @PostMapping("/upload")
    public String up(String nickname, MultipartFile photo, HttpServletRequest request)throws IOException {
        System.out.println(nickname);
        // 获取图片的原始名称
        System.out.println(photo.getOriginalFilename());
        // 获取图片的类型
        System.out.println(photo.getContentType());
        // 获取路径
        String path = request.getServletContext().getRealPath("/upload");
        System.out.println(path);
        saveFile(photo, path);
        return "上传成功";
    }

    // 将文件保存在指定路径
    public void saveFile(MultipartFile file, String path) throws IOException {
        // 判断路径是否存在,如果不存在则创建文件夹
        File dir = new File(path);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        // 将文件保存到指定路径
        file.transferTo(new File(path + "/" + file.getOriginalFilename()));
    }
}
![](https://img2024.cnblogs.com/blog/3305166/202404/3305166-20240425234314872-25676044.webp)

拦截器

根据规则拦截请求,例如未登录无法获取信息
参考
spring中的拦截器(HandlerInterceptor+MethodInterceptor)
Spring HandlerInterceptor工作机制

工作原理流程


HandlerInterceptor接口

HandlerInterceptor接口定义了三个方法

  1. preHandle:在请求处理程序执行之前调用。可以用于进行权限验证、日志记录等操作。如果该方法返回false,则请求将被中断,后续的拦截器和处理程序将不会被执行。
  2. postHandle:在请求处理程序执行之后、视图渲染之前调用。可以对请求的结果进行修改或添加额外的模型数据。
  3. afterCompletion:在整个请求完成之后调用,包括视图渲染完毕。可用于进行资源清理等操作。

使用拦截器即继承一个拦截器(HandlerInterceptor),并通过WebMvcConfigurer将其注册

  1. 新建拦截器类 /interceptor/LoginInterceptor.java,重载了preHandle方法
点击查看代码
public class LoginInterceptor implements HandlerInterceptor {
    //
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("LoginInterceptor");
        return true;
    }
}
2. 配置类 `/config/WebConfig.java` 将1中的拦截器进行注册
点击查看代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    // 配置添加拦截器
    // 注明拦截路径 .addPathPatterns("/user/**")
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
    }
}

MyBatis-plus 数据库操作

ORM(对象关系映射)

实现对象和关系型数据库之间的相互转换

实践部分

前期准备

  1. 报错
  • Maven 资源编译器: 模块 'xxxx' 所需的 Maven 项目配置不可用。仅当从 IDE 启动外部构建
    右键 pom文件 选择 添加为Maven项目
  1. 服务器数据库连接
  • 使用宝塔构建会方便很多 > 宝塔安装链接
    • 使用快速安装
    • 安全 防火墙 设置开放 3306 端口
    • 数据库 新建数据库
    • 注意 服务器管理的官网(如阿里云) 安全组也要设置3306端口
  1. 项目构建
  • 依赖添加
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
			<scope>runtime</scope>
		</dependency>
  • 连接信息添加
    application.properties文件
spring.datasource.url=jdbc:mysql://{服务器ip}:3306/{数据库名}?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
spring.datasource.username={数据库用户名}
spring.datasource.password={数据库密码}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8084

# HikariCP settings
spring.datasource.hikari.connection-timeout=30000
logging.level.com.zaxxer.hikari=DEBUG //可打印详细报错信息

相关报错

  1. 使用MyBatis中的动态SQL语句
    报错:元素内容必须由格式正确的字符数据或标记组成。
    相关代码
<script>
...
"SELECT user_id, content, comment_time as time, fruit_id FROM comment WHERE comment_time < #{time} AND fruit_id IN ",
...
</script>

SQL语句中包含了XML特殊字符,如<、>、&等,它们需要被适当地转义:
< 应该写作 &lt;
> 应该写作 &gt;
& 应该写作 &amp;

posted @ 2024-04-26 00:23  F丶cat  阅读(19)  评论(0)    收藏  举报