spring-boot学习记录
学习参考网站
1天搞定SpringBoot+Vue全栈开发-bilibili
准备
项目热部署
视频中的idea版本较老,热部署实现参考IDEA2021 热部署-知乎
修改默认端口
在 src/main/resources/application.properties 文件中添加 server.port=80
相关知识
MVC模式(model-controller-view)

控制器
一个控制器文件例子
@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-urlencodedform-datajson- ...
修改文件大小限制
可在 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()));
}
}
拦截器
根据规则拦截请求,例如未登录无法获取信息
参考
spring中的拦截器(HandlerInterceptor+MethodInterceptor)
Spring HandlerInterceptor工作机制
工作原理流程


HandlerInterceptor接口
HandlerInterceptor接口定义了三个方法
- preHandle:在请求处理程序执行之前调用。可以用于进行权限验证、日志记录等操作。如果该方法返回false,则请求将被中断,后续的拦截器和处理程序将不会被执行。
- postHandle:在请求处理程序执行之后、视图渲染之前调用。可以对请求的结果进行修改或添加额外的模型数据。
- afterCompletion:在整个请求完成之后调用,包括视图渲染完毕。可用于进行资源清理等操作。
使用拦截器即继承一个拦截器(HandlerInterceptor),并通过WebMvcConfigurer将其注册
- 新建拦截器类
/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;
}
}
点击查看代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
// 配置添加拦截器
// 注明拦截路径 .addPathPatterns("/user/**")
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");
}
}
MyBatis-plus 数据库操作
ORM(对象关系映射)
实现对象和关系型数据库之间的相互转换
实践部分
前期准备
- 报错
Maven 资源编译器: 模块 'xxxx' 所需的 Maven 项目配置不可用。仅当从 IDE 启动外部构建
右键pom文件 选择 添加为Maven项目
- 服务器数据库连接
- 使用宝塔构建会方便很多 > 宝塔安装链接
- 使用快速安装

- 安全 防火墙 设置开放 3306 端口
- 数据库 新建数据库
- 注意 服务器管理的官网(如阿里云) 安全组也要设置3306端口
- 使用快速安装
- 项目构建
- 依赖添加
<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 //可打印详细报错信息
相关报错
- 使用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特殊字符,如<、>、&等,它们需要被适当地转义:
< 应该写作 <
> 应该写作 >
& 应该写作 &



浙公网安备 33010602011771号